From 766886bdce662c1a1122d627cf09d07a60bc7bc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Gru=CC=88ndger?= Date: Tue, 16 Apr 2019 20:50:14 +0200 Subject: [PATCH] Added OGN range files --- ogn_python/static/files/WineButton.png | Bin 0 -> 5415 bytes ogn_python/static/files/bootstrap/LICENSE.md | 20 + .../bootstrap.colorpickersliders.css | 144 ++ .../bootstrap/bootstrap.colorpickersliders.js | 1726 +++++++++++++++++ .../bootstrap.colorpickersliders.nocielch.js | 1281 ++++++++++++ .../files/bootstrap/typeahead.bundle.js | 1716 ++++++++++++++++ ogn_python/static/files/heatmap2.js | 960 +++++++++ ogn_python/static/files/maptiles2.js | 289 +++ ogn_python/static/files/mgrs.min.js | 12 + ogn_python/static/files/ol/ol.css | 246 +++ ogn_python/static/files/ol/ol.js | 1073 ++++++++++ ogn_python/static/files/style.css | 129 ++ ogn_python/static/files/tinycolor.js | 935 +++++++++ ogn_python/static/files/url.js.sample | 1 + ogn_python/templates/ognrange.html | 189 ++ 15 files changed, 8721 insertions(+) create mode 100755 ogn_python/static/files/WineButton.png create mode 100755 ogn_python/static/files/bootstrap/LICENSE.md create mode 100755 ogn_python/static/files/bootstrap/bootstrap.colorpickersliders.css create mode 100755 ogn_python/static/files/bootstrap/bootstrap.colorpickersliders.js create mode 100755 ogn_python/static/files/bootstrap/bootstrap.colorpickersliders.nocielch.js create mode 100755 ogn_python/static/files/bootstrap/typeahead.bundle.js create mode 100755 ogn_python/static/files/heatmap2.js create mode 100755 ogn_python/static/files/maptiles2.js create mode 100755 ogn_python/static/files/mgrs.min.js create mode 100755 ogn_python/static/files/ol/ol.css create mode 100755 ogn_python/static/files/ol/ol.js create mode 100755 ogn_python/static/files/style.css create mode 100755 ogn_python/static/files/tinycolor.js create mode 100644 ogn_python/static/files/url.js.sample create mode 100755 ogn_python/templates/ognrange.html diff --git a/ogn_python/static/files/WineButton.png b/ogn_python/static/files/WineButton.png new file mode 100755 index 0000000000000000000000000000000000000000..b9b4934ab5ea537181cb7a9ceca7275e3ee94446 GIT binary patch literal 5415 zcmd^Dc{r49+qYC?ttf4x$r2G`n@nUGYuU2IlkFK}>|%)ZYzJ@3=|eSf^i_s93|cOCa}-{*PXzu$SD*Lj`ibsfij&&k1BQtYsp zfPjFct&N4VfPf&GFYAa3^Y2B2*mC~k5ZclM?Sc$IM?)jw0%rb5Ke(bT0vZT+hC}_Y zUFn4z2?z+If?Yk(9`<%%7!q+B`U`V91`)w$3kVpQ#6&=0p>VXKA3QKP+!(Og(g9Em z_BRH&>)UJFM?l~~!8WmxaF8u(lx>sIU0X0Pwv<`UilWEv)|W#n+4hL1=UYSW7E9I{I|9?rCIXpcc^3&`?WT zM@vUXlaJ6uT?H82Cw^P7fTLiM!4c?SWVqrli%>sg6xtZTkMv(tKt$Nv|J!gl z>YqgMQ>GOIjnD#~*49EGe$DG|Gz#qu|L-vVBO2v;Eds9P3`ZfOB4PaX2srVZ%+KBb z?&ueg9}U8As5P*)Jzab0;*VZ%y!C;zth6Yg0GX_w9P0$$_ zh+k2DaGppV7`rwjhT4{bar-5PfuUJ|72rhqp`hbY-X*y zyPH7R-Xhc3T;3nSF;7Zg-+xq2rBXMxw^?j1lR^72Jy-GS9g##~a2Q|5=1EL4nL=y% z+|OaMzI~rwSXk&C`nHV2*Su-G9Ee~tX)PbW&CD)z{53o=F|o9|HaEZ2+S!e|apz0l zAaP~0s~^i|GkH87c5?bwMm~RApl;Iao#9JMOFTBWrhA0LViSnupSW!fg9fy9TE}m$ z;J5D-zj|5!j>luIt`g=~w>L@DrTMj05@UIJb!mgZqH*b5E_N2TL8eYGtcFEhC)1g8 z%lNsa)u|;yNJ1LK-5WDL$@jWn=WIc7F%G}o`K5P#lbHGH1Czxg(U>G6ZF`$Y*dp*a zYzl+UV=*^3$@zsP>DiB-HFO4|k~%s%gm=kQS68pDt~NC_nVXxdsHlX7hLXu-K|!(f z^z_2Q!ua@jHk<9?;lbr{nM^i|#o_XJR2qZDmpB{-gYTb1r!%=+Hjm4r(daZflR~9a zsdOfjxlN(-(KI@n&fxU)^sKF|arj^c3%^aKvA7&AgTZ1lSsW}DOCr-5Og5RqSR-r` zsf_yftyCIoo64A&nx*gumD$_dyR<>x+NNw1$utI?%H(WQ*`wdai6ok_U*w+&DRdU^ zqNDc`iG&%NF0QO4v00eW#gXr;Mfp#bmNsb=Dw)ExxZw6}Y~qxj@x~VUMoG<$JLz;P z4Yx_s)dp>>5GLjpaBC|xDsgCZJU8dz;?fF-O|NP0Vslw!B8kUkEX*v?*&I5Xx3RIs z;;@-q&hi3b7EfSvC=T9%$(hgSOh!mzHjBZ0+cj`Kr)*)3w7AZ{C>771lBtxIw$``J zAGe9L_L0dIJfo+7cALr^7#So|m`pl@pDHqgM`3a#kEmc5ag+R***pTBmYeq|6n&dt zTJl!xNBjd!0PXDH!dL%44*?gNh%*07*Ri!QbB+12Q5bh!wp;$AW8=XF%L5sg%B+lm zB~@ZJ@YVOvs-Bh5!}h*P77MZL?g6v>qc=}`5zHcY+lp@H0}i~i@?<@KhYUr8*8IqS z|Bf6SYV!WwX7s{F{|2Fd#yir~xv7uCwV|HQ$Npru>vk|W2@RkJf*M%V+W1(Xe$}O_ z#OH)U4XE)RGn1B~R|Rm{uLaYxc#F2?rt{EeFmj19<%Qi_YZ{0J(X{m{Q}n{ zdBzetcysRu-`9SBEUy42+&%WXETC>JOLwUv$)>3F*aE4%hgN!=MYM%(^gg?x_NPsE*(@`C+>qVPc20Z$wNQt)qc1 zy6#anK0Y9Uc%$VHX8mY?XYoLd?+lAD`-FkDu=i1JM#T=Q4MlCE0p;`hD7QOGOU$IZ z8fiOXd%}S4P+#^t4rIbfuhVO4YJ%mM{dSjIV_4&^172=`H%Cn!&2aK<;wrw|c6}K= zKm6iruwl{QqVRL?jf=tx$2@NO;qwcj#U+y`L=p!S*GSZn$K+ zVro7eDDPULmW!~II=B|`w(NX1nEk_WN)clToG85fCZ<2#(H<8Px_3Ht?N=323Nj)+FM;d)mFld|IsaLi)yeq3s8q$dIJpc9X zrP6s1fysyX%bj`8KX(?bvg=KwOYC>H-#;FJhkd#l^hjIR7+ZXSQpj$HYf9fLtt`uT zOmi;Nybd$;`Ic?CVI=gXUR~58N zzLmzCi+`|gl_EV1;)e(AWty9tPvQpf1vA{>cnNfU2SzZdmZ8;mWAKP2j*01p2!Iny z5D{<*4(GsC)7PP~aVwK>vNiVJ7)BLdXGXd3dQf9>7ix5gN40^zuw-BJ{V91fkX=%i95;( zDn+a(A9=lgqb$!j_6o7|tkSbR0zNxScv&`1=|Km>L|-&tD;J}@fx^Tj3iN$V(AJ)6 z{YPGDyXFq62;st`+m@YvDvR8zyP1c0{>XU;_)c!Lr!#q0@^rn_T3M+69jz*(x*Upc zNxytbabJ1y6ZRa#xDkEzYWN1V6hfP+zq$wa_=&+V=2|-2JL<~Ty{;HtiK6F8M$mHR zaOwPx#(5=`l;apT;lwVYj_T(}7HM=+>M>U#C+5dFB|wr@<)Y=u)H$icAE&zCYS8XH zZ}?Y-jFz`pubrt+3`g$I9y?=(TeGaZ5d-Svlm*I9 zSzBkb(XSs7^Lp-iCkEjTy*BIT>^6Uz*w@vA<&)_O z<(4@)%H}>mLTWlvwa9XxS@Hdd>;udwX`cytmJ3{bS3;MlHd-0i@Ry253M^GcuK*z$ zbMWNJuibfq=v|_B_w_g3e(H+x06Zm^EKH*4xt2b`rRyI9)a^kVGaS05>Qw>yu~rjh zrB7B1d(|$wUQ4X_WMx`qT3gCG+mP4(V??Jka85db`aQ&Ex(Gk4HFd=r%~iW;CZdOS zXoQ?k;Ce!z&|94>_yX_QbK{T==@>pW7-r^o{0Znq^0T=K3daUL%Wf_2g z)+syL)mn(@HB8h{mr#iO5ifCXR@*qc-uPmeJt%@V9VMzy@BqMzK8ASQd-j(|*BQ^l zv4%3y*-w6*B8(gSVr zF4bAhd%wVj(kcwDiZd_NLlHobXfS- z&I9#A*0r)pQb#}!2r(bD+dOw*>>cCadzRW-4t19f_1*IeUn^RuxR3N2ZGyoZ6QT^( z!|SMUz=QnSf?>mx=uhkM01r0}zntX9p7(Ixlv31pXy>@VR*{bCf!i5V8cdiVdhcY~ zcJ)JHq0aA4Sc$C12QbTrXI*zS`@%&-oN-^mU4sN;+{eU^g?+qN8VcNqaC`13h?YsW zcRK+QKiG~p{1WnFLiwSVNUZZzL_gG8^HJn>4Tlq|-~oAI(zF)JP|nGx=84D;p3MZi z9s4Pbd(nRQ^K`3!UNT{DzmqJuShKX`!wz(YrW8vU)Vcq8u0a9f@a|1fbg><1-2*WQ@zKTICgAxs zU+#Lg8t2qic82NDOlw6HY5s%U8w_4CThc6gRI%uUOqY>1?t9-$?j&ux%LyZSJubr{C;|}Dsj&}Tz61RvX%J@tZ&pz=czx{StoUWuyK}u# zNpo2BP9KqrwQEsXS^DDamL!o~681t!OYo|vy{Vj4aNT8XsYAFcpybR5g}A=J#On-V zV8>X~R^};gWZ1$_M`k}fu#hq^&^zA}_TH?!^K)@HR!Fg9@sO9=joSQMwOP2LsV4_MJt8K5vjuU zw`F|F?csI8(kXpu+WRGwx9Xp~ZWEk$qB(!Mq?>k1VR1E}civ7XedN7oB6xf1XW}f$ zrTE%POI_<59+h`}?L@~lVzKdsXF0fs-5tUhiKB0>0CEEgc0X)rM8G3_VNvA z^+sN*ieag7`0UsYsPC4qJ~`}8YU%-URK2x&aPqoZk#j212P7M^`8_VLld9L%nFw6E znOdm0T5jN_vnRIkWCBw`p<{Il^d&uR>1m6cH#7Z02XFC+3@;jcVLleKrAeCt_(_1-EKPh~? z#&9J2cx<`>&mMvOjg`(qf57W@Y!win>Dj*b_oR4;J?2Xu>>JwS)eiHWf$h zC?oyoPL+izUG=^uBCUtITTXU*Fyi@AI~XNQU)R-M02fq&1qWSay3vW-T8HW^H635m#54Y)nlH1LaTA}oxcK%`uUbeh@W_59EfiY zaMt;wU`4vq;_0aMXGX}(;okKhr6$9le6O1Ryo?Z&w-7{8Z1nWG@7j7c!5eGF7r^Qd z4bM*%?hQUvkx3xAsASz2V~0yI6PgqES!Okr$GJ%Qp2OFEaP)0^L1Ujc4wR6%n0YR% zP@w!fcvc;wL03vm)(zCbv^ADzM{C;KcaW-MZZEIss~xBJ7bK6CXBWg&gT}6^%kgmJ zhxE3`Mb);gqvathU(*50Glr4xWKLM8VN|W8Bu)~r_3NR5pDw*tBCSt1K=-f7;==H< zxQkcB(0S*WaepfQbUnM-Ry`Ew>pt-?a44>>_eC~n=Rtu;g9MC{g@^aAUzfI)4i>fM He').appendTo('body'); + + container = $('
').appendTo(popover_container); + container.html(_getControllerHtml()); + + switch(settings.size) { + case "sm": + container.addClass("cp-container-sm"); + break; + case "lg": + container.addClass("cp-container-lg"); + break; + } + + _buildComponent(); + + triggerelement.popover({ + html : true, + animation: settings.animation, + trigger: 'manual', + title: settings.title, + placement: settings.placement, + container: popover_container, + content: function() { + return container; + } + }); + + triggerelement.popover('show'); + } + + function hidePopover() { + triggerelement.popover('destroy'); + + // can not use hidden.bs.popover event because it is triggered before animation ends (probably an issue in bs 3.0.3) + setTimeout(function(){ + if (popover_container instanceof jQuery) { + popover_container.remove(); + } + }, 150); + } + + function _getControllerHtml() { + var sliders = [], + color_picker_html = ''; + + if (settings.order.opacity !== false) { + sliders[settings.order.opacity] = '
' + settings.labels.opacity + '
'; + } + + if (settings.order.hsl !== false) { + sliders[settings.order.hsl] = '
' + settings.labels.hslhue + '
' + settings.labels.hslsaturation + '
' + settings.labels.hsllightness + '
'; + } + + if (settings.order.rgb !== false) { + sliders[settings.order.rgb] = '
' + settings.labels.rgbred + '
' + settings.labels.rgbgreen + '
' + settings.labels.rgbblue + '
'; + } + + if (settings.order.cie !== false) { + sliders[settings.order.cie] = '
' + settings.labels.cielightness + '
' + settings.labels.ciechroma + '
' + settings.labels.ciehue + '
'; + } + + if (settings.order.preview !== false) { + sliders[settings.order.preview] = '
'; + } + + color_picker_html += '
'; + + for (var i = 0; i < sliders.length; i++) { + if (typeof sliders[i] === "undefined") { + continue; + } + + color_picker_html += sliders[i]; + } + + color_picker_html += '
'; + + if (settings.swatches) { + color_picker_html += '
    '; + } + + return color_picker_html; + } + + function _initElements() { + elements = { + actualswatch: false, + swatchescontainer: $(".cp-swatches", container), + swatches: $(".cp-swatches ul", container), + swatches_add: $(".cp-swatches button.add", container), + swatches_remove: $(".cp-swatches button.remove", container), + swatches_reset: $(".cp-swatches button.reset", container), + all_sliders: $(".cp-sliders, .cp-preview input", container), + sliders: { + hue: $(".cp-hslhue span", container), + hue_marker: $(".cp-hslhue .cp-marker", container), + saturation: $(".cp-hslsaturation span", container), + saturation_marker: $(".cp-hslsaturation .cp-marker", container), + lightness: $(".cp-hsllightness span", container), + lightness_marker: $(".cp-hsllightness .cp-marker", container), + opacity: $(".cp-opacity span", container), + opacity_marker: $(".cp-opacity .cp-marker", container), + red: $(".cp-rgbred span", container), + red_marker: $(".cp-rgbred .cp-marker", container), + green: $(".cp-rgbgreen span", container), + green_marker: $(".cp-rgbgreen .cp-marker", container), + blue: $(".cp-rgbblue span", container), + blue_marker: $(".cp-rgbblue .cp-marker", container), + cielightness: $(".cp-cielightness span", container), + cielightness_marker: $(".cp-cielightness .cp-marker", container), + ciechroma: $(".cp-ciechroma span", container), + ciechroma_marker: $(".cp-ciechroma .cp-marker", container), + ciehue: $(".cp-ciehue span", container), + ciehue_marker: $(".cp-ciehue .cp-marker", container), + preview: $(".cp-preview input", container) + } + }; + + if (!settings.customswatches) { + elements.swatches_add.hide(); + elements.swatches_remove.hide(); + elements.swatches_reset.hide(); + } + } + + function showFlat() { + if (settings.flat) { + if (triggerelementisinput) { + container = $('
    ').insertAfter(triggerelement); + } + else { + container = $('
    '); + triggerelement.append(container); + } + + container.append(_getControllerHtml()); + + _buildComponent(); + } + } + + function _initConnectedElements() { + if (settings.connectedinput instanceof jQuery) { + settings.connectedinput.add(triggerelement); + } + else if (settings.connectedinput === false) { + settings.connectedinput = triggerelement; + } + else { + settings.connectedinput = $(settings.connectedinput).add(triggerelement); + } + } + + function _bindEvents() { + triggerelement.on('colorpickersliders.updateColor', function(e, newcolor) { + updateColor(newcolor); + }); + + triggerelement.on('colorpickersliders.show', function() { + show(); + }); + + triggerelement.on('colorpickersliders.hide', function() { + hide(); + }); + + if (!settings.flat && settings.trigger === 'focus') { + // we need tabindex defined to be focusable + if (typeof triggerelement.attr("tabindex") === "undefined") { + triggerelement.attr("tabindex", -1); + } + + if (settings.preventtouchkeyboardonshow) { + $(triggerelement).prop("readonly", true); + + $(triggerelement).on("click", function(ev) { + if (visible) { + $(triggerelement).prop("readonly", false); + ev.stopPropagation(); + } + }); + } + + // buttons doesn't get focus in webkit browsers + // https://bugs.webkit.org/show_bug.cgi?id=22261 + // and only input and button are focusable on iPad + // so it is safer to register click on any other than inputs + if (!triggerelementisinput) { + $(triggerelement).on("click", function(ev) { + show(); + + ev.stopPropagation(); + }); + } + + $(triggerelement).on("focus", function(ev) { + show(); + + ev.stopPropagation(); + }); + + $(triggerelement).on("blur", function(ev) { + hide(); + + if (settings.preventtouchkeyboardonshow) { + $(triggerelement).prop("readonly", true); + } + + ev.stopPropagation(); + }); + } + + if (connectedinput) { + connectedinput.on('keyup change', function() { + var $input = $(this); + + updateColor($input.val(), true); + }); + } + + } + + function _bindControllerEvents() { + container.on("contextmenu", function(ev) { + ev.preventDefault(); + return false; + }); + + $(document).on("colorpickersliders.changeswatches", function() { + _renderSwatches(); + }); + + elements.swatches.on("touchstart mousedown click", "li span", function(ev) { + var color = $(this).css("background-color"); + updateColor(color); + //_updateAllElements(); + ev.preventDefault(); + }); + + elements.swatches_add.on("touchstart mousedown click", function(ev) { + _addCurrentColorToSwatches(); + ev.preventDefault(); + ev.stopPropagation(); + }); + + elements.swatches_remove.on("touchstart mousedown click", function(ev) { + _removeActualColorFromSwatches(); + ev.preventDefault(); + ev.stopPropagation(); + }); + + elements.swatches_reset.on("touchstart touchend mousedown click", function(ev) { + // prevent multiple fire on android... + if (ev.type === "click" || ev.type === "touchend") { + _resetSwatches(); + } + ev.preventDefault(); + ev.stopImmediatePropagation(); + }); + + elements.sliders.hue.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "hue"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('hsla', 'h', 3.6 * percent); + + _updateAllElements(); + }); + + elements.sliders.saturation.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "saturation"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('hsla', 's', percent / 100); + + _updateAllElements(); + }); + + elements.sliders.lightness.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "lightness"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('hsla', 'l', percent / 100); + + _updateAllElements(); + }); + + elements.sliders.opacity.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "opacity"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('hsla', 'a', percent / 100); + + _updateAllElements(); + }); + + elements.sliders.red.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "red"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('rgba', 'r', 2.55 * percent); + + _updateAllElements(); + }); + + elements.sliders.green.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "green"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('rgba', 'g', 2.55 * percent); + + _updateAllElements(); + }); + + elements.sliders.blue.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "blue"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('rgba', 'b', 2.55 * percent); + + _updateAllElements(); + }); + + elements.sliders.cielightness.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "cielightness"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('cielch', 'l', (MAXLIGHT / 100) * percent); + + _updateAllElements(); + }); + + elements.sliders.ciechroma.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "ciechroma"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('cielch', 'c', (MAXVALIDCHROMA / 100) * percent); + + _updateAllElements(); + }); + + elements.sliders.ciehue.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "ciehue"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('cielch', 'h', 3.6 * percent); + + _updateAllElements(); + }); + + elements.sliders.preview.on("click", function() { + this.select(); + }); + + $(document).on("touchmove mousemove", function(ev) { + if (!dragTarget) { + return; + } + + var percent = _updateMarkerPosition(dragTarget, ev); + + switch (dragTarget) { + case "hue": + _updateColorsProperty('hsla', 'h', 3.6 * percent); + break; + case "saturation": + _updateColorsProperty('hsla', 's', percent / 100); + break; + case "lightness": + _updateColorsProperty('hsla', 'l', percent / 100); + break; + case "opacity": + _updateColorsProperty('hsla', 'a', percent / 100); + break; + case "red": + _updateColorsProperty('rgba', 'r', 2.55 * percent); + break; + case "green": + _updateColorsProperty('rgba', 'g', 2.55 * percent); + break; + case "blue": + _updateColorsProperty('rgba', 'b', 2.55 * percent); + break; + case "cielightness": + _updateColorsProperty('cielch', 'l', (MAXLIGHT / 100) * percent); + break; + case "ciechroma": + _updateColorsProperty('cielch', 'c', (MAXVALIDCHROMA / 100) * percent); + break; + case "ciehue": + _updateColorsProperty('cielch', 'h', 3.6 * percent); + break; + } + + _updateAllElements(); + + ev.preventDefault(); + }); + + $(document).on("touchend mouseup", function(ev) { + if (ev.which > 1) { + return; + } + + if (dragTarget) { + dragTarget = false; + ev.preventDefault(); + } + }); + + if (!settings.flat) { + popover_container.on("touchstart mousedown", ".popover", function(ev) { + ev.preventDefault(); + ev.stopPropagation(); + + return false; + }); + } + } + + function _parseCustomSwatches() { + swatches = []; + + for (var i = 0; i < settings.swatches.length; i++) { + var color = tinycolor(settings.swatches[i]); + + if (color.format) { + swatches.push(color.toRgbString()); + } + } + } + + function _renderSwatches() { + if (!settings.swatches) { + return; + } + + if (settings.customswatches) { + var customswatches = false; + + try { + customswatches = JSON.parse(localStorage.getItem("swatches-" + settings.customswatches)); + } + catch (err) { + } + + if (customswatches) { + swatches = customswatches; + } + else { + _parseCustomSwatches(); + } + } + else { + _parseCustomSwatches(); + } + + if (swatches instanceof Array) { + elements.swatches.html(""); + for (var i = 0; i < swatches.length; i++) { + var color = tinycolor(swatches[i]); + + if (color.format) { + var span = $('').css("background-color", color.toRgbString()); + var button = $('
    '); + + button.append(span); + + elements.swatches.append($("
  • ").append(button)); + } + } + } + + _findActualColorsSwatch(); + } + + function _findActualColorsSwatch() { + var found = false; + + $("span", elements.swatches).filter(function() { + var swatchcolor = $(this).css('background-color'); + + swatchcolor = tinycolor(swatchcolor); + swatchcolor.alpha = Math.round(swatchcolor.alpha * 100) / 100; + + if (swatchcolor.toRgbString() === color.tiny.toRgbString()) { + found = true; + + var currentswatch = $(this).parent(); + + if (!currentswatch.is(elements.actualswatch)) { + if (elements.actualswatch) { + elements.actualswatch.removeClass("actual"); + } + elements.actualswatch = currentswatch; + currentswatch.addClass("actual"); + } + } + }); + + if (!found) { + if (elements.actualswatch) { + elements.actualswatch.removeClass("actual"); + elements.actualswatch = false; + } + } + + if (elements.actualswatch) { + elements.swatches_add.prop("disabled", true); + elements.swatches_remove.prop("disabled", false); + } + else { + elements.swatches_add.prop("disabled", false); + elements.swatches_remove.prop("disabled", true); + } + } + + function _storeSwatches() { + localStorage.setItem("swatches-" + settings.customswatches, JSON.stringify(swatches)); + } + + function _addCurrentColorToSwatches() { + swatches.unshift(color.tiny.toRgbString()); + _storeSwatches(); + + $(document).trigger("colorpickersliders.changeswatches"); + } + + function _removeActualColorFromSwatches() { + var index = swatches.indexOf(color.tiny.toRgbString()); + + if (index !== -1) { + swatches.splice(index, 1); + + _storeSwatches(); + $(document).trigger("colorpickersliders.changeswatches"); + } + } + + function _resetSwatches() { + if (confirm("Do you really want to reset the swatches? All customizations will be lost!")) { + _parseCustomSwatches(); + + _storeSwatches(); + + $(document).trigger("colorpickersliders.changeswatches"); + } + } + + function _updateColorsProperty(format, property, value) { + switch (format) { + case 'hsla': + + color.hsla[property] = value; + color.tiny = tinycolor({h: color.hsla.h, s: color.hsla.s, l: color.hsla.l, a: color.hsla.a}); + color.rgba = color.tiny.toRgb(); + color.cielch = $.fn.ColorPickerSliders.rgb2lch(color.rgba); + + container.removeClass("cp-unconvertible-cie-color"); + + break; + + case 'rgba': + + color.rgba[property] = value; + color.tiny = tinycolor({r: color.rgba.r, g: color.rgba.g, b: color.rgba.b, a: color.hsla.a}); + color.hsla = color.tiny.toHsl(); + color.cielch = $.fn.ColorPickerSliders.rgb2lch(color.rgba); + + container.removeClass("cp-unconvertible-cie-color"); + + break; + + case 'cielch': + + color.cielch[property] = value; + color.rgba = $.fn.ColorPickerSliders.lch2rgb(color.cielch); + color.tiny = tinycolor(color.rgba); + color.hsla = color.tiny.toHsl(); + + if (settings.erroneousciecolormarkers) { + if (color.rgba.isok) { + container.removeClass("cp-unconvertible-cie-color"); + } + else { + container.addClass("cp-unconvertible-cie-color"); + } + } + + break; + } + } + + function _updateMarkerPosition(slidername, ev) { + var percent = $.fn.ColorPickerSliders.calculateEventPositionPercentage(ev, elements.sliders[slidername]); + + elements.sliders[slidername + '_marker'].data("position", percent); + + return percent; + } + + var updateAllElementsTimeout; + + function _updateAllElementsTimer(disableinputupdate) { + updateAllElementsTimeout = setTimeout(function() { + _updateAllElements(disableinputupdate); + }, settings.updateinterval); + } + + function _updateAllElements(disableinputupdate) { + clearTimeout(updateAllElementsTimeout); + + Date.now = Date.now || function() { return +new Date; }; + + if (Date.now() - lastUpdateTime < settings.updateinterval) { + _updateAllElementsTimer(disableinputupdate); + return; + } + + if (typeof disableinputupdate === "undefined") { + disableinputupdate = false; + } + + lastUpdateTime = Date.now(); + + if (settings.order.opacity !== false) { + _renderOpacity(); + } + + if (settings.order.hsl !== false) { + _renderHue(); + _renderSaturation(); + _renderLightness(); + } + + if (settings.order.rgb !== false) { + _renderRed(); + _renderGreen(); + _renderBlue(); + } + + if (settings.order.cie !== false) { + _renderCieLightness(); + _renderCieChroma(); + _renderCieHue(); + } + + if (settings.order.preview !== false) { + _renderPreview(); + } + + if (!disableinputupdate) { + _updateConnectedInput(); + } + + if ((100 - color.cielch.l) * color.cielch.a < settings.previewcontrasttreshold) { + elements.all_sliders.css('color', '#000'); + } + else { + elements.all_sliders.css('color', '#fff'); + } + + _updateTriggerelementColor(); + _findActualColorsSwatch(); + + settings.onchange(container, color); + + triggerelement.data("color", color); + } + + function _updateTriggerelementColor() { + if (triggerelementisinput && settings.previewontriggerelement) { + if ((100 - color.cielch.l) * color.cielch.a < settings.previewcontrasttreshold) { + triggerelement.css('background', color.tiny.toRgbString()).css('color', '#000'); + } + else { + triggerelement.css('background', color.tiny.toRgbString()).css('color', '#fff'); + } + } + } + + function _updateConnectedInput() { + if (connectedinput) { + connectedinput.each(function(index, element) { + var $element = $(element), + format = $element.data('color-format') || settings.previewformat; + + switch (format) { + case 'hex': + $element.val(color.tiny.toHexString()); + break; + case 'hsl': + $element.val(color.tiny.toHslString()); + break; + case 'rgb': + /* falls through */ + default: + $element.val(color.tiny.toRgbString()); + break; + } + }); + } + } + + function _renderHue() { + setGradient(elements.sliders.hue, $.fn.ColorPickerSliders.getScaledGradientStops(color.hsla, "h", 0, 360, 7)); + + elements.sliders.hue_marker.css("left", color.hsla.h / 360 * 100 + "%"); + } + + function _renderSaturation() { + setGradient(elements.sliders.saturation, $.fn.ColorPickerSliders.getScaledGradientStops(color.hsla, "s", 0, 1, 2)); + + elements.sliders.saturation_marker.css("left", color.hsla.s * 100 + "%"); + } + + function _renderLightness() { + setGradient(elements.sliders.lightness, $.fn.ColorPickerSliders.getScaledGradientStops(color.hsla, "l", 0, 1, 3)); + + elements.sliders.lightness_marker.css("left", color.hsla.l * 100 + "%"); + } + + function _renderOpacity() { + setGradient(elements.sliders.opacity, $.fn.ColorPickerSliders.getScaledGradientStops(color.hsla, "a", 0, 1, 2)); + + elements.sliders.opacity_marker.css("left", color.hsla.a * 100 + "%"); + } + + function _renderRed() { + setGradient(elements.sliders.red, $.fn.ColorPickerSliders.getScaledGradientStops(color.rgba, "r", 0, 255, 2)); + + elements.sliders.red_marker.css("left", color.rgba.r / 255 * 100 + "%"); + } + + function _renderGreen() { + setGradient(elements.sliders.green, $.fn.ColorPickerSliders.getScaledGradientStops(color.rgba, "g", 0, 255, 2)); + + elements.sliders.green_marker.css("left", color.rgba.g / 255 * 100 + "%"); + } + + function _renderBlue() { + setGradient(elements.sliders.blue, $.fn.ColorPickerSliders.getScaledGradientStops(color.rgba, "b", 0, 255, 2)); + + elements.sliders.blue_marker.css("left", color.rgba.b / 255 * 100 + "%"); + } + + function _extendCieGradientStops(gradientstops, property) { + if (settings.invalidcolorsopacity === 1 || !settings.finercierangeedges) { + return gradientstops; + } + + gradientstops.sort(function(a, b) { + return a.position - b.position; + }); + + var tmparray = []; + + for (var i = 1; i < gradientstops.length; i++) { + if (gradientstops[i].isok !== gradientstops[i - 1].isok) { + var steps = Math.round(gradientstops[i].position) - Math.round(gradientstops[i - 1].position), + extendedgradientstops = $.fn.ColorPickerSliders.getScaledGradientStops(gradientstops[i].rawcolor, property, gradientstops[i - 1].rawcolor[property], gradientstops[i].rawcolor[property], steps, settings.invalidcolorsopacity, gradientstops[i - 1].position, gradientstops[i].position); + + for (var j = 0; j < extendedgradientstops.length; j++) { + if (extendedgradientstops[j].isok !== gradientstops[i - 1].isok) { + tmparray.push(extendedgradientstops[j]); + + if (j > 0) { + tmparray.push(extendedgradientstops[j - 1]); + } + + break; + } + } + } + } + + return $.merge(tmparray, gradientstops); + } + + function _renderCieLightness() { + var gradientstops = $.fn.ColorPickerSliders.getScaledGradientStops(color.cielch, "l", 0, 100, 10, settings.invalidcolorsopacity); + + gradientstops = _extendCieGradientStops(gradientstops, "l"); + + setGradient(elements.sliders.cielightness, gradientstops); + + elements.sliders.cielightness_marker.css("left", color.cielch.l / MAXLIGHT * 100 + "%"); + } + + function _renderCieChroma() { + var gradientstops = $.fn.ColorPickerSliders.getScaledGradientStops(color.cielch, "c", 0, MAXVALIDCHROMA, 5, settings.invalidcolorsopacity); + + gradientstops = _extendCieGradientStops(gradientstops, "c"); + + setGradient(elements.sliders.ciechroma, gradientstops); + + elements.sliders.ciechroma_marker.css("left", color.cielch.c / MAXVALIDCHROMA * 100 + "%"); + } + + function _renderCieHue() { + var gradientstops = $.fn.ColorPickerSliders.getScaledGradientStops(color.cielch, "h", 0, 360, 28, settings.invalidcolorsopacity); + + gradientstops = _extendCieGradientStops(gradientstops, "h"); + + setGradient(elements.sliders.ciehue, gradientstops); + + elements.sliders.ciehue_marker.css("left", color.cielch.h / 360 * 100 + "%"); + } + + function _renderPreview() { + elements.sliders.preview.css("background", $.fn.ColorPickerSliders.csscolor(color.rgba)); + + var colorstring; + + switch (settings.previewformat) { + case 'hex': + colorstring = color.tiny.toHexString(); + break; + case 'hsl': + colorstring = color.tiny.toHslString(); + break; + case 'rgb': + /* falls through */ + default: + colorstring = color.tiny.toRgbString(); + break; + } + + elements.sliders.preview.val(colorstring); + } + + function setGradient(element, gradientstops) { + gradientstops.sort(function(a, b) { + return a.position - b.position; + }); + + switch(rendermode) { + case "noprefix": + $.fn.ColorPickerSliders.renderNoprefix(element, gradientstops); + break; + case "webkit": + $.fn.ColorPickerSliders.renderWebkit(element, gradientstops); + break; + case "ms": + $.fn.ColorPickerSliders.renderMs(element, gradientstops); + break; + case "svg": // can not repeat, radial can be only a covering ellipse (maybe there is a workaround, need more investigation) + $.fn.ColorPickerSliders.renderSVG(element, gradientstops); + break; + case "oldwebkit": // can not repeat, no percent size with radial gradient (and no ellipse) + $.fn.ColorPickerSliders.renderOldwebkit(element, gradientstops); + break; + } + }; + + }); + + }; + + $.fn.ColorPickerSliders.getEventCoordinates = function(ev) { + if (typeof ev.pageX !== "undefined") { + return { + pageX: ev.originalEvent.pageX, + pageY: ev.originalEvent.pageY + }; + } + else if (typeof ev.originalEvent.touches !== "undefined") { + return { + pageX: ev.originalEvent.touches[0].pageX, + pageY: ev.originalEvent.touches[0].pageY + }; + } + }; + + $.fn.ColorPickerSliders.calculateEventPositionPercentage = function(ev, containerElement) { + var c = $.fn.ColorPickerSliders.getEventCoordinates(ev); + + var xsize = containerElement.width(), + offsetX = c.pageX - containerElement.offset().left; + + var percent = offsetX / xsize * 100; + + if (percent < 0) { + percent = 0; + } + + if (percent > 100) { + percent = 100; + } + + return percent; + }; + + $.fn.ColorPickerSliders.getScaledGradientStops = function(color, scalableproperty, minvalue, maxvalue, steps, invalidcolorsopacity, minposition, maxposition) { + if (typeof invalidcolorsopacity === "undefined") { + invalidcolorsopacity = 1; + } + + if (typeof minposition === "undefined") { + minposition = 0; + } + + if (typeof maxposition === "undefined") { + maxposition = 100; + } + + var gradientStops = [], + diff = maxvalue - minvalue, + isok = true; + + for (var i = 0; i < steps; ++i) { + var currentstage = i / (steps - 1), + modifiedcolor = $.fn.ColorPickerSliders.modifyColor(color, scalableproperty, currentstage * diff + minvalue), + csscolor; + + if (invalidcolorsopacity < 1) { + var stagergb = $.fn.ColorPickerSliders.lch2rgb(modifiedcolor, invalidcolorsopacity); + + isok = stagergb.isok; + csscolor = $.fn.ColorPickerSliders.csscolor(stagergb, invalidcolorsopacity); + } + else { + csscolor = $.fn.ColorPickerSliders.csscolor(modifiedcolor, invalidcolorsopacity); + } + + gradientStops[i] = { + color: csscolor, + position: currentstage * (maxposition - minposition) + minposition, + isok: isok, + rawcolor: modifiedcolor + }; + } + + return gradientStops; + }; + + $.fn.ColorPickerSliders.getGradientStopsCSSString = function(gradientstops) { + var gradientstring = "", + oldwebkit = "", + svgstoppoints = ""; + + for (var i = 0; i < gradientstops.length; i++) { + var el = gradientstops[i]; + + gradientstring += "," + el.color + " " + el.position + "%"; + oldwebkit += ",color-stop(" + el.position + "%," + el.color + ")"; + + var svgcolor = tinycolor(el.color); + + svgstoppoints += ''; + } + + return { + noprefix: gradientstring, + oldwebkit: oldwebkit, + svg: svgstoppoints + }; + }; + + $.fn.ColorPickerSliders.renderNoprefix = function(element, gradientstops) { + var css = "linear-gradient(to right", + stoppoints = $.fn.ColorPickerSliders.getGradientStopsCSSString(gradientstops).noprefix; + + css += stoppoints + ")"; + + element.css("background-image", css); + }; + + $.fn.ColorPickerSliders.renderWebkit = function(element, gradientstops) { + var css = "-webkit-linear-gradient(left", + stoppoints = $.fn.ColorPickerSliders.getGradientStopsCSSString(gradientstops).noprefix; + + css += stoppoints + ")"; + + element.css("background-image", css); + }; + + $.fn.ColorPickerSliders.renderOldwebkit = function(element, gradientstops) { + var css = "-webkit-gradient(linear, 0% 0%, 100% 0%", + stoppoints = $.fn.ColorPickerSliders.getGradientStopsCSSString(gradientstops).oldwebkit; + + css += stoppoints + ")"; + + element.css("background-image", css); + }; + + $.fn.ColorPickerSliders.renderMs = function(element, gradientstops) { + var css = "-ms-linear-gradient(to right", + stoppoints = $.fn.ColorPickerSliders.getGradientStopsCSSString(gradientstops).noprefix; + + css += stoppoints + ")"; + + element.css("background-image", css); + }; + + $.fn.ColorPickerSliders.renderSVG = function(element, gradientstops) { + var svg = "", + svgstoppoints = $.fn.ColorPickerSliders.getGradientStopsCSSString(gradientstops).svg; + + svg = ''; + svg += svgstoppoints; + svg += ''; + svg = "url(data:image/svg+xml;base64," + $.fn.ColorPickerSliders.base64encode(svg) + ")"; + + element.css("background-image", svg); + }; + + /* source: http://phpjs.org/functions/base64_encode/ */ + $.fn.ColorPickerSliders.base64encode = function(data) { + var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, + ac = 0, + enc = "", + tmp_arr = []; + + if (!data) { + return data; + } + + do { + o1 = data.charCodeAt(i++); + o2 = data.charCodeAt(i++); + o3 = data.charCodeAt(i++); + + bits = o1 << 16 | o2 << 8 | o3; + + h1 = bits >> 18 & 0x3f; + h2 = bits >> 12 & 0x3f; + h3 = bits >> 6 & 0x3f; + h4 = bits & 0x3f; + + tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4); + } while (i < data.length); + + enc = tmp_arr.join(''); + + var r = data.length % 3; + + return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3); + }; + + $.fn.ColorPickerSliders.isGoodRgb = function(rgb) { + // the default acceptable values are out of 0..255 due to + // rounding errors with yellow and blue colors (258, -1) + var maxacceptable = 258; + var minacceptable = -1; + + if (rgb.r > maxacceptable || rgb.g > maxacceptable || rgb.b > maxacceptable || rgb.r < minacceptable || rgb.g < minacceptable || rgb.b < minacceptable) { + return false; + } + else { + rgb.r = Math.min(255, rgb.r); + rgb.g = Math.min(255, rgb.g); + rgb.b = Math.min(255, rgb.b); + rgb.r = Math.max(0, rgb.r); + rgb.g = Math.max(0, rgb.g); + rgb.b = Math.max(0, rgb.b); + + return true; + } + }; + + $.fn.ColorPickerSliders.rgb2lch = function(rgb) { + var lch = $.fn.ColorPickerSliders.CIELab2CIELCH($.fn.ColorPickerSliders.XYZ2CIELab($.fn.ColorPickerSliders.rgb2XYZ(rgb))); + + if (rgb.hasOwnProperty('a')) { + lch.a = rgb.a; + } + + return lch; + }; + + $.fn.ColorPickerSliders.lch2rgb = function(lch, invalidcolorsopacity) { + if (typeof invalidcolorsopacity === "undefined") { + invalidcolorsopacity = 1; + } + + var rgb = $.fn.ColorPickerSliders.XYZ2rgb($.fn.ColorPickerSliders.CIELab2XYZ($.fn.ColorPickerSliders.CIELCH2CIELab(lch))); + + if ($.fn.ColorPickerSliders.isGoodRgb(rgb)) { + if (lch.hasOwnProperty('a')) { + rgb.a = lch.a; + } + + rgb.isok = true; + + return rgb; + } + + var tmp = $.extend({}, lch), + lastbadchroma = tmp.c, + lastgoodchroma = -1, + loops = 0; + + do { + ++loops; + + tmp.c = lastgoodchroma + ((lastbadchroma - lastgoodchroma) / 2); + + rgb = $.fn.ColorPickerSliders.XYZ2rgb($.fn.ColorPickerSliders.CIELab2XYZ($.fn.ColorPickerSliders.CIELCH2CIELab(tmp))); + + if ($.fn.ColorPickerSliders.isGoodRgb(rgb)) { + lastgoodchroma = tmp.c; + } + else { + lastbadchroma = tmp.c; + } + } while (Math.abs(lastbadchroma - lastgoodchroma) > 0.9 && loops < 100); + + if (lch.hasOwnProperty('a')) { + rgb.a = lch.a; + } + + rgb.r = Math.max(0, rgb.r); + rgb.g = Math.max(0, rgb.g); + rgb.b = Math.max(0, rgb.b); + + rgb.r = Math.min(255, rgb.r); + rgb.g = Math.min(255, rgb.g); + rgb.b = Math.min(255, rgb.b); + + if (invalidcolorsopacity < 1) { + if (rgb.hasOwnProperty('a')) { + rgb.a = rgb.a * invalidcolorsopacity; + } + else { + rgb.a = invalidcolorsopacity; + } + } + + rgb.isok = false; + + return rgb; + }; + + $.fn.ColorPickerSliders.modifyColor = function(color, property, value) { + var modifiedcolor = $.extend({}, color); + + if (!color.hasOwnProperty(property)) { + throw("Missing color property: " + property); + } + + modifiedcolor[property] = value; + + return modifiedcolor; + }; + + $.fn.ColorPickerSliders.csscolor = function(color, invalidcolorsopacity) { + if (typeof invalidcolorsopacity === "undefined") { + invalidcolorsopacity = 1; + } + + var $return = false, + tmpcolor = $.extend({}, color); + + if (tmpcolor.hasOwnProperty('c')) { + // CIE-LCh + tmpcolor = $.fn.ColorPickerSliders.lch2rgb(tmpcolor, invalidcolorsopacity); + } + + if (tmpcolor.hasOwnProperty('h')) { + // HSL + $return = "hsla(" + tmpcolor.h + "," + tmpcolor.s * 100 + "%," + tmpcolor.l * 100 + "%," + tmpcolor.a + ")"; + } + + if (tmpcolor.hasOwnProperty('r')) { + // RGB + if (tmpcolor.a < 1) { + $return = "rgba(" + Math.round(tmpcolor.r) + "," + Math.round(tmpcolor.g) + "," + Math.round(tmpcolor.b) + "," + tmpcolor.a + ")"; + } + else { + $return = "rgb(" + Math.round(tmpcolor.r) + "," + Math.round(tmpcolor.g) + "," + Math.round(tmpcolor.b) + ")"; + } + } + + return $return; + }; + + $.fn.ColorPickerSliders.rgb2XYZ = function(rgb) { + var XYZ = {}; + + var r = (rgb.r / 255); + var g = (rgb.g / 255); + var b = (rgb.b / 255); + + if (r > 0.04045) { + r = Math.pow(((r + 0.055) / 1.055), 2.4); + } + else { + r = r / 12.92; + } + + if (g > 0.04045) { + g = Math.pow(((g + 0.055) / 1.055), 2.4); + } + else { + g = g / 12.92; + } + + if (b > 0.04045) { + b = Math.pow(((b + 0.055) / 1.055), 2.4); + } + else { + b = b / 12.92; + } + + r = r * 100; + g = g * 100; + b = b * 100; + + // Observer = 2°, Illuminant = D65 + XYZ.x = r * 0.4124 + g * 0.3576 + b * 0.1805; + XYZ.y = r * 0.2126 + g * 0.7152 + b * 0.0722; + XYZ.z = r * 0.0193 + g * 0.1192 + b * 0.9505; + + return XYZ; + }; + + $.fn.ColorPickerSliders.XYZ2CIELab = function(XYZ) { + var CIELab = {}; + + // Observer = 2°, Illuminant = D65 + var X = XYZ.x / 95.047; + var Y = XYZ.y / 100.000; + var Z = XYZ.z / 108.883; + + if (X > 0.008856) { + X = Math.pow(X, 0.333333333); + } + else { + X = 7.787 * X + 0.137931034; + } + + if (Y > 0.008856) { + Y = Math.pow(Y, 0.333333333); + } + else { + Y = 7.787 * Y + 0.137931034; + } + + if (Z > 0.008856) { + Z = Math.pow(Z, 0.333333333); + } + else { + Z = 7.787 * Z + 0.137931034; + } + + CIELab.l = (116 * Y) - 16; + CIELab.a = 500 * (X - Y); + CIELab.b = 200 * (Y - Z); + + return CIELab; + }; + + $.fn.ColorPickerSliders.CIELab2CIELCH = function(CIELab) { + var CIELCH = {}; + + CIELCH.l = CIELab.l; + CIELCH.c = Math.sqrt(Math.pow(CIELab.a, 2) + Math.pow(CIELab.b, 2)); + + CIELCH.h = Math.atan2(CIELab.b, CIELab.a); //Quadrant by signs + + if (CIELCH.h > 0) { + CIELCH.h = (CIELCH.h / Math.PI) * 180; + } + else { + CIELCH.h = 360 - (Math.abs(CIELCH.h) / Math.PI) * 180; + } + + return CIELCH; + }; + + $.fn.ColorPickerSliders.CIELCH2CIELab = function(CIELCH) { + var CIELab = {}; + + CIELab.l = CIELCH.l; + CIELab.a = Math.cos(CIELCH.h * 0.01745329251) * CIELCH.c; + CIELab.b = Math.sin(CIELCH.h * 0.01745329251) * CIELCH.c; + + return CIELab; + }; + + $.fn.ColorPickerSliders.CIELab2XYZ = function(CIELab) { + var XYZ = {}; + + XYZ.y = (CIELab.l + 16) / 116; + XYZ.x = CIELab.a / 500 + XYZ.y; + XYZ.z = XYZ.y - CIELab.b / 200; + + if (Math.pow(XYZ.y, 3) > 0.008856) { + XYZ.y = Math.pow(XYZ.y, 3); + } + else { + XYZ.y = (XYZ.y - 0.137931034) / 7.787; + } + + if (Math.pow(XYZ.x, 3) > 0.008856) { + XYZ.x = Math.pow(XYZ.x, 3); + } + else { + XYZ.x = (XYZ.x - 0.137931034) / 7.787; + } + + if (Math.pow(XYZ.z, 3) > 0.008856) { + XYZ.z = Math.pow(XYZ.z, 3); + } + else { + XYZ.z = (XYZ.z - 0.137931034) / 7.787; + } + + // Observer = 2°, Illuminant = D65 + XYZ.x = 95.047 * XYZ.x; + XYZ.y = 100.000 * XYZ.y; + XYZ.z = 108.883 * XYZ.z; + + return XYZ; + }; + + $.fn.ColorPickerSliders.XYZ2rgb = function(XYZ) { + var rgb = {}; + + // Observer = 2°, Illuminant = D65 + XYZ.x = XYZ.x / 100; // X from 0 to 95.047 + XYZ.y = XYZ.y / 100; // Y from 0 to 100.000 + XYZ.z = XYZ.z / 100; // Z from 0 to 108.883 + + rgb.r = XYZ.x * 3.2406 + XYZ.y * -1.5372 + XYZ.z * -0.4986; + rgb.g = XYZ.x * -0.9689 + XYZ.y * 1.8758 + XYZ.z * 0.0415; + rgb.b = XYZ.x * 0.0557 + XYZ.y * -0.2040 + XYZ.z * 1.0570; + + if (rgb.r > 0.0031308) { + rgb.r = 1.055 * (Math.pow(rgb.r, 0.41666667)) - 0.055; + } + else { + rgb.r = 12.92 * rgb.r; + } + + if (rgb.g > 0.0031308) { + rgb.g = 1.055 * (Math.pow(rgb.g, 0.41666667)) - 0.055; + } + else { + rgb.g = 12.92 * rgb.g; + } + + if (rgb.b > 0.0031308) { + rgb.b = 1.055 * (Math.pow(rgb.b, 0.41666667)) - 0.055; + } + else { + rgb.b = 12.92 * rgb.b; + } + + rgb.r = Math.round(rgb.r * 255); + rgb.g = Math.round(rgb.g * 255); + rgb.b = Math.round(rgb.b * 255); + + return rgb; + }; + + $.fn.ColorPickerSliders.detectWhichGradientIsSupported = function() { + var testelement = document.createElement('detectGradientSupport').style; + + try { + testelement.backgroundImage = "linear-gradient(to top left, #9f9, white)"; + if (testelement.backgroundImage.indexOf("gradient") !== -1) { + return "noprefix"; + } + + testelement.backgroundImage = "-webkit-linear-gradient(left top, #9f9, white)"; + if (testelement.backgroundImage.indexOf("gradient") !== -1) { + return "webkit"; + } + + testelement.backgroundImage = "-ms-linear-gradient(left top, #9f9, white)"; + if (testelement.backgroundImage.indexOf("gradient") !== -1) { + return "ms"; + } + + testelement.backgroundImage = "-webkit-gradient(linear, left top, right bottom, from(#9f9), to(white))"; + if (testelement.backgroundImage.indexOf("gradient") !== -1) { + return "oldwebkit"; + } + } + catch(err) { + try { + testelement.filter = "progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#000000',GradientType=0)"; + if (testelement.filter.indexOf("DXImageTransform") !== -1) { + return "filter"; + } + } + catch(err) {} + } + + return false; + }; + + $.fn.ColorPickerSliders.svgSupported = function() { + return !! document.createElementNS && !! document.createElementNS('http://www.w3.org/2000/svg','svg').createSVGRect; + }; + +})(jQuery); diff --git a/ogn_python/static/files/bootstrap/bootstrap.colorpickersliders.nocielch.js b/ogn_python/static/files/bootstrap/bootstrap.colorpickersliders.nocielch.js new file mode 100755 index 0000000..829ab1c --- /dev/null +++ b/ogn_python/static/files/bootstrap/bootstrap.colorpickersliders.nocielch.js @@ -0,0 +1,1281 @@ +/*jshint undef: true, unused:true, browser:true */ +/*global jQuery: true, tinycolor: false */ + +/*!========================================================================= + * Bootstrap Color Picker Sliders without CIE Lch support + * v2.1.7 + * + * Stripped CIE Lch support due to smaller code base and better performance. + * + * https://github.com/istvan-ujjmeszaros/bootstrap-colorpickersliders + * http://virtuosoft.eu/code/bootstrap-colorpickersliders/ + * + * Copyright 2013 István Ujj-Mészáros + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Requirements: + * + * TinyColor: https://github.com/bgrins/TinyColor + * + * Using color math algorithms from EasyRGB Web site: + * http://www.easyrgb.com/index.php?X=MATH + * ====================================================================== */ + +(function($) { + "use strict"; + + $.fn.ColorPickerSliders = function(options) { + + return this.each(function() { + + var alreadyinitialized = false, + settings, + triggerelement = $(this), + triggerelementisinput = triggerelement.is("input"), + container, + popover_container, + elements, + connectedinput = false, + swatches, + rendermode = false, + visible = false, + dragTarget = false, + lastUpdateTime = 0, + color = { + tiny: null, + hsla: null, + rgba: null + }; + + init(); + + function _initSettings() { + if (typeof options === "undefined") { + options = {}; + } + + settings = $.extend({ + color: 'hsl(342, 52%, 70%)', + size: 'default', // sm | default | lg + animation: true, + placement: 'auto', + trigger: 'focus', // focus | manual + preventtouchkeyboardonshow: true, + title: '', + swatches: ['FFFFFF', 'C0C0C0', '808080', '000000', 'FF0000', '800000', 'FFFF00', '808000', '00FF00', '008000', '00FFFF', '008080', '0000FF', '000080', 'FF00FF', '800080'], // array or false to disable swatches + customswatches: 'colorpickkersliders', // false or a grop name + connectedinput: false, // can be a jquery object or a selector + flat: false, + updateinterval: 30, // update interval of the sliders while in drag (ms) + previewontriggerelement: true, + previewcontrasttreshold: 30, + previewformat: 'rgb', // rgb | hsl | hex + titleswatchesadd: "Add color to swatches", + titleswatchesremove: "Remove color from swatches", + titleswatchesreset: "Reset to default swatches", + order: {}, + labels: {}, + onchange: function() { + } + }, options); + + if (options.hasOwnProperty('order')) { + settings.order = $.extend({ + opacity: false, + hsl: false, + rgb: false, + preview: false + }, options.order); + } + else { + settings.order = { + opacity: 0, + hsl: 1, + rgb: 2, + preview: 3 + }; + } + + if (!options.hasOwnProperty('labels')) { + options.labels = {}; + } + + settings.labels = $.extend({ + hslhue: 'HSL-Hue', + hslsaturation: 'HSL-Saturation', + hsllightness: 'HSL-Lightness', + rgbred: 'RGB-Red', + rgbgreen: 'RGB-Green', + rgbblue: 'RGB-Blue', + opacity: 'Opacity', + preview: 'Preview' + }, options.labels); + } + + function init() { + if (alreadyinitialized) { + return; + } + + alreadyinitialized = true; + + rendermode = $.fn.ColorPickerSliders.detectWhichGradientIsSupported(); + + if (rendermode === "filter") { + rendermode = false; + } + + if (!rendermode && $.fn.ColorPickerSliders.svgSupported()) { + rendermode = "svg"; + } + + _initSettings(); + + // force preview when browser doesn't support css gradients + if ((!settings.order.hasOwnProperty('preview') || settings.order.preview === false) && !rendermode) { + settings.order.preview = 10; + } + + _initConnectedElements(); + _initColor(); + _initConnectedinput(); + _updateTriggerelementColor(); + _updateConnectedInput(); + + if (settings.flat) { + showFlat(); + } + + _bindEvents(); + } + + function _buildComponent() { + _initElements(); + _renderSwatches(); + _updateAllElements(); + _bindControllerEvents(); + } + + function _initColor() { + if (triggerelementisinput) { + color.tiny = tinycolor(triggerelement.val()); + + if (!color.tiny.format) { + color.tiny = tinycolor(settings.color); + } + } + else { + color.tiny = tinycolor(settings.color); + } + + color.hsla = color.tiny.toHsl(); + color.rgba = color.tiny.toRgb(); + } + + function _initConnectedinput() { + if (settings.connectedinput) { + if (settings.connectedinput instanceof jQuery) { + connectedinput = settings.connectedinput; + } + else { + connectedinput = $(settings.connectedinput); + } + } + } + + function updateColor(newcolor, disableinputupdate) { + var updatedcolor = tinycolor(newcolor); + + if (updatedcolor.format) { + color.tiny = updatedcolor; + color.hsla = updatedcolor.toHsl(); + color.rgba = updatedcolor.toRgb(); + + if (settings.flat || visible) { + container.removeClass("cp-unconvertible-cie-color"); + _updateAllElements(disableinputupdate); + } + else { + if (!disableinputupdate) { + _updateConnectedInput(); + } + _updateTriggerelementColor(); + } + + return true; + } + else { + return false; + } + } + + function show() { + if (visible) { + return; + } + + showPopover(); + + setTimeout(function(){ + visible = true; + },200); + } + + function hide() { + visible = false; + hidePopover(); + } + + function showPopover() { + popover_container = $('
    ').appendTo('body'); + + container = $('
    ').appendTo(popover_container); + container.html(_getControllerHtml()); + + switch(settings.size) { + case "sm": + container.addClass("cp-container-sm"); + break; + case "lg": + container.addClass("cp-container-lg"); + break; + } + + _buildComponent(); + + triggerelement.popover({ + html : true, + animation: settings.animation, + trigger: 'manual', + title: settings.title, + placement: settings.placement, + container: popover_container, + content: function() { + return container; + } + }); + + triggerelement.popover('show'); + } + + function hidePopover() { + triggerelement.popover('destroy'); + + // can not use hidden.bs.popover event because it is triggered before animation ends (probably an issue in bs 3.0.3) + setTimeout(function(){ + if (popover_container instanceof jQuery) { + popover_container.remove(); + } + }, 150); + } + + function _getControllerHtml() { + var sliders = [], + color_picker_html = ''; + + if (settings.order.opacity !== false) { + sliders[settings.order.opacity] = '
    ' + settings.labels.opacity + '
    '; + } + + if (settings.order.hsl !== false) { + sliders[settings.order.hsl] = '
    ' + settings.labels.hslhue + '
    ' + settings.labels.hslsaturation + '
    ' + settings.labels.hsllightness + '
    '; + } + + if (settings.order.rgb !== false) { + sliders[settings.order.rgb] = '
    ' + settings.labels.rgbred + '
    ' + settings.labels.rgbgreen + '
    ' + settings.labels.rgbblue + '
    '; + } + + if (settings.order.preview !== false) { + sliders[settings.order.preview] = '
    '; + } + + color_picker_html += '
    '; + + for (var i = 0; i < sliders.length; i++) { + if (typeof sliders[i] === "undefined") { + continue; + } + + color_picker_html += sliders[i]; + } + + color_picker_html += '
    '; + + if (settings.swatches) { + color_picker_html += '
      '; + } + + return color_picker_html; + } + + function _initElements() { + elements = { + actualswatch: false, + swatchescontainer: $(".cp-swatches", container), + swatches: $(".cp-swatches ul", container), + swatches_add: $(".cp-swatches button.add", container), + swatches_remove: $(".cp-swatches button.remove", container), + swatches_reset: $(".cp-swatches button.reset", container), + all_sliders: $(".cp-sliders, .cp-preview input", container), + sliders: { + hue: $(".cp-hslhue span", container), + hue_marker: $(".cp-hslhue .cp-marker", container), + saturation: $(".cp-hslsaturation span", container), + saturation_marker: $(".cp-hslsaturation .cp-marker", container), + lightness: $(".cp-hsllightness span", container), + lightness_marker: $(".cp-hsllightness .cp-marker", container), + opacity: $(".cp-opacity span", container), + opacity_marker: $(".cp-opacity .cp-marker", container), + red: $(".cp-rgbred span", container), + red_marker: $(".cp-rgbred .cp-marker", container), + green: $(".cp-rgbgreen span", container), + green_marker: $(".cp-rgbgreen .cp-marker", container), + blue: $(".cp-rgbblue span", container), + blue_marker: $(".cp-rgbblue .cp-marker", container), + preview: $(".cp-preview input", container) + } + }; + + if (!settings.customswatches) { + elements.swatches_add.hide(); + elements.swatches_remove.hide(); + elements.swatches_reset.hide(); + } + } + + function showFlat() { + if (settings.flat) { + if (triggerelementisinput) { + container = $('
      ').insertAfter(triggerelement); + } + else { + container = $('
      '); + triggerelement.append(container); + } + + container.append(_getControllerHtml()); + + _buildComponent(); + } + } + + function _initConnectedElements() { + if (settings.connectedinput instanceof jQuery) { + settings.connectedinput.add(triggerelement); + } + else if (settings.connectedinput === false) { + settings.connectedinput = triggerelement; + } + else { + settings.connectedinput = $(settings.connectedinput).add(triggerelement); + } + } + + function _bindEvents() { + triggerelement.on('colorpickersliders.updateColor', function(e, newcolor) { + updateColor(newcolor); + }); + + triggerelement.on('colorpickersliders.show', function() { + show(); + }); + + triggerelement.on('colorpickersliders.hide', function() { + hide(); + }); + + if (!settings.flat && settings.trigger === 'focus') { + // we need tabindex defined to be focusable + if (typeof triggerelement.attr("tabindex") === "undefined") { + triggerelement.attr("tabindex", -1); + } + + if (settings.preventtouchkeyboardonshow) { + $(triggerelement).prop("readonly", true); + + $(triggerelement).on("click", function(ev) { + if (visible) { + $(triggerelement).prop("readonly", false); + ev.stopPropagation(); + } + }); + } + + // buttons doesn't get focus in webkit browsers + // https://bugs.webkit.org/show_bug.cgi?id=22261 + // and only input and button are focusable on iPad + // so it is safer to register click on any other than inputs + if (!triggerelementisinput) { + $(triggerelement).on("click", function(ev) { + show(); + + ev.stopPropagation(); + }); + } + + $(triggerelement).on("focus", function(ev) { + show(); + + ev.stopPropagation(); + }); + + $(triggerelement).on("blur", function(ev) { + hide(); + + if (settings.preventtouchkeyboardonshow) { + $(triggerelement).prop("readonly", true); + } + + ev.stopPropagation(); + }); + } + + if (connectedinput) { + connectedinput.on('keyup change', function() { + var $input = $(this); + + updateColor($input.val(), true); + }); + } + + } + + function _bindControllerEvents() { + container.on("contextmenu", function(ev) { + ev.preventDefault(); + return false; + }); + + $(document).on("colorpickersliders.changeswatches", function() { + _renderSwatches(); + }); + + elements.swatches.on("touchstart mousedown click", "li span", function(ev) { + var color = $(this).css("background-color"); + updateColor(color); + ev.preventDefault(); + }); + + elements.swatches_add.on("touchstart mousedown click", function(ev) { + _addCurrentColorToSwatches(); + ev.preventDefault(); + ev.stopPropagation(); + }); + + elements.swatches_remove.on("touchstart mousedown click", function(ev) { + _removeActualColorFromSwatches(); + ev.preventDefault(); + ev.stopPropagation(); + }); + + elements.swatches_reset.on("touchstart touchend mousedown click", function(ev) { + // prevent multiple fire on android... + if (ev.type === "click" || ev.type === "touchend") { + _resetSwatches(); + } + ev.preventDefault(); + ev.stopImmediatePropagation(); + }); + + elements.sliders.hue.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "hue"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('hsla', 'h', 3.6 * percent); + + _updateAllElements(); + }); + + elements.sliders.saturation.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "saturation"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('hsla', 's', percent / 100); + + _updateAllElements(); + }); + + elements.sliders.lightness.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "lightness"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('hsla', 'l', percent / 100); + + _updateAllElements(); + }); + + elements.sliders.opacity.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "opacity"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('hsla', 'a', percent / 100); + + _updateAllElements(); + }); + + elements.sliders.red.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "red"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('rgba', 'r', 2.55 * percent); + + _updateAllElements(); + }); + + elements.sliders.green.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "green"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('rgba', 'g', 2.55 * percent); + + _updateAllElements(); + }); + + elements.sliders.blue.parent().on("touchstart mousedown", function(ev) { + ev.preventDefault(); + + if (ev.which > 1) { + return; + } + + dragTarget = "blue"; + + var percent = _updateMarkerPosition(dragTarget, ev); + + _updateColorsProperty('rgba', 'b', 2.55 * percent); + + _updateAllElements(); + }); + + elements.sliders.preview.on("click", function() { + this.select(); + }); + + $(document).on("touchmove mousemove", function(ev) { + if (!dragTarget) { + return; + } + + var percent = _updateMarkerPosition(dragTarget, ev); + + switch (dragTarget) { + case "hue": + _updateColorsProperty('hsla', 'h', 3.6 * percent); + break; + case "saturation": + _updateColorsProperty('hsla', 's', percent / 100); + break; + case "lightness": + _updateColorsProperty('hsla', 'l', percent / 100); + break; + case "opacity": + _updateColorsProperty('hsla', 'a', percent / 100); + break; + case "red": + _updateColorsProperty('rgba', 'r', 2.55 * percent); + break; + case "green": + _updateColorsProperty('rgba', 'g', 2.55 * percent); + break; + case "blue": + _updateColorsProperty('rgba', 'b', 2.55 * percent); + break; + } + + _updateAllElements(); + + ev.preventDefault(); + }); + + $(document).on("touchend mouseup", function(ev) { + if (ev.which > 1) { + return; + } + + if (dragTarget) { + dragTarget = false; + ev.preventDefault(); + } + }); + + if (!settings.flat) { + popover_container.on("touchstart mousedown", ".popover", function(ev) { + ev.preventDefault(); + ev.stopPropagation(); + + return false; + }); + } + } + + function _parseCustomSwatches() { + swatches = []; + + for (var i = 0; i < settings.swatches.length; i++) { + var color = tinycolor(settings.swatches[i]); + + if (color.format) { + swatches.push(color.toRgbString()); + } + } + } + + function _renderSwatches() { + if (!settings.swatches) { + return; + } + + if (settings.customswatches) { + var customswatches = false; + + try { + customswatches = JSON.parse(localStorage.getItem("swatches-" + settings.customswatches)); + } + catch (err) { + } + + if (customswatches) { + swatches = customswatches; + } + else { + _parseCustomSwatches(); + } + } + else { + _parseCustomSwatches(); + } + + if (swatches instanceof Array) { + elements.swatches.html(""); + for (var i = 0; i < swatches.length; i++) { + var color = tinycolor(swatches[i]); + + if (color.format) { + var span = $('').css("background-color", color.toRgbString()); + var button = $('
      '); + + button.append(span); + + elements.swatches.append($("
    • ").append(button)); + } + } + } + + _findActualColorsSwatch(); + } + + function _findActualColorsSwatch() { + var found = false; + + $("span", elements.swatches).filter(function() { + var swatchcolor = $(this).css('background-color'); + + swatchcolor = tinycolor(swatchcolor); + swatchcolor.alpha = Math.round(swatchcolor.alpha * 100) / 100; + + if (swatchcolor.toRgbString() === color.tiny.toRgbString()) { + found = true; + + var currentswatch = $(this).parent(); + + if (!currentswatch.is(elements.actualswatch)) { + if (elements.actualswatch) { + elements.actualswatch.removeClass("actual"); + } + elements.actualswatch = currentswatch; + currentswatch.addClass("actual"); + } + } + }); + + if (!found) { + if (elements.actualswatch) { + elements.actualswatch.removeClass("actual"); + elements.actualswatch = false; + } + } + + if (elements.actualswatch) { + elements.swatches_add.prop("disabled", true); + elements.swatches_remove.prop("disabled", false); + } + else { + elements.swatches_add.prop("disabled", false); + elements.swatches_remove.prop("disabled", true); + } + } + + function _storeSwatches() { + localStorage.setItem("swatches-" + settings.customswatches, JSON.stringify(swatches)); + } + + function _addCurrentColorToSwatches() { + swatches.unshift(color.tiny.toRgbString()); + _storeSwatches(); + + $(document).trigger("colorpickersliders.changeswatches"); + } + + function _removeActualColorFromSwatches() { + var index = swatches.indexOf(color.tiny.toRgbString()); + + if (index !== -1) { + swatches.splice(index, 1); + + _storeSwatches(); + $(document).trigger("colorpickersliders.changeswatches"); + } + } + + function _resetSwatches() { + if (confirm("Do you really want to reset the swatches? All customizations will be lost!")) { + _parseCustomSwatches(); + + _storeSwatches(); + + $(document).trigger("colorpickersliders.changeswatches"); + } + } + + function _updateColorsProperty(format, property, value) { + switch (format) { + case 'hsla': + + color.hsla[property] = value; + color.tiny = tinycolor({h: color.hsla.h, s: color.hsla.s, l: color.hsla.l, a: color.hsla.a}); + color.rgba = color.tiny.toRgb(); + + container.removeClass("cp-unconvertible-cie-color"); + + break; + + case 'rgba': + + color.rgba[property] = value; + color.tiny = tinycolor({r: color.rgba.r, g: color.rgba.g, b: color.rgba.b, a: color.hsla.a}); + color.hsla = color.tiny.toHsl(); + + container.removeClass("cp-unconvertible-cie-color"); + + break; + + } + } + + function _updateMarkerPosition(slidername, ev) { + var percent = $.fn.ColorPickerSliders.calculateEventPositionPercentage(ev, elements.sliders[slidername]); + + elements.sliders[slidername + '_marker'].data("position", percent); + + return percent; + } + + var updateAllElementsTimeout; + + function _updateAllElementsTimer(disableinputupdate) { + updateAllElementsTimeout = setTimeout(function() { + _updateAllElements(disableinputupdate); + }, settings.updateinterval); + } + + function _updateAllElements(disableinputupdate) { + clearTimeout(updateAllElementsTimeout); + + Date.now = Date.now || function() { return +new Date; }; + + if (Date.now() - lastUpdateTime < settings.updateinterval) { + _updateAllElementsTimer(disableinputupdate); + return; + } + + if (typeof disableinputupdate === "undefined") { + disableinputupdate = false; + } + + lastUpdateTime = Date.now(); + + if (settings.order.opacity !== false) { + _renderOpacity(); + } + + if (settings.order.hsl !== false) { + _renderHue(); + _renderSaturation(); + _renderLightness(); + } + + if (settings.order.rgb !== false) { + _renderRed(); + _renderGreen(); + _renderBlue(); + } + + if (settings.order.preview !== false) { + _renderPreview(); + } + + if (!disableinputupdate) { + _updateConnectedInput(); + } + + if ((100 - color.hsla.l * 100) * color.hsla.a < settings.previewcontrasttreshold) { + elements.all_sliders.css('color', '#000'); + } + else { + elements.all_sliders.css('color', '#fff'); + } + + _updateTriggerelementColor(); + _findActualColorsSwatch(); + + settings.onchange(container, color); + + triggerelement.data("color", color); + } + + function _updateTriggerelementColor() { + if (triggerelementisinput && settings.previewontriggerelement) { + if ((100 - color.hsla.l * 100) * color.hsla.a < settings.previewcontrasttreshold) { + triggerelement.css('background', color.tiny.toRgbString()).css('color', '#000'); + } + else { + triggerelement.css('background', color.tiny.toRgbString()).css('color', '#fff'); + } + } + } + + function _updateConnectedInput() { + if (connectedinput) { + connectedinput.each(function(index, element) { + var $element = $(element), + format = $element.data('color-format') || settings.previewformat; + + switch (format) { + case 'hex': + $element.val(color.tiny.toHexString()); + break; + case 'hsl': + $element.val(color.tiny.toHslString()); + break; + case 'rgb': + /* falls through */ + default: + $element.val(color.tiny.toRgbString()); + break; + } + }); + } + } + + function _renderHue() { + setGradient(elements.sliders.hue, $.fn.ColorPickerSliders.getScaledGradientStops(color.hsla, "h", 0, 360, 7)); + + elements.sliders.hue_marker.css("left", color.hsla.h / 360 * 100 + "%"); + } + + function _renderSaturation() { + setGradient(elements.sliders.saturation, $.fn.ColorPickerSliders.getScaledGradientStops(color.hsla, "s", 0, 1, 2)); + + elements.sliders.saturation_marker.css("left", color.hsla.s * 100 + "%"); + } + + function _renderLightness() { + setGradient(elements.sliders.lightness, $.fn.ColorPickerSliders.getScaledGradientStops(color.hsla, "l", 0, 1, 3)); + + elements.sliders.lightness_marker.css("left", color.hsla.l * 100 + "%"); + } + + function _renderOpacity() { + setGradient(elements.sliders.opacity, $.fn.ColorPickerSliders.getScaledGradientStops(color.hsla, "a", 0, 1, 2)); + + elements.sliders.opacity_marker.css("left", color.hsla.a * 100 + "%"); + } + + function _renderRed() { + setGradient(elements.sliders.red, $.fn.ColorPickerSliders.getScaledGradientStops(color.rgba, "r", 0, 255, 2)); + + elements.sliders.red_marker.css("left", color.rgba.r / 255 * 100 + "%"); + } + + function _renderGreen() { + setGradient(elements.sliders.green, $.fn.ColorPickerSliders.getScaledGradientStops(color.rgba, "g", 0, 255, 2)); + + elements.sliders.green_marker.css("left", color.rgba.g / 255 * 100 + "%"); + } + + function _renderBlue() { + setGradient(elements.sliders.blue, $.fn.ColorPickerSliders.getScaledGradientStops(color.rgba, "b", 0, 255, 2)); + + elements.sliders.blue_marker.css("left", color.rgba.b / 255 * 100 + "%"); + } + + function _renderPreview() { + elements.sliders.preview.css("background", $.fn.ColorPickerSliders.csscolor(color.rgba)); + + var colorstring; + + switch (settings.previewformat) { + case 'hex': + colorstring = color.tiny.toHexString(); + break; + case 'hsl': + colorstring = color.tiny.toHslString(); + break; + case 'rgb': + /* falls through */ + default: + colorstring = color.tiny.toRgbString(); + break; + } + + elements.sliders.preview.val(colorstring); + } + + function setGradient(element, gradientstops) { + gradientstops.sort(function(a, b) { + return a.position - b.position; + }); + + switch(rendermode) { + case "noprefix": + $.fn.ColorPickerSliders.renderNoprefix(element, gradientstops); + break; + case "webkit": + $.fn.ColorPickerSliders.renderWebkit(element, gradientstops); + break; + case "ms": + $.fn.ColorPickerSliders.renderMs(element, gradientstops); + break; + case "svg": // can not repeat, radial can be only a covering ellipse (maybe there is a workaround, need more investigation) + $.fn.ColorPickerSliders.renderSVG(element, gradientstops); + break; + case "oldwebkit": // can not repeat, no percent size with radial gradient (and no ellipse) + $.fn.ColorPickerSliders.renderOldwebkit(element, gradientstops); + break; + } + }; + + }); + + }; + + $.fn.ColorPickerSliders.getEventCoordinates = function(ev) { + if (typeof ev.pageX !== "undefined") { + return { + pageX: ev.originalEvent.pageX, + pageY: ev.originalEvent.pageY + }; + } + else if (typeof ev.originalEvent.touches !== "undefined") { + return { + pageX: ev.originalEvent.touches[0].pageX, + pageY: ev.originalEvent.touches[0].pageY + }; + } + }; + + $.fn.ColorPickerSliders.calculateEventPositionPercentage = function(ev, containerElement) { + var c = $.fn.ColorPickerSliders.getEventCoordinates(ev); + + var xsize = containerElement.width(), + offsetX = c.pageX - containerElement.offset().left; + + var percent = offsetX / xsize * 100; + + if (percent < 0) { + percent = 0; + } + + if (percent > 100) { + percent = 100; + } + + return percent; + }; + + $.fn.ColorPickerSliders.getScaledGradientStops = function(color, scalableproperty, minvalue, maxvalue, steps, invalidcolorsopacity, minposition, maxposition) { + if (typeof invalidcolorsopacity === "undefined") { + invalidcolorsopacity = 1; + } + + if (typeof minposition === "undefined") { + minposition = 0; + } + + if (typeof maxposition === "undefined") { + maxposition = 100; + } + + var gradientStops = [], + diff = maxvalue - minvalue, + isok = true; + + for (var i = 0; i < steps; ++i) { + var currentstage = i / (steps - 1), + modifiedcolor = $.fn.ColorPickerSliders.modifyColor(color, scalableproperty, currentstage * diff + minvalue), + csscolor; + + if (invalidcolorsopacity < 1) { + var stagergb = $.fn.ColorPickerSliders.lch2rgb(modifiedcolor, invalidcolorsopacity); + + isok = stagergb.isok; + csscolor = $.fn.ColorPickerSliders.csscolor(stagergb, invalidcolorsopacity); + } + else { + csscolor = $.fn.ColorPickerSliders.csscolor(modifiedcolor, invalidcolorsopacity); + } + + gradientStops[i] = { + color: csscolor, + position: currentstage * (maxposition - minposition) + minposition, + isok: isok, + rawcolor: modifiedcolor + }; + } + + return gradientStops; + }; + + $.fn.ColorPickerSliders.getGradientStopsCSSString = function(gradientstops) { + var gradientstring = "", + oldwebkit = "", + svgstoppoints = ""; + + for (var i = 0; i < gradientstops.length; i++) { + var el = gradientstops[i]; + + gradientstring += "," + el.color + " " + el.position + "%"; + oldwebkit += ",color-stop(" + el.position + "%," + el.color + ")"; + + var svgcolor = tinycolor(el.color); + + svgstoppoints += ''; + } + + return { + noprefix: gradientstring, + oldwebkit: oldwebkit, + svg: svgstoppoints + }; + }; + + $.fn.ColorPickerSliders.renderNoprefix = function(element, gradientstops) { + var css = "linear-gradient(to right", + stoppoints = $.fn.ColorPickerSliders.getGradientStopsCSSString(gradientstops).noprefix; + + css += stoppoints + ")"; + + element.css("background-image", css); + }; + + $.fn.ColorPickerSliders.renderWebkit = function(element, gradientstops) { + var css = "-webkit-linear-gradient(left", + stoppoints = $.fn.ColorPickerSliders.getGradientStopsCSSString(gradientstops).noprefix; + + css += stoppoints + ")"; + + element.css("background-image", css); + }; + + $.fn.ColorPickerSliders.renderOldwebkit = function(element, gradientstops) { + var css = "-webkit-gradient(linear, 0% 0%, 100% 0%", + stoppoints = $.fn.ColorPickerSliders.getGradientStopsCSSString(gradientstops).oldwebkit; + + css += stoppoints + ")"; + + element.css("background-image", css); + }; + + $.fn.ColorPickerSliders.renderMs = function(element, gradientstops) { + var css = "-ms-linear-gradient(to right", + stoppoints = $.fn.ColorPickerSliders.getGradientStopsCSSString(gradientstops).noprefix; + + css += stoppoints + ")"; + + element.css("background-image", css); + }; + + $.fn.ColorPickerSliders.renderSVG = function(element, gradientstops) { + var svg = "", + svgstoppoints = $.fn.ColorPickerSliders.getGradientStopsCSSString(gradientstops).svg; + + svg = ''; + svg += svgstoppoints; + svg += ''; + svg = "url(data:image/svg+xml;base64," + $.fn.ColorPickerSliders.base64encode(svg) + ")"; + + element.css("background-image", svg); + }; + + /* source: http://phpjs.org/functions/base64_encode/ */ + $.fn.ColorPickerSliders.base64encode = function(data) { + var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, + ac = 0, + enc = "", + tmp_arr = []; + + if (!data) { + return data; + } + + do { + o1 = data.charCodeAt(i++); + o2 = data.charCodeAt(i++); + o3 = data.charCodeAt(i++); + + bits = o1 << 16 | o2 << 8 | o3; + + h1 = bits >> 18 & 0x3f; + h2 = bits >> 12 & 0x3f; + h3 = bits >> 6 & 0x3f; + h4 = bits & 0x3f; + + tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4); + } while (i < data.length); + + enc = tmp_arr.join(''); + + var r = data.length % 3; + + return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3); + }; + + $.fn.ColorPickerSliders.modifyColor = function(color, property, value) { + var modifiedcolor = $.extend({}, color); + + if (!color.hasOwnProperty(property)) { + throw("Missing color property: " + property); + } + + modifiedcolor[property] = value; + + return modifiedcolor; + }; + + $.fn.ColorPickerSliders.csscolor = function(color, invalidcolorsopacity) { + if (typeof invalidcolorsopacity === "undefined") { + invalidcolorsopacity = 1; + } + + var $return = false, + tmpcolor = $.extend({}, color); + + if (tmpcolor.hasOwnProperty('c')) { + // CIE-LCh + tmpcolor = $.fn.ColorPickerSliders.lch2rgb(tmpcolor, invalidcolorsopacity); + } + + if (tmpcolor.hasOwnProperty('h')) { + // HSL + $return = "hsla(" + tmpcolor.h + "," + tmpcolor.s * 100 + "%," + tmpcolor.l * 100 + "%," + tmpcolor.a + ")"; + } + + if (tmpcolor.hasOwnProperty('r')) { + // RGB + if (tmpcolor.a < 1) { + $return = "rgba(" + Math.round(tmpcolor.r) + "," + Math.round(tmpcolor.g) + "," + Math.round(tmpcolor.b) + "," + tmpcolor.a + ")"; + } + else { + $return = "rgb(" + Math.round(tmpcolor.r) + "," + Math.round(tmpcolor.g) + "," + Math.round(tmpcolor.b) + ")"; + } + } + + return $return; + }; + + $.fn.ColorPickerSliders.detectWhichGradientIsSupported = function() { + var testelement = document.createElement('detectGradientSupport').style; + + try { + testelement.backgroundImage = "linear-gradient(to top left, #9f9, white)"; + if (testelement.backgroundImage.indexOf("gradient") !== -1) { + return "noprefix"; + } + + testelement.backgroundImage = "-webkit-linear-gradient(left top, #9f9, white)"; + if (testelement.backgroundImage.indexOf("gradient") !== -1) { + return "webkit"; + } + + testelement.backgroundImage = "-ms-linear-gradient(left top, #9f9, white)"; + if (testelement.backgroundImage.indexOf("gradient") !== -1) { + return "ms"; + } + + testelement.backgroundImage = "-webkit-gradient(linear, left top, right bottom, from(#9f9), to(white))"; + if (testelement.backgroundImage.indexOf("gradient") !== -1) { + return "oldwebkit"; + } + } + catch(err) { + try { + testelement.filter = "progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#000000',GradientType=0)"; + if (testelement.filter.indexOf("DXImageTransform") !== -1) { + return "filter"; + } + } + catch(err) {} + } + + return false; + }; + + $.fn.ColorPickerSliders.svgSupported = function() { + return !! document.createElementNS && !! document.createElementNS('http://www.w3.org/2000/svg','svg').createSVGRect; + }; + +})(jQuery); diff --git a/ogn_python/static/files/bootstrap/typeahead.bundle.js b/ogn_python/static/files/bootstrap/typeahead.bundle.js new file mode 100755 index 0000000..1963150 --- /dev/null +++ b/ogn_python/static/files/bootstrap/typeahead.bundle.js @@ -0,0 +1,1716 @@ +/*! + * typeahead.js 0.10.2 + * https://github.com/twitter/typeahead.js + * Copyright 2013-2014 Twitter, Inc. and other contributors; Licensed MIT + */ + +(function($) { + var _ = { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + getUniqueId: function() { + var counter = 0; + return function() { + return counter++; + }; + }(), + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + noop: function() {} + }; + var VERSION = "0.10.2"; + var tokenizers = function(root) { + return { + nonword: nonword, + whitespace: whitespace, + obj: { + nonword: getObjTokenizer(nonword), + whitespace: getObjTokenizer(whitespace) + } + }; + function whitespace(s) { + return s.split(/\s+/); + } + function nonword(s) { + return s.split(/\W+/); + } + function getObjTokenizer(tokenizer) { + return function setKey(key) { + return function tokenize(o) { + return tokenizer(o[key]); + }; + }; + } + }(); + var LruCache = function() { + function LruCache(maxSize) { + this.maxSize = maxSize || 100; + this.size = 0; + this.hash = {}; + this.list = new List(); + } + _.mixin(LruCache.prototype, { + set: function set(key, val) { + var tailItem = this.list.tail, node; + if (this.size >= this.maxSize) { + this.list.remove(tailItem); + delete this.hash[tailItem.key]; + } + if (node = this.hash[key]) { + node.val = val; + this.list.moveToFront(node); + } else { + node = new Node(key, val); + this.list.add(node); + this.hash[key] = node; + this.size++; + } + }, + get: function get(key) { + var node = this.hash[key]; + if (node) { + this.list.moveToFront(node); + return node.val; + } + } + }); + function List() { + this.head = this.tail = null; + } + _.mixin(List.prototype, { + add: function add(node) { + if (this.head) { + node.next = this.head; + this.head.prev = node; + } + this.head = node; + this.tail = this.tail || node; + }, + remove: function remove(node) { + node.prev ? node.prev.next = node.next : this.head = node.next; + node.next ? node.next.prev = node.prev : this.tail = node.prev; + }, + moveToFront: function(node) { + this.remove(node); + this.add(node); + } + }); + function Node(key, val) { + this.key = key; + this.val = val; + this.prev = this.next = null; + } + return LruCache; + }(); + var PersistentStorage = function() { + var ls, methods; + try { + ls = window.localStorage; + ls.setItem("~~~", "!"); + ls.removeItem("~~~"); + } catch (err) { + ls = null; + } + function PersistentStorage(namespace) { + this.prefix = [ "__", namespace, "__" ].join(""); + this.ttlKey = "__ttl__"; + this.keyMatcher = new RegExp("^" + this.prefix); + } + if (ls && window.JSON) { + methods = { + _prefix: function(key) { + return this.prefix + key; + }, + _ttlKey: function(key) { + return this._prefix(key) + this.ttlKey; + }, + get: function(key) { + if (this.isExpired(key)) { + this.remove(key); + } + return decode(ls.getItem(this._prefix(key))); + }, + set: function(key, val, ttl) { + if (_.isNumber(ttl)) { + ls.setItem(this._ttlKey(key), encode(now() + ttl)); + } else { + ls.removeItem(this._ttlKey(key)); + } + return ls.setItem(this._prefix(key), encode(val)); + }, + remove: function(key) { + ls.removeItem(this._ttlKey(key)); + ls.removeItem(this._prefix(key)); + return this; + }, + clear: function() { + var i, key, keys = [], len = ls.length; + for (i = 0; i < len; i++) { + if ((key = ls.key(i)).match(this.keyMatcher)) { + keys.push(key.replace(this.keyMatcher, "")); + } + } + for (i = keys.length; i--; ) { + this.remove(keys[i]); + } + return this; + }, + isExpired: function(key) { + var ttl = decode(ls.getItem(this._ttlKey(key))); + return _.isNumber(ttl) && now() > ttl ? true : false; + } + }; + } else { + methods = { + get: _.noop, + set: _.noop, + remove: _.noop, + clear: _.noop, + isExpired: _.noop + }; + } + _.mixin(PersistentStorage.prototype, methods); + return PersistentStorage; + function now() { + return new Date().getTime(); + } + function encode(val) { + return JSON.stringify(_.isUndefined(val) ? null : val); + } + function decode(val) { + return JSON.parse(val); + } + }(); + var Transport = function() { + var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6, requestCache = new LruCache(10); + function Transport(o) { + o = o || {}; + this._send = o.transport ? callbackToDeferred(o.transport) : $.ajax; + this._get = o.rateLimiter ? o.rateLimiter(this._get) : this._get; + } + Transport.setMaxPendingRequests = function setMaxPendingRequests(num) { + maxPendingRequests = num; + }; + Transport.resetCache = function clearCache() { + requestCache = new LruCache(10); + }; + _.mixin(Transport.prototype, { + _get: function(url, o, cb) { + var that = this, jqXhr; + if (jqXhr = pendingRequests[url]) { + jqXhr.done(done).fail(fail); + } else if (pendingRequestsCount < maxPendingRequests) { + pendingRequestsCount++; + pendingRequests[url] = this._send(url, o).done(done).fail(fail).always(always); + } else { + this.onDeckRequestArgs = [].slice.call(arguments, 0); + } + function done(resp) { + cb && cb(null, resp); + requestCache.set(url, resp); + } + function fail() { + cb && cb(true); + } + function always() { + pendingRequestsCount--; + delete pendingRequests[url]; + if (that.onDeckRequestArgs) { + that._get.apply(that, that.onDeckRequestArgs); + that.onDeckRequestArgs = null; + } + } + }, + get: function(url, o, cb) { + var resp; + if (_.isFunction(o)) { + cb = o; + o = {}; + } + if (resp = requestCache.get(url)) { + _.defer(function() { + cb && cb(null, resp); + }); + } else { + this._get(url, o, cb); + } + return !!resp; + } + }); + return Transport; + function callbackToDeferred(fn) { + return function customSendWrapper(url, o) { + var deferred = $.Deferred(); + fn(url, o, onSuccess, onError); + return deferred; + function onSuccess(resp) { + _.defer(function() { + deferred.resolve(resp); + }); + } + function onError(err) { + _.defer(function() { + deferred.reject(err); + }); + } + }; + } + }(); + var SearchIndex = function() { + function SearchIndex(o) { + o = o || {}; + if (!o.datumTokenizer || !o.queryTokenizer) { + $.error("datumTokenizer and queryTokenizer are both required"); + } + this.datumTokenizer = o.datumTokenizer; + this.queryTokenizer = o.queryTokenizer; + this.reset(); + } + _.mixin(SearchIndex.prototype, { + bootstrap: function bootstrap(o) { + this.datums = o.datums; + this.trie = o.trie; + }, + add: function(data) { + var that = this; + data = _.isArray(data) ? data : [ data ]; + _.each(data, function(datum) { + var id, tokens; + id = that.datums.push(datum) - 1; + tokens = normalizeTokens(that.datumTokenizer(datum)); + _.each(tokens, function(token) { + var node, chars, ch; + node = that.trie; + chars = token.split(""); + while (ch = chars.shift()) { + node = node.children[ch] || (node.children[ch] = newNode()); + node.ids.push(id); + } + }); + }); + }, + get: function get(query) { + var that = this, tokens, matches; + tokens = normalizeTokens(this.queryTokenizer(query)); + _.each(tokens, function(token) { + var node, chars, ch, ids; + if (matches && matches.length === 0) { + return false; + } + node = that.trie; + chars = token.split(""); + while (node && (ch = chars.shift())) { + node = node.children[ch]; + } + if (node && chars.length === 0) { + ids = node.ids.slice(0); + matches = matches ? getIntersection(matches, ids) : ids; + } else { + matches = []; + return false; + } + }); + return matches ? _.map(unique(matches), function(id) { + return that.datums[id]; + }) : []; + }, + reset: function reset() { + this.datums = []; + this.trie = newNode(); + }, + serialize: function serialize() { + return { + datums: this.datums, + trie: this.trie + }; + } + }); + return SearchIndex; + function normalizeTokens(tokens) { + tokens = _.filter(tokens, function(token) { + return !!token; + }); + tokens = _.map(tokens, function(token) { + return token.toLowerCase(); + }); + return tokens; + } + function newNode() { + return { + ids: [], + children: {} + }; + } + function unique(array) { + var seen = {}, uniques = []; + for (var i = 0; i < array.length; i++) { + if (!seen[array[i]]) { + seen[array[i]] = true; + uniques.push(array[i]); + } + } + return uniques; + } + function getIntersection(arrayA, arrayB) { + var ai = 0, bi = 0, intersection = []; + arrayA = arrayA.sort(compare); + arrayB = arrayB.sort(compare); + while (ai < arrayA.length && bi < arrayB.length) { + if (arrayA[ai] < arrayB[bi]) { + ai++; + } else if (arrayA[ai] > arrayB[bi]) { + bi++; + } else { + intersection.push(arrayA[ai]); + ai++; + bi++; + } + } + return intersection; + function compare(a, b) { + return a - b; + } + } + }(); + var oParser = function() { + return { + local: getLocal, + prefetch: getPrefetch, + remote: getRemote + }; + function getLocal(o) { + return o.local || null; + } + function getPrefetch(o) { + var prefetch, defaults; + defaults = { + url: null, + thumbprint: "", + ttl: 24 * 60 * 60 * 1e3, + filter: null, + ajax: {} + }; + if (prefetch = o.prefetch || null) { + prefetch = _.isString(prefetch) ? { + url: prefetch + } : prefetch; + prefetch = _.mixin(defaults, prefetch); + prefetch.thumbprint = VERSION + prefetch.thumbprint; + prefetch.ajax.type = prefetch.ajax.type || "GET"; + prefetch.ajax.dataType = prefetch.ajax.dataType || "json"; + !prefetch.url && $.error("prefetch requires url to be set"); + } + return prefetch; + } + function getRemote(o) { + var remote, defaults; + defaults = { + url: null, + wildcard: "%QUERY", + replace: null, + rateLimitBy: "debounce", + rateLimitWait: 300, + send: null, + filter: null, + ajax: {} + }; + if (remote = o.remote || null) { + remote = _.isString(remote) ? { + url: remote + } : remote; + remote = _.mixin(defaults, remote); + remote.rateLimiter = /^throttle$/i.test(remote.rateLimitBy) ? byThrottle(remote.rateLimitWait) : byDebounce(remote.rateLimitWait); + remote.ajax.type = remote.ajax.type || "GET"; + remote.ajax.dataType = remote.ajax.dataType || "json"; + delete remote.rateLimitBy; + delete remote.rateLimitWait; + !remote.url && $.error("remote requires url to be set"); + } + return remote; + function byDebounce(wait) { + return function(fn) { + return _.debounce(fn, wait); + }; + } + function byThrottle(wait) { + return function(fn) { + return _.throttle(fn, wait); + }; + } + } + }(); + (function(root) { + var old, keys; + old = root.Bloodhound; + keys = { + data: "data", + protocol: "protocol", + thumbprint: "thumbprint" + }; + root.Bloodhound = Bloodhound; + function Bloodhound(o) { + if (!o || !o.local && !o.prefetch && !o.remote) { + $.error("one of local, prefetch, or remote is required"); + } + this.limit = o.limit || 5; + this.sorter = getSorter(o.sorter); + this.dupDetector = o.dupDetector || ignoreDuplicates; + this.local = oParser.local(o); + this.prefetch = oParser.prefetch(o); + this.remote = oParser.remote(o); + this.cacheKey = this.prefetch ? this.prefetch.cacheKey || this.prefetch.url : null; + this.index = new SearchIndex({ + datumTokenizer: o.datumTokenizer, + queryTokenizer: o.queryTokenizer + }); + this.storage = this.cacheKey ? new PersistentStorage(this.cacheKey) : null; + } + Bloodhound.noConflict = function noConflict() { + root.Bloodhound = old; + return Bloodhound; + }; + Bloodhound.tokenizers = tokenizers; + _.mixin(Bloodhound.prototype, { + _loadPrefetch: function loadPrefetch(o) { + var that = this, serialized, deferred; + if (serialized = this._readFromStorage(o.thumbprint)) { + this.index.bootstrap(serialized); + deferred = $.Deferred().resolve(); + } else { + deferred = $.ajax(o.url, o.ajax).done(handlePrefetchResponse); + } + return deferred; + function handlePrefetchResponse(resp) { + that.clear(); + that.add(o.filter ? o.filter(resp) : resp); + that._saveToStorage(that.index.serialize(), o.thumbprint, o.ttl); + } + }, + _getFromRemote: function getFromRemote(query, cb) { + var that = this, url, uriEncodedQuery; + query = query || ""; + uriEncodedQuery = encodeURIComponent(query); + url = this.remote.replace ? this.remote.replace(this.remote.url, query) : this.remote.url.replace(this.remote.wildcard, uriEncodedQuery); + return this.transport.get(url, this.remote.ajax, handleRemoteResponse); + function handleRemoteResponse(err, resp) { + err ? cb([]) : cb(that.remote.filter ? that.remote.filter(resp) : resp); + } + }, + _saveToStorage: function saveToStorage(data, thumbprint, ttl) { + if (this.storage) { + this.storage.set(keys.data, data, ttl); + this.storage.set(keys.protocol, location.protocol, ttl); + this.storage.set(keys.thumbprint, thumbprint, ttl); + } + }, + _readFromStorage: function readFromStorage(thumbprint) { + var stored = {}, isExpired; + if (this.storage) { + stored.data = this.storage.get(keys.data); + stored.protocol = this.storage.get(keys.protocol); + stored.thumbprint = this.storage.get(keys.thumbprint); + } + isExpired = stored.thumbprint !== thumbprint || stored.protocol !== location.protocol; + return stored.data && !isExpired ? stored.data : null; + }, + _initialize: function initialize() { + var that = this, local = this.local, deferred; + deferred = this.prefetch ? this._loadPrefetch(this.prefetch) : $.Deferred().resolve(); + local && deferred.done(addLocalToIndex); + this.transport = this.remote ? new Transport(this.remote) : null; + return this.initPromise = deferred.promise(); + function addLocalToIndex() { + that.add(_.isFunction(local) ? local() : local); + } + }, + initialize: function initialize(force) { + return !this.initPromise || force ? this._initialize() : this.initPromise; + }, + add: function add(data) { + this.index.add(data); + }, + get: function get(query, cb) { + var that = this, matches = [], cacheHit = false; + matches = this.index.get(query); + matches = this.sorter(matches).slice(0, this.limit); + if (matches.length < this.limit && this.transport) { + cacheHit = this._getFromRemote(query, returnRemoteMatches); + } + if (!cacheHit) { + (matches.length > 0 || !this.transport) && cb && cb(matches); + } + function returnRemoteMatches(remoteMatches) { + var matchesWithBackfill = matches.slice(0); + _.each(remoteMatches, function(remoteMatch) { + var isDuplicate; + isDuplicate = _.some(matchesWithBackfill, function(match) { + return that.dupDetector(remoteMatch, match); + }); + !isDuplicate && matchesWithBackfill.push(remoteMatch); + return matchesWithBackfill.length < that.limit; + }); + cb && cb(that.sorter(matchesWithBackfill)); + } + }, + clear: function clear() { + this.index.reset(); + }, + clearPrefetchCache: function clearPrefetchCache() { + this.storage && this.storage.clear(); + }, + clearRemoteCache: function clearRemoteCache() { + this.transport && Transport.resetCache(); + }, + ttAdapter: function ttAdapter() { + return _.bind(this.get, this); + } + }); + return Bloodhound; + function getSorter(sortFn) { + return _.isFunction(sortFn) ? sort : noSort; + function sort(array) { + return array.sort(sortFn); + } + function noSort(array) { + return array; + } + } + function ignoreDuplicates() { + return false; + } + })(this); + var html = { + wrapper: '', + dropdown: '', + dataset: '
      ', + suggestions: '', + suggestion: '
      ' + }; + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + dropdown: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + suggestions: { + display: "block" + }, + suggestion: { + whiteSpace: "nowrap", + cursor: "pointer" + }, + suggestionChild: { + whiteSpace: "normal" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + if (_.isMsie() && _.isMsie() <= 7) { + _.mixin(css.input, { + marginTop: "-1px" + }); + } + var EventBus = function() { + var namespace = "typeahead:"; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + trigger: function(type) { + var args = [].slice.call(arguments, 1); + this.$el.trigger(namespace + type, args); + } + }); + return EventBus; + }(); + var EventEmitter = function() { + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0; !cancelled && i < callbacks.length; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function getRegex(patterns, caseSensitive, wordsOnly) { + var escapedPatterns = [], regexStr; + for (var i = 0; i < patterns.length; i++) { + escapedPatterns.push(_.escapeRegExChars(patterns[i])); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o) { + var that = this, onBlur, onFocus, onKeydown, onInput; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$hint = $(o.hint); + this.$input = $(o.input).on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + if (!_.isMsie()) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + this.query = this.$input.val(); + this.$overflowHelper = buildOverflowHelper(this.$input); + } + Input.normalizeQuery = function(str) { + return (str || "").replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._checkInputValue(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault, hintValue, inputValue; + switch (keyName) { + case "tab": + hintValue = this.getHint(); + inputValue = this.getInputValue(); + preventDefault = hintValue && hintValue !== inputValue && !withModifier($e); + break; + + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkInputValue: function checkInputValue() { + var inputValue, areEquivalent, hasDifferentWhitespace; + inputValue = this.getInputValue(); + areEquivalent = areQueriesEquivalent(inputValue, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== inputValue.length : false; + if (!areEquivalent) { + this.trigger("queryChanged", this.query = inputValue); + } else if (hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getQuery: function getQuery() { + return this.query; + }, + setQuery: function setQuery(query) { + this.query = query; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value, silent) { + this.$input.val(value); + silent ? this.clearHint() : this._checkInputValue(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query, true); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + getLanguageDirection: function getLanguageDirection() { + return (this.$input.css("direction") || "ltr").toLowerCase(); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$hint = this.$input = this.$overflowHelper = null; + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + var datasetKey = "ttDataset", valueKey = "ttValue", datumKey = "ttDatum"; + function Dataset(o) { + o = o || {}; + o.templates = o.templates || {}; + if (!o.source) { + $.error("missing source"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + this.query = null; + this.highlight = !!o.highlight; + this.name = o.name || _.getUniqueId(); + this.source = o.source; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.$el = $(html.dataset.replace("%CLASS%", this.name)); + } + Dataset.extractDatasetName = function extractDatasetName(el) { + return $(el).data(datasetKey); + }; + Dataset.extractValue = function extractDatum(el) { + return $(el).data(valueKey); + }; + Dataset.extractDatum = function extractDatum(el) { + return $(el).data(datumKey); + }; + _.mixin(Dataset.prototype, EventEmitter, { + _render: function render(query, suggestions) { + if (!this.$el) { + return; + } + var that = this, hasSuggestions; + this.$el.empty(); + hasSuggestions = suggestions && suggestions.length; + if (!hasSuggestions && this.templates.empty) { + this.$el.html(getEmptyHtml()).prepend(that.templates.header ? getHeaderHtml() : null).append(that.templates.footer ? getFooterHtml() : null); + } else if (hasSuggestions) { + this.$el.html(getSuggestionsHtml()).prepend(that.templates.header ? getHeaderHtml() : null).append(that.templates.footer ? getFooterHtml() : null); + } + this.trigger("rendered"); + function getEmptyHtml() { + return that.templates.empty({ + query: query, + isEmpty: true + }); + } + function getSuggestionsHtml() { + var $suggestions, nodes; + $suggestions = $(html.suggestions).css(css.suggestions); + nodes = _.map(suggestions, getSuggestionNode); + $suggestions.append.apply($suggestions, nodes); + that.highlight && highlight({ + node: $suggestions[0], + pattern: query + }); + return $suggestions; + function getSuggestionNode(suggestion) { + var $el; + $el = $(html.suggestion).append(that.templates.suggestion(suggestion)).data(datasetKey, that.name).data(valueKey, that.displayFn(suggestion)).data(datumKey, suggestion); + $el.children().each(function() { + $(this).css(css.suggestionChild); + }); + return $el; + } + } + function getHeaderHtml() { + return that.templates.header({ + query: query, + isEmpty: !hasSuggestions + }); + } + function getFooterHtml() { + return that.templates.footer({ + query: query, + isEmpty: !hasSuggestions + }); + } + }, + getRoot: function getRoot() { + return this.$el; + }, + update: function update(query) { + var that = this; + this.query = query; + this.canceled = false; + this.source(query, render); + function render(suggestions) { + if (!that.canceled && query === that.query) { + that._render(query, suggestions); + } + } + }, + cancel: function cancel() { + this.canceled = true; + }, + clear: function clear() { + this.cancel(); + this.$el.empty(); + this.trigger("rendered"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = null; + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || "value"; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + empty: templates.empty && _.templatify(templates.empty), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion || suggestionTemplate + }; + function suggestionTemplate(context) { + return "

      " + displayFn(context) + "

      "; + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Dropdown = function() { + function Dropdown(o) { + var that = this, onSuggestionClick, onSuggestionMouseEnter, onSuggestionMouseLeave; + o = o || {}; + if (!o.menu) { + $.error("menu is required"); + } + this.isOpen = false; + this.isEmpty = true; + this.datasets = _.map(o.datasets, initializeDataset); + onSuggestionClick = _.bind(this._onSuggestionClick, this); + onSuggestionMouseEnter = _.bind(this._onSuggestionMouseEnter, this); + onSuggestionMouseLeave = _.bind(this._onSuggestionMouseLeave, this); + this.$menu = $(o.menu).on("click.tt", ".tt-suggestion", onSuggestionClick).on("mouseenter.tt", ".tt-suggestion", onSuggestionMouseEnter).on("mouseleave.tt", ".tt-suggestion", onSuggestionMouseLeave); + _.each(this.datasets, function(dataset) { + that.$menu.append(dataset.getRoot()); + dataset.onSync("rendered", that._onRendered, that); + }); + } + _.mixin(Dropdown.prototype, EventEmitter, { + _onSuggestionClick: function onSuggestionClick($e) { + this.trigger("suggestionClicked", $($e.currentTarget)); + }, + _onSuggestionMouseEnter: function onSuggestionMouseEnter($e) { + this._removeCursor(); + this._setCursor($($e.currentTarget), true); + }, + _onSuggestionMouseLeave: function onSuggestionMouseLeave() { + this._removeCursor(); + }, + _onRendered: function onRendered() { + this.isEmpty = _.every(this.datasets, isDatasetEmpty); + this.isEmpty ? this._hide() : this.isOpen && this._show(); + this.trigger("datasetRendered"); + function isDatasetEmpty(dataset) { + return dataset.isEmpty(); + } + }, + _hide: function() { + this.$menu.hide(); + }, + _show: function() { + this.$menu.css("display", "block"); + }, + _getSuggestions: function getSuggestions() { + return this.$menu.find(".tt-suggestion"); + }, + _getCursor: function getCursor() { + return this.$menu.find(".tt-cursor").first(); + }, + _setCursor: function setCursor($el, silent) { + $el.first().addClass("tt-cursor"); + !silent && this.trigger("cursorMoved"); + }, + _removeCursor: function removeCursor() { + this._getCursor().removeClass("tt-cursor"); + }, + _moveCursor: function moveCursor(increment) { + var $suggestions, $oldCursor, newCursorIndex, $newCursor; + if (!this.isOpen) { + return; + } + $oldCursor = this._getCursor(); + $suggestions = this._getSuggestions(); + this._removeCursor(); + newCursorIndex = $suggestions.index($oldCursor) + increment; + newCursorIndex = (newCursorIndex + 1) % ($suggestions.length + 1) - 1; + if (newCursorIndex === -1) { + this.trigger("cursorRemoved"); + return; + } else if (newCursorIndex < -1) { + newCursorIndex = $suggestions.length - 1; + } + this._setCursor($newCursor = $suggestions.eq(newCursorIndex)); + this._ensureVisible($newCursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, menuScrollTop, menuHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + menuScrollTop = this.$menu.scrollTop(); + menuHeight = this.$menu.height() + parseInt(this.$menu.css("paddingTop"), 10) + parseInt(this.$menu.css("paddingBottom"), 10); + if (elTop < 0) { + this.$menu.scrollTop(menuScrollTop + elTop); + } else if (menuHeight < elBottom) { + this.$menu.scrollTop(menuScrollTop + (elBottom - menuHeight)); + } + }, + close: function close() { + if (this.isOpen) { + this.isOpen = false; + this._removeCursor(); + this._hide(); + this.trigger("closed"); + } + }, + open: function open() { + if (!this.isOpen) { + this.isOpen = true; + !this.isEmpty && this._show(); + this.trigger("opened"); + } + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$menu.css(dir === "ltr" ? css.ltr : css.rtl); + }, + moveCursorUp: function moveCursorUp() { + this._moveCursor(-1); + }, + moveCursorDown: function moveCursorDown() { + this._moveCursor(+1); + }, + getDatumForSuggestion: function getDatumForSuggestion($el) { + var datum = null; + if ($el.length) { + datum = { + raw: Dataset.extractDatum($el), + value: Dataset.extractValue($el), + datasetName: Dataset.extractDatasetName($el) + }; + } + return datum; + }, + getDatumForCursor: function getDatumForCursor() { + return this.getDatumForSuggestion(this._getCursor().first()); + }, + getDatumForTopSuggestion: function getDatumForTopSuggestion() { + return this.getDatumForSuggestion(this._getSuggestions().first()); + }, + update: function update(query) { + _.each(this.datasets, updateDataset); + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.isEmpty = true; + function clearDataset(dataset) { + dataset.clear(); + } + }, + isVisible: function isVisible() { + return this.isOpen && !this.isEmpty; + }, + destroy: function destroy() { + this.$menu.off(".tt"); + this.$menu = null; + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Dropdown; + function initializeDataset(oDataset) { + return new Dataset(oDataset); + } + }(); + var Typeahead = function() { + var attrsKey = "ttAttrs"; + function Typeahead(o) { + var $menu, $input, $hint; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + this.isActivated = false; + this.autoselect = !!o.autoselect; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.$node = buildDomStructure(o.input, o.withHint); + $menu = this.$node.find(".tt-dropdown-menu"); + $input = this.$node.find(".tt-input"); + $hint = this.$node.find(".tt-hint"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + this.eventBus = o.eventBus || new EventBus({ + el: $input + }); + this.dropdown = new Dropdown({ + menu: $menu, + datasets: o.datasets + }).onSync("suggestionClicked", this._onSuggestionClicked, this).onSync("cursorMoved", this._onCursorMoved, this).onSync("cursorRemoved", this._onCursorRemoved, this).onSync("opened", this._onOpened, this).onSync("closed", this._onClosed, this).onAsync("datasetRendered", this._onDatasetRendered, this); + this.input = new Input({ + input: $input, + hint: $hint + }).onSync("focused", this._onFocused, this).onSync("blurred", this._onBlurred, this).onSync("enterKeyed", this._onEnterKeyed, this).onSync("tabKeyed", this._onTabKeyed, this).onSync("escKeyed", this._onEscKeyed, this).onSync("upKeyed", this._onUpKeyed, this).onSync("downKeyed", this._onDownKeyed, this).onSync("leftKeyed", this._onLeftKeyed, this).onSync("rightKeyed", this._onRightKeyed, this).onSync("queryChanged", this._onQueryChanged, this).onSync("whitespaceChanged", this._onWhitespaceChanged, this); + this._setLanguageDirection(); + } + _.mixin(Typeahead.prototype, { + _onSuggestionClicked: function onSuggestionClicked(type, $el) { + var datum; + if (datum = this.dropdown.getDatumForSuggestion($el)) { + this._select(datum); + } + }, + _onCursorMoved: function onCursorMoved() { + var datum = this.dropdown.getDatumForCursor(); + this.input.setInputValue(datum.value, true); + this.eventBus.trigger("cursorchanged", datum.raw, datum.datasetName); + }, + _onCursorRemoved: function onCursorRemoved() { + this.input.resetInputValue(); + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered() { + this._updateHint(); + }, + _onOpened: function onOpened() { + this._updateHint(); + this.eventBus.trigger("opened"); + }, + _onClosed: function onClosed() { + this.input.clearHint(); + this.eventBus.trigger("closed"); + }, + _onFocused: function onFocused() { + this.isActivated = true; + this.dropdown.open(); + }, + _onBlurred: function onBlurred() { + this.isActivated = false; + this.dropdown.empty(); + this.dropdown.close(); + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var cursorDatum, topSuggestionDatum; + cursorDatum = this.dropdown.getDatumForCursor(); + topSuggestionDatum = this.dropdown.getDatumForTopSuggestion(); + if (cursorDatum) { + this._select(cursorDatum); + $e.preventDefault(); + } else if (this.autoselect && topSuggestionDatum) { + this._select(topSuggestionDatum); + $e.preventDefault(); + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var datum; + if (datum = this.dropdown.getDatumForCursor()) { + this._select(datum); + $e.preventDefault(); + } else { + this._autocomplete(true); + } + }, + _onEscKeyed: function onEscKeyed() { + this.dropdown.close(); + this.input.resetInputValue(); + }, + _onUpKeyed: function onUpKeyed() { + var query = this.input.getQuery(); + this.dropdown.isEmpty && query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.moveCursorUp(); + this.dropdown.open(); + }, + _onDownKeyed: function onDownKeyed() { + var query = this.input.getQuery(); + this.dropdown.isEmpty && query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.moveCursorDown(); + this.dropdown.open(); + }, + _onLeftKeyed: function onLeftKeyed() { + this.dir === "rtl" && this._autocomplete(); + }, + _onRightKeyed: function onRightKeyed() { + this.dir === "ltr" && this._autocomplete(); + }, + _onQueryChanged: function onQueryChanged(e, query) { + this.input.clearHintIfInvalid(); + query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.empty(); + this.dropdown.open(); + this._setLanguageDirection(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + this.dropdown.open(); + }, + _setLanguageDirection: function setLanguageDirection() { + var dir; + if (this.dir !== (dir = this.input.getLanguageDirection())) { + this.dir = dir; + this.$node.css("direction", dir); + this.dropdown.setLanguageDirection(dir); + } + }, + _updateHint: function updateHint() { + var datum, val, query, escapedQuery, frontMatchRegEx, match; + datum = this.dropdown.getDatumForTopSuggestion(); + if (datum && this.dropdown.isVisible() && !this.input.hasOverflow()) { + val = this.input.getInputValue(); + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(datum.value); + match ? this.input.setHint(val + match[1]) : this.input.clearHint(); + } else { + this.input.clearHint(); + } + }, + _autocomplete: function autocomplete(laxCursor) { + var hint, query, isCursorAtEnd, datum; + hint = this.input.getHint(); + query = this.input.getQuery(); + isCursorAtEnd = laxCursor || this.input.isCursorAtEnd(); + if (hint && query !== hint && isCursorAtEnd) { + datum = this.dropdown.getDatumForTopSuggestion(); + datum && this.input.setInputValue(datum.value); + this.eventBus.trigger("autocompleted", datum.raw, datum.datasetName); + } + }, + _select: function select(datum) { + this.input.setQuery(datum.value); + this.input.setInputValue(datum.value, true); + this._setLanguageDirection(); + this.eventBus.trigger("selected", datum.raw, datum.datasetName); + this.dropdown.close(); + _.defer(_.bind(this.dropdown.empty, this.dropdown)); + }, + open: function open() { + this.dropdown.open(); + }, + close: function close() { + this.dropdown.close(); + }, + setVal: function setVal(val) { + if (this.isActivated) { + this.input.setInputValue(val); + } else { + this.input.setQuery(val); + this.input.setInputValue(val, true); + } + this._setLanguageDirection(); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + destroy: function destroy() { + this.input.destroy(); + this.dropdown.destroy(); + destroyDomStructure(this.$node); + this.$node = null; + } + }); + return Typeahead; + function buildDomStructure(input, withHint) { + var $input, $wrapper, $dropdown, $hint; + $input = $(input); + $wrapper = $(html.wrapper).css(css.wrapper); + $dropdown = $(html.dropdown).css(css.dropdown); + $hint = $input.clone().css(css.hint).css(getBackgroundStyles($input)); + $hint.val("").removeData().addClass("tt-hint").removeAttr("id name placeholder").prop("disabled", true).attr({ + autocomplete: "off", + spellcheck: "false" + }); + $input.data(attrsKey, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass("tt-input").attr({ + autocomplete: "off", + spellcheck: false + }).css(withHint ? css.input : css.inputWithNoHint); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input.wrap($wrapper).parent().prepend(withHint ? $hint : null).append($dropdown); + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function destroyDomStructure($node) { + var $input = $node.find(".tt-input"); + _.each($input.data(attrsKey), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.detach().removeData(attrsKey).removeClass("tt-input").insertAfter($node); + $node.remove(); + } + }(); + (function() { + var old, typeaheadKey, methods; + old = $.fn.typeahead; + typeaheadKey = "ttTypeahead"; + methods = { + initialize: function initialize(o, datasets) { + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + return this.each(attach); + function attach() { + var $input = $(this), eventBus, typeahead; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + typeahead = new Typeahead({ + input: $input, + eventBus: eventBus = new EventBus({ + el: $input + }), + withHint: _.isUndefined(o.hint) ? true : !!o.hint, + minLength: o.minLength, + autoselect: o.autoselect, + datasets: datasets + }); + $input.data(typeaheadKey, typeahead); + } + }, + open: function open() { + return this.each(openTypeahead); + function openTypeahead() { + var $input = $(this), typeahead; + if (typeahead = $input.data(typeaheadKey)) { + typeahead.open(); + } + } + }, + close: function close() { + return this.each(closeTypeahead); + function closeTypeahead() { + var $input = $(this), typeahead; + if (typeahead = $input.data(typeaheadKey)) { + typeahead.close(); + } + } + }, + val: function val(newVal) { + return !arguments.length ? getVal(this.first()) : this.each(setVal); + function setVal() { + var $input = $(this), typeahead; + if (typeahead = $input.data(typeaheadKey)) { + typeahead.setVal(newVal); + } + } + function getVal($input) { + var typeahead, query; + if (typeahead = $input.data(typeaheadKey)) { + query = typeahead.getVal(); + } + return query; + } + }, + destroy: function destroy() { + return this.each(unattach); + function unattach() { + var $input = $(this), typeahead; + if (typeahead = $input.data(typeaheadKey)) { + typeahead.destroy(); + $input.removeData(typeaheadKey); + } + } + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + })(); +})(window.jQuery); \ No newline at end of file diff --git a/ogn_python/static/files/heatmap2.js b/ogn_python/static/files/heatmap2.js new file mode 100755 index 0000000..78a6a24 --- /dev/null +++ b/ogn_python/static/files/heatmap2.js @@ -0,0 +1,960 @@ + +var map; +var map_id = 0; +var position; +var lastPosition; +var stations = {}; +var station_markers = {}; +var labelled_markers = {}; +var timeoutId; +var coverageOverlay; +var start = '2018-01-01'; +var end = '2100-01-01'; +var lasthash = ''; +var maxTimeout, minTimeout; +var processingUrl = true; +var defaultPointer = 'crosshair'; // help, cursor, crosshair, text, wait, pointer, progress +//var defaultColor = '#00990000:#009900ff'; +var defaultColour = '#80000040:#008000ff'; +var minZoomLevel = 8; +var maxZoomLevel = 11; + +var selected = { 'what':'max', 'when':'lastweek', 'station':'', 'center':'', 'zoom':'', 'airspace':'', 'airports':'', 'circles':'', 'ambiguity':'', 'colour': defaultColour }; + +function initialize() { + + airspaceLayer = new ol.layer.Tile({ + source: new ol.source.XYZ({ + tileUrlFunction: function(tileCoord, projection) { + var z = tileCoord[0]; + var x = tileCoord[1]; + var y = (1 << z) + tileCoord[2]; + return 'http://1.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_approved_airspaces_geometries@png/' + z + '/' + x + '/' + y + '.png'; + }, + wrapx: false + }), + opacity: 1, + visible: false + }); + + airportsLayer = new ol.layer.Tile({ + source: new ol.source.XYZ({ + tileUrlFunction: function(tileCoord, projection) { + var z = tileCoord[0]; + var x = tileCoord[1]; + var y = (1 << z) + tileCoord[2]; + return 'http://1.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_approved_airports@png/' + z + '/' + x + '/' + y + '.png'; + }, + wrapx: false + }), + opacity: 1, + visible: false + }); + + OSMLayer = new ol.layer.Tile({ + source: new ol.source.OSM(), + visible: true + }); + + stationLayerSource = new ol.source.Vector({ + features: [] + }); + + stationLayer = new ol.layer.Vector({ + source: stationLayerSource, + zIndex: 50, + opacity: 1, + visible: true + }); + + circleLayerSource = new ol.source.Vector({ + features: [] + }); + + circleLayer = new ol.layer.Vector({ + source: circleLayerSource, + zIndex: 50, + opacity: 1, + visible: false + }); + + AmbiguitySquareLayerSource = new ol.source.Vector({ + features: [] + }); + + AmbiguitySquareLayer = new ol.layer.Vector({ + source: AmbiguitySquareLayerSource, + zIndex: 51, + opacity: 1, + visible: true + }); + + ambiguityOverlay = new AmbiguityMapType(); + + // ratio: 1.2, +/-10% instead of default +/-25% + ambiguityLayer = new ol.layer.Image({ + source: new ol.source.ImageCanvas({ + canvasFunction: ambiguityOverlay.canvasFunctionAmbiguity, + projection: "EPSG:3857", + ratio: 1.2, + visible: false + }) + }); + + // create overlay before reading hash + coverageOverlay = new CoverageMapType(); + + // ratio: 1.2, +/-10% instead of default +/-25% + coverageLayer = new ol.layer.Image({ + source: new ol.source.ImageCanvas({ + canvasFunction: coverageOverlay.canvasFunctionCoverage, + projection: "EPSG:3857", + ratio: 1.2 + }) + }); + + // read hash before creating map with intial settings + if ( location.hash.substr(1) != '' ) { + readhash(); + } else { + setOptions('circles', 'circles'); // show by default + setColour( defaultColour ); + processingUrl = false; + } + // re-readhash if user changed hash and then redraw + $(window).bind( 'hashchange', reReadhash ); + + attribution = new ol.control.Attribution({ + collapsed: true, + tipLabel: 'Show credits' + }); + + scaleLineControl = new ol.control.ScaleLine(); + + map = new ol.Map({ + layers: [ + OSMLayer, + circleLayer, + airportsLayer, + airspaceLayer, + coverageLayer, + ambiguityLayer, + stationLayer, + ], + target: 'map_canvas', + controls: ol.control.defaults({ + attributionOptions: { + collapsible: true + } + }).extend([ + scaleLineControl, + attribution + ]), + view: new ol.View({ + projection: 'EPSG:3857', + center: ol.proj.fromLonLat([dLon,dLat]), + zoom: dZoom + }), + }); + + myresize(); + + $(window).resize(function () { + myresize(); + }); + + // displays credits over the list + credits = document.getElementsByClassName('ol-attribution ol-unselectable ol-control')[0]; + credits.style.zIndex = "1000"; + + var tooltip = document.getElementById('tooltip'); + var overlay = new ol.Overlay({ + element: tooltip, + offset: [10, 0], + positioning: 'bottom-left' + }); + map.addOverlay(overlay); + + function genericDisplayTooltip(evt) { + var pixel = evt.pixel; + var feature = map.forEachFeatureAtPixel(pixel, function(feature) { + return feature; + }); + tooltip.style.display = feature ? '' : 'none'; + if (feature) { + overlay.setPosition(evt.coordinate); + tooltip.innerHTML = feature.get('info'); + } + }; + + // marker tooltip + function displayTooltip(event) { + + var hit = map.hasFeatureAtPixel(event.pixel); + + var pixel = event.pixel; + tooltip.style.display = 'none'; + map.getTargetElement().style.cursor = defaultPointer; + map.forEachFeatureAtPixel(pixel, function(feature) { + if (typeof(feature.get('mark'))!='undefined'){ + if ( feature.get('mark').substring(0,1) == "S" ) { + overlay.setPosition(event.coordinate); + tooltip.innerText = feature.get('info'); + tooltip.style.display = ''; + // also change cursor + map.getTargetElement().style.cursor = 'pointer'; + return; + } + } + }) + }; + map.on('pointermove', displayTooltip); + + map.on('singleclick', function(event) { + var stationName = ''; + map.forEachFeatureAtPixel(event.pixel, function(feature,layer) { + if (typeof(feature.get('mark'))!='undefined'){ + if ( feature.get('mark').substring(0,1) == "S" ) { + stationName = feature.get('name'); + } + } + }); + if (stationName != '') { + getStationData( stationName ); + } else { // no 'S' feature + // map click - display details + updateDetails('loading...'); + if ( timeoutId ) { + clearTimeout(timeoutId); + } + position = ol.proj.transform(event.coordinate, 'EPSG:3857', 'EPSG:4326');; + timeoutId = setTimeout( displayDetails, 500 ); + } + }); + + map.on('moveend', function(event) { + var zoom = map.getView().getZoom(); + if (zoom != dZoom) { + setZoom(zoom); + updateURL( 'zoom' ); + } + var nc = ol.proj.toLonLat( map.getView().getCenter() ); + if ( (dLon != round(nc[0],6)) || (dLat != round(nc[1],6)) ) { + setCentre( nc ); + updateURL( 'center' ); + } + }); + + // display the stations + displayStations( true ); + + updateDetails("Blue icons represent UP old stations, Mauve ones DOWN
      Green is 0.2.1 or above and UP, Red is DOWN new stations"); + + timeoutId = null; +}; + + function myresize() { + var h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); + var t = $('#top_row').height(); + var b = $('#bottom_row').height(); + $('#map_canvas').height((h - t - b) + 'px'); + map.updateSize(); + } + +function addLabel( location, labelText ) { + var marker = labelled_markers[location.s] = + new ol.Feature({ + geometry: new ol.geom.Point(ol.proj.fromLonLat([location.lg,location.lt])), + mark: "L" + }); + + marker.setStyle(new ol.style.Style({ + text: new ol.style.Text({ + font: '12px Verdana', + text: labelText, + offsetX: 0, + offsetY: -22, + fill: new ol.style.Fill({color: 'black'}), + stroke: new ol.style.Stroke({color: 'black', width: 0.5}) + }) + })); + stationLayerSource.addFeature(marker); +} + +// custom marker +var angleMarker = 30; +var radiusMarker = 11; +var sinMarker = Math.sin(degreesToRadians(angleMarker)); +var cosMarker = Math.cos(degreesToRadians(angleMarker)); +var offsetMarker = radiusMarker/sinMarker; +var styleCache = {}; +var styleFunction = function(colour) { + colour = '#'+colour; + var style = styleCache[colour]; + if (!style) { + canvasM = document.createElement("canvas"); + var canvasWidth = radiusMarker*2+3, canvasHeight = radiusMarker+offsetMarker+3; + canvasM.setAttribute("width", canvasWidth); + canvasM.setAttribute("height", canvasHeight); + var contextM = canvasM.getContext("2d"); + // erase the canvas before re-drawing + contextM.clearRect(0, 0, canvasWidth, canvasHeight); + // Draw + contextM.save(); + contextM.beginPath(); + var x1=radiusMarker*cosMarker, y2=radiusMarker+offsetMarker; + var y1=offsetMarker-radiusMarker*sinMarker, x2=x1*y2/y1; + contextM.moveTo(radiusMarker+1, canvasHeight-0); + contextM.lineTo(radiusMarker+1-x1, canvasHeight-y1); + contextM.arcTo(radiusMarker+1-x2, canvasHeight-y2, radiusMarker+1, canvasHeight-y2, radiusMarker); + contextM.arcTo(radiusMarker+1+x2, canvasHeight-y2, radiusMarker+1+x1, canvasHeight-y1, radiusMarker); + contextM.closePath(); + contextM.fillStyle = colour; + contextM.fill(); + contextM.lineWidth = 1; + contextM.strokeStyle = '#000000'; + contextM.stroke(); + contextM.restore(); + + style = new ol.style.Style({ + image: new ol.style.Icon({ + img: canvasM, + imgSize: [canvasWidth, canvasHeight], + anchor: [0.5, 1.0], + }) + }); + styleCache[colour] = style; + } + return style; +}; + +function addStation( location, colour ) { + var marker = station_markers[location.s] = + new ol.Feature({ + geometry: new ol.geom.Point(ol.proj.fromLonLat([location.lg,location.lt])), + lat: location.lt, + lon: location.lg, + info: location.s + "\n" + (location.u == "U" ? "Last heartbeat at:\n" : "Last point at ") + location.ut + "Z\n" + "Version " + location.v, + mark: "S", + name: location.s, + }); + + marker.setStyle(styleFunction(colour)); // custom +/* marker.setStyle(new ol.style.Style({ + image: new ol.style.Icon({ + anchor: [0.5, 1], + opacity: 1, + src: "//www.googlemapsmarkers.com/v1/" + colour + "/", + }) + })); */ + stationLayerSource.addFeature(marker); +} + +function addCircle( location, radius, colour ) { + var rangeCircle = + new ol.Feature({ +// geometry: new ol.geom.Circle(ol.proj.fromLonLat([location.lg, location.lt]), radius / Math.cos( degreesToRadians(location.lt))) + geometry: new ol.geom.Polygon.circular( + // WGS84 Sphere + new ol.Sphere(6378137), + [location.lg, location.lt], + radius, + // Number of verticies + 64).transform('EPSG:4326', 'EPSG:3857') + }); + + rangeCircle.setStyle(new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: colour, + width: 1 + }), + })); + circleLayerSource.addFeature(rangeCircle); +} + +var dsTimeOut = null; +function displayStations(first) { + // Ajax is async and timeout runs twice unless cleared until AJAX done + // so need a clearTimeOut + if (dsTimeOut) { + clearTimeout(dsTimeOut); + } + + $.ajax( { type: "GET", + url: OgR+"/perl/stations2-filtered.pl?start="+start+"&end="+end, + timeout:20000, + cache: true, + error: function (xhr, ajaxOptions, thrownError) { + }, + success: function(json) { + var checked = selected['circles'] == 'circles'; + + stationLayerSource.clear() + station_markers = {}; + stations = []; + + circleLayerSource.clear() + + // add markers + json.stations.forEach( function(entry) { + stations[entry.s] = entry; + + var old = (entry.v == 'old' || entry.v == '?' || entry.v == "undefined" || entry.v == "" || entry.v == '0.1.3' ); + var colour = '00ff00'; + if ( entry.u == "U" ) { + if ( old ) { + colour = '0000ff'; + } + } else { + if ( old ) { + colour = 'aa00aa'; + } else { + colour = 'aa0000'; + } + } + addStation( entry, colour ); + + addCircle( entry, 10000, 'rgba(48, 48, 48, 0.7)' ); + addCircle( entry, 20000, 'rgba(48, 48, 48, 0.5)' ); + addCircle( entry, 30000, 'rgba(48, 48, 48, 0.3)' ); + } ); + + if ( first ) { + setupSearch(); + var stationName = selected['station']; + stationName = matchStation(stationName); + if ( stationName != "" && stations[stationName] ) { + setStation(stationName); // as per match + setCentre( [ stations[stationName].lg, stations[stationName].lt ] ); + map.getView().setCenter(ol.proj.fromLonLat([dLon, dLat])); + } + } + } + }); + + // and update every 5 minutes + dsTimeOut = setTimeout( displayStations, 5*60*1000 ); +} + +function degreesToRadians(deg) { + return deg * (Math.PI / 180); +} + +function radiansToDegrees(rad) { + return rad / (Math.PI / 180); +} + +function round(value, decimals) { + return Number(Math.round(value+'e'+decimals)+'e-'+decimals); +} + +const DEFAULT_RADIUS = 6371008.8; +function getDistance(c1, c2, opt_radius) { + const radius = opt_radius || DEFAULT_RADIUS; + const lat1 = degreesToRadians(c1[1]); + const lat2 = degreesToRadians(c2[1]); + const deltaLatBy2 = (lat2 - lat1) / 2; + const deltaLonBy2 = degreesToRadians(c2[0] - c1[0]) / 2; + const a = Math.sin(deltaLatBy2) * Math.sin(deltaLatBy2) + + Math.sin(deltaLonBy2) * Math.sin(deltaLonBy2) * + Math.cos(lat1) * Math.cos(lat2); + return 2 * radius * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); +} + +function clearLabels() { + // remove old labels + // use Object.keys for array with keys instead of numeric indexes + Object.keys(labelled_markers).forEach(function(key, index) { + stationLayerSource.removeFeature(labelled_markers[key]); + }); + labelled_markers = []; +} + +function getStationData( stationName ) { + clearLabels(); + updateDetails(''); + adjustMap( null, null, stationName ); +}; + +function updateDetails(newDetails) { + if (newDetails != '') { + $('#details').show(); + } else { + $('#details').hide(); + } + $('#details').html(newDetails); + myresize(); // adjust, details DIV may change size +} + +function displayDetails() { + if ( position && position != lastPosition ) { + $.ajax( { type: "GET", + url: OgR+"/perl/details-mgrs.pl", + data: { start: start, end: end, position: forward([position[0],position[1]],2) }, + timeout:20000, + cache: true, + error: function (xhr, ajaxOptions, thrownError) { + }, + success: function(json) { + console.log( json.toString() ); + var pos = inverse( json.query.ref ); + var bounds = ol.extent.boundingExtent([[pos[0],pos[1]],[pos[2],pos[3]]]) + var point = ol.extent.getCenter(bounds); + clearLabels(); + var stationList = ""; + var id = 1; + var currentFilter = selected['station']; + json.position.forEach( function(station) { + var distance = stations[station.s] ? Math.round( + getDistance([stations[station.s].lg, stations[station.s].lt],point) + /100)/10 : '?'; + if ( currentFilter != '' && station.s != currentFilter ) { + stationList += ""; + } + stationList += ""+id+":"+station.s+": "+distance+"km, "+station.l+"-"+station.h+"m, Avg Max:"+(station.a/10)+"db, Samples:"+station.c + ", Gliders:"+station.g+ ' ('+station.first; + + if ( station.first != station.last ) { + stationList += " to " + station.last; + } + stationList += ')
      '; + + if ( currentFilter != '' && station.s != currentFilter ) { + stationList += "
      "; + } + if ( station_markers[station.s] ) { + addLabel( stations[station.s], id.toString() ); + } + id++; + }); + console.log( stationList ); + updateDetails(stationList); + }, + }); + lastPosition = position; + } + timeoutId = null; +} + +var substringMatcher = function(strs) { + return function findMatches(q, cb) { + var matches, substringRegex; + + matches = []; + substrRegex = new RegExp(q, 'i'); + for( var key in stations ) { + if (substrRegex.test(key)) { + matches.push({ value: key }); + } + } + cb(matches.sort(function(a,b){ return a.value < b.value ? -1 : (a.value == b.value ? 0 : 1); })); + cb(matches); + }; +}; + +function setupSearch() { + $('.stationlist #typeahead').typeahead({ + hint: true, + highlight: true, + minLength: 1 + }, + { + name: 'stations', + displayKey: 'value', + source: substringMatcher('') + }); +} + +function toggleOptions(option) { + var newOption = selected[option] ? '' : option; + setOptions(option, newOption); + updateURL(option); + return false; +} + +function setOptions(option, newOption) { + switch(option) { + case 'circles': + circleLayer.setVisible(newOption); + break; + case 'ambiguity': + ambiguityLayer.setVisible(newOption); + break; + case 'airports': + airportsLayer.setVisible(newOption); + break; + case 'airspace': + airspaceLayer.setVisible(newOption); + break; + default: { + } + } + tick( option, newOption ); +} + +function setMinColour(c,a) { + var s = selected['colour'].split(':'); + if ( s[0] != c ) { + s[0] = c+pad2(a.toString(16)); + adjustMap( null, null, null, s[0]+':'+s[1] ); + } + return false; +} + +function setMaxColour(c,a) { + var s = selected['colour'].split(':'); + if ( s[1] != c ) { + s[1] = c+pad2(a.toString(16)); + adjustMap( null, null, null, s[0]+':'+s[1] ); + } + return false; +} + +function setZoom(mapZoom) { + console.log( "Zoom level: "+mapZoom ); + dZoom = mapZoom; + selected['zoom'] = mapZoom; + if (mapZoom > maxZoomLevel) { + $('#zoomOut_msg').show(); + } + else { + $('#zoomOut_msg').hide(); + } + if (mapZoom < minZoomLevel) { + $('#zoomIn_msg').show(); + } + else { + $('#zoomIn_msg').hide(); + } + return false; +} + +function setCentre(coords) { + dLon = coords[0]; + dLat = coords[1]; + selected['center'] = coords[1].toFixed(5) + "_" + coords[0].toFixed(5); +} + +function setColour(colour) { + selected['colour'] = colour; + coverageOverlay.setColourScheme( colour ); +} + +function setStation(where) { + selected['station'] = where; + coverageOverlay.setStation(where); + $('#typeahead').val( where ); + updateTitle(); +} + +function setSource(what) { + tick( 'what', what ); + coverageOverlay.setSource(what); + updateTitle(); +} + +function setDates(when) { + switch(when) { + case 'today': + start = end = new Date().toISOString().substr(0,10); + break; + case 'yesterday': + start = new Date(new Date().getTime() - (24*3600*2*1000)).toISOString().substr(0,10); + end = new Date(new Date().getTime() - (24*3600*1*1000)).toISOString().substr(0,10); + break; + case 'lastweek': + start = new Date(new Date().getTime() - (24*3600*7*1000)).toISOString().substr(0,10); + end = new Date().toISOString().substr(0,10); + break; + case 'recent': + start = new Date(new Date().getFullYear(),0,1).toISOString().substr(0,10); + end = new Date().toISOString().substr(0,10); + break; + case 'all': + start = '2015-03-31'; + end = new Date().toISOString().substr(0,10); + break; + default: { + switch(when.substr(0,1)) { + case 'd': + var ndays = parseInt(when.substr(1,10)); + start = new Date(new Date().getTime() - (24*3600*ndays*1000)).toISOString().substr(0,10); + end = new Date().toISOString().substr(0,10); + break; + case 'D': + var s = when.substr(1,21).split('#'); + start = s[0]; + end = s[1]; + break; + default: { + } + } + } + } + tick( 'when', when ); + coverageOverlay.setDates( start, end ); + updateTitle(); +} + +function setWhen(when) { + adjustMap(null, when); + return false; +} + +function setWhat(what) { + adjustMap(what); + return false; +} + +function matchStation(where) { + if (where != '') { // match in list + for( var key in stations ) { + if (where.toUpperCase() == stations[key].s.toUpperCase()) { + where = stations[key].s; + break; + } + } + } + return where; +} + +var nostation = { 'receivers':1, 'coverage':1 }; +function adjustMap( what, when, where, colour ) { + + if ( what ) { + setSource(what); + if ( nostation[what] ) { + where = ''; + } + updateURL(what); + } + if ( when ) { + setDates(when); + updateURL(when); + } + if ( where != null && where != undefined ) { + if (where == '') { // i.e all stations + setStation(where); + updateURL('station'); + } else { + if (where.includes('%')) { // i.e contains wildcard + setStation(where); + updateURL('station'); + } else { + where = matchStation(where); + var LngLat; + if ( stations[ where ] ) { + LngLat = [stations[where].lg,stations[where].lt]; + if (map.getView().getZoom() < minZoomLevel ) { + setZoom(minZoomLevel); + map.getView().setZoom(dZoom); + } + setCentre( LngLat ); + map.getView().setCenter(ol.proj.fromLonLat([dLon, dLat])); + + setStation(where); + updateURL('station'); + } else { + $('#typeahead').val(''); + } + } + } + } + if ( colour != null && colour != '' ) { + setColour(colour); + updateURL('colour'); + } + // update the coverage layer + coverageLayer.getSource().changed(); +} + +var hrefOrder = [ 'station', 'what', 'when', 'center', 'zoom', 'colour' ]; +var updateHistory = { 'what':1, 'when':1, 'station':1 }; +var titleOrder = [ 'what', 'station', 'when' ]; +var options = [ 'airports', 'airspace', 'circles', 'ambiguity' ]; + +function tick( whattype, newItem ) { + // clear current tick + if ( selected[whattype] && selected[whattype] !== '' && whattype !== 'station' ) { + $('#'+selected[whattype]+' span').attr('class',''); + } + selected[whattype] = newItem; + // set new tick + if ( selected[whattype] && selected[whattype] !== '' && whattype !== 'station' ) { + $('#'+selected[whattype]+' span').attr('class','glyphicon glyphicon-ok'); + } +} + +function updateTitle() { + // update the title to reflect the contents + var title = ''; + for( var i = 0; i < titleOrder.length; i++ ) { + var v = selected[titleOrder[i]]; + if ( v && v != '' ) { + if ( titleOrder[i] == 'station' ) { + title += ' - ' + v; + } else { + title += ' - ' + $('#'+v).text(); + } + } + } + window.document.title = 'Onglide Range' + title; + $('#description').html( title.substr(2) ); +} + +var coloursInitialised = false; +function initColour( newColour ) { + + var s = newColour.split(':'); + + var startColor = tinycolor( s[1] ); + var endColor = tinycolor( s[0] ); + + if (coloursInitialised) { // update + $("#maxc").trigger("colorpickersliders.updateColor", startColor.toRgbString()); + $("#minc").trigger("colorpickersliders.updateColor", endColor.toRgbString()); + return; + } + + $("#maxc").ColorPickerSliders({ + color: startColor.toRgbString(), + flat: true, + size: 'sm', + placement: 'left', + customswitches: false, + order: { + hsl: 1, + opacity: 2 + }, + onchange: function( container, colour ) { + if ( maxTimeout ) { clearTimeout( maxTimeout ); } + maxTimeout = setTimeout( function() { + setMaxColour( colour.tiny.toHexString(), Math.round(colour.rgba.a*255) ); + }, 500 ); + } + }); + + $("#minc").ColorPickerSliders({ + color: endColor.toRgbString(), + flat: true, + size: 'sm', + placement: 'left', + customswitches: false, + order: { + hsl: 1, + opacity: 2 + }, + onchange: function( container, colour ) { + if ( minTimeout ) { clearTimeout( minTimeout ); } + minTimeout = setTimeout( function() { + setMinColour( colour.tiny.toHexString(), Math.round(colour.rgba.a*255) ); + }, 500 ); + } + }); + coloursInitialised = true; +} + +function updateURL( whattype ) { + // and if we aren't processing a URL hash at the moment then + // update the URL as well + if ( ! processingUrl ) { + var url = '#'; + for( var i = 0; i < hrefOrder.length; i++, url += ',' ) { + if ( selected[hrefOrder[i]] ) { + url += selected[hrefOrder[i]]; + } + } + + for( i = 0; i < options.length; i++ ) { + if ( selected[options[i]] ) { + url += options[i] + ";"; + } + } + + // we changed it, this will stop us doing anything with it + lasthash = url; +// if ( history.pushState && updateHistory[whattype] ) { +// history.pushState( null, null, url ); +// } else { + location.replace( url ); +// } + } +} + +function reReadhash() { + // make sure the hash isn't the same as we think it is + // this should stop us parsing our own changes + if ( location.hash === lasthash ) { + return; + } + readhash(); + // update map + map.getView().setZoom(dZoom); + map.getView().setCenter(ol.proj.fromLonLat([dLon, dLat])); + // make sure canvas redrawn if zoom and center stays same !!! + // update the coverage layer + coverageLayer.getSource().changed(); +} + +function readhash() { + lasthash = location.hash; + processingUrl = true; + var vals = location.hash.substr(1).split(','); + console.log( location.hash.substr(1) + "|%%%%|" + vals[0] ); + + // do options first as adjustMap will force the redraw + if ( vals[6] ) { + var userOptions = vals[6].split(';'); + var newOption = ~(userOptions.indexOf('airports')) ? 'airports' : ''; + setOptions('airports', newOption); + newOption = ~(userOptions.indexOf('airspace')) ? 'airspace' : ''; + setOptions('airspace', newOption); + newOption = ~(userOptions.indexOf('circles')) ? 'circles' : ''; + setOptions('circles', newOption); + newOption = ~(userOptions.indexOf('ambiguity')) ? 'ambiguity' : ''; + setOptions('ambiguity', newOption); + } + + // set colour + if ( vals[5] ) { + setColour( vals[5] ); + } else { + setColour( defaultColour ); + } + initColour(selected['colour']); + + // set date + if (vals[2]) { + setDates(vals[2]); + } else { + setDates('all'); + } + + // set graph source + if ( vals[1] ) { + setSource(vals[1]); + } + + // set station + if ( vals[0] ) { + setStation(vals[0]); + } + + // set center (lat_lon) + if ( vals[3] ) { + var coords = vals[3].split('_'); + if ( coords.length ) { + setCentre( [ parseFloat(coords[1]), parseFloat(coords[0]) ] ); + } + } + + // set zoom + if ( vals[4] ) { + setZoom(parseInt(vals[4])); + } + processingUrl = false; +} + +// Force a hex value to have 2 characters +function pad2(c) { + return c.length == 1 ? '0' + c : '' + c; +} diff --git a/ogn_python/static/files/maptiles2.js b/ogn_python/static/files/maptiles2.js new file mode 100755 index 0000000..2e35566 --- /dev/null +++ b/ogn_python/static/files/maptiles2.js @@ -0,0 +1,289 @@ + +function CoverageMapType() { + this.start = '2014-04-14'; + this.end = '2200-01-01'; + this.station = ""; + this.source = "max"; + this.colours = []; + this.colour = ''; +} + +var id = 0; +var cache = {}; +var cacheUTM = {}; + +CoverageMapType.prototype.setStation = function(newStation) { + this.station = newStation; +} + +CoverageMapType.prototype.setColourScheme = function(_colour) { + this.colour = _colour; + var s = _colour.split( ':' ); + + var start = tinycolor( s[1] ); start = start.toRgb(); + var end = tinycolor( s[0] ); end = end.toRgb(); + + console.log( _colour ); + console.log( "start:" ); + console.log( start ); + + for (i = 0; i < 25; i++) { + var alphablend = 1-(i/24); + var c = { r: start.r * alphablend + (1 - alphablend) * end.r, + g: start.g * alphablend + (1 - alphablend) * end.g, + b: start.b * alphablend + (1 - alphablend) * end.b, + a: start.a * alphablend + (1 - alphablend) * end.a }; + + this.colours[i] = tinycolor(c).toRgbString(); + } +} + +CoverageMapType.prototype.setDates = function(_start,_end) { + this.start = _start; + this.end = _end; +} + +CoverageMapType.prototype.setSource = function(_source) { + this.source = _source; +} + +let canvasC = null; +CoverageMapType.prototype.canvasFunctionCoverage = function( + extent, + resolution, + pixelRatio, + size, // [canvasWidth, canvasHeight], + projection +) { + if (!canvasC) { + canvasC = document.createElement("canvas"); + canvasC.setAttribute("id", "canvasCoverage"); + } + var canvasWidth = size[0], canvasHeight = size[1]; + canvasC.setAttribute("width", canvasWidth); + canvasC.setAttribute("height", canvasHeight); + var contextC = canvasC.getContext("2d"); + // erase the canvas before re-drawing + contextC.clearRect(0, 0, canvasWidth, canvasHeight); + + // do nothing if too much out zoom + var zoom = map.getView().getZoom(); + if ( ( zoom < minZoomLevel && this.source != 'lowres-coverage' ) || + ( zoom > maxZoomLevel ) ) { + return canvasC; + } + + // determine coordinates corners TopLeft and BottomRight + + // Canvas extent (larger) is different than map extent + // need to compute delta between left-top of map and canvas extent. + var mapExtent = map.getView().calculateExtent(map.getSize()) + var canvasOrigin = map.getPixelFromCoordinate([extent[0], extent[3]]); + var mapOrigin = map.getPixelFromCoordinate([mapExtent[0], mapExtent[3]]); + var delta = [ mapOrigin[0]-canvasOrigin[0], mapOrigin[1]-canvasOrigin[1] ]; +// var mapOpposite = map.getPixelFromCoordinate([mapExtent[2], mapExtent[1]]); + + //convert from pixel to xy + var xyTL = map.getCoordinateFromPixel([0,0]); + var xyBR = map.getCoordinateFromPixel([canvasWidth,canvasHeight]); + + // convert from xy to lat/long + var latlonTL = ol.proj.transform(xyTL, 'EPSG:3857', 'EPSG:4326'); + var latlonBR = ol.proj.transform(xyBR, 'EPSG:3857', 'EPSG:4326'); + + // plot a square that has been fetched + // each item is ~1 km square + function plotRef(json) { + + // convert from lat/long to canvas pixels + var toScreen = function(latlonPoint) { + var xyPoint = ol.proj.transform(latlonPoint, 'EPSG:4326', 'EPSG:3857'); + var pxPoint = map.getPixelFromCoordinate(xyPoint); + return ( [ (pxPoint[0]+delta[0])*pixelRatio, (pxPoint[1]+delta[1])*pixelRatio ] ); + } + + function fillBox(x) { + var tl = toScreen([x[0],x[1]]); var br = toScreen([x[2],x[3]]); + contextC.fillRect( tl[0], tl[1], br[0] - tl[0], br[1] - tl[1] ); + } + + if ( coverageOverlay.colours.length > 0 && json.p ) { + // expand out the compressed data - smaller over the network + var points = []; + json.p.forEach( function(position) { + var data = position.split('/'); + var mgrs = json.t + data[0]; + points.push( { a: data[1], m: mgrs } ); + if ( ! cacheUTM[ mgrs ] ) { + cacheUTM[ mgrs ] = inverse( mgrs ); + } + } ); + + contextC.save(); + contextC.globalAlpha = 1; + contextC.lineWidth = 0.2; + for( var i = 250, p = 1000000, n = 0; i >= 10; p = i, i-=10, n++ ) { + contextC.fillStyle = contextC.strokeStyle = coverageOverlay.colours[ n ]; + var t = i/5; + + points.forEach( function(position) { + if ( position.a >= i && position.a < p ) { + fillBox( cacheUTM[ position.m ] ); + } + }); + } + contextC.restore(); + } + map.render(); // redraw map after every plotref + }; + + var tiles = {}; // 0.1 deg by 0.1 deg (~11 km square) + for( var x = Math.min(latlonTL[0],latlonBR[0]), xm = Math.max(latlonTL[0],latlonBR[0]); x <= xm ;x+= 0.1 ) { + for( var y = Math.min(latlonBR[1],latlonTL[1]), ym = Math.max(latlonBR[1],latlonTL[1]); y <= ym; y+= 0.1 ) { + tiles[ forward([x,y],1).substr(0,5) ] = 1; + } + } + + var source = coverageOverlay.source; + var station = coverageOverlay.station; + var start = coverageOverlay.start; + var end = coverageOverlay.end; + + // fetch each square + Object.keys(tiles).sort().forEach( function(tile) { + var cacheKey = tile+source+station+start+end; + if ( ! cache[cacheKey] ) { + cache[cacheKey] = [ plotRef ]; + + $.ajax({ type: "GET", + url: OgR+"/perl/"+source+"-tile-mgrs.pl", + data: { station: station, start: start, end: end, squares: tile}, + timeout:20000, + cache: true, + error: function (xhr, ajaxOptions, thrownError) { + }, + success: function(json) { + cache[cacheKey].forEach( function(x) { x(json); } ); cache[cacheKey] = undefined; + } + }); + } else { + cache[cacheKey].push( plotRef ); + } + }); + + $(document).ajaxStop(function () { + // 0 === $.active + }); + return canvasC; +} + +function bound(value, opt_min, opt_max) { + if (opt_min != null) value = Math.max(value, opt_min); + if (opt_max != null) value = Math.min(value, opt_max); + return value; +} + +function AmbiguityMapType() { + this.ambiguity = false; +} + +AmbiguityMapType.prototype.setAmbiguity = function(_ambiguity) { + this.ambiguity = _ambiguity; +} + +let canvasA = null; +AmbiguityMapType.prototype.canvasFunctionAmbiguity = function( + extent, + resolution, + pixelRatio, + size, // [canvasWidth, canvasHeight], + projection +) { + if (!canvasA) { + canvasA = document.createElement("canvas"); + canvasA.setAttribute("id", "canvasAmbiguity"); + } + var canvasWidth = size[0], canvasHeight = size[1]; + canvasA.setAttribute("width", canvasWidth); + canvasA.setAttribute("height", canvasHeight); + var contextA = canvasA.getContext("2d"); + // erase the canvas before re-drawing + contextA.clearRect(0, 0, canvasWidth, canvasHeight); + + // do nothing if too much out zoom (<7) + var zoom = map.getView().getZoom(); + if ( zoom < 7 && this.source != 'lowres-coverage' ) { + return canvasA; + } + + // determine coordinates corners TopLeft and BottomRight + + // Canvas extent (larger) is different than map extent + // need to compute delta between left-top of map and canvas extent. + var mapExtent = map.getView().calculateExtent(map.getSize()) + var canvasOrigin = map.getPixelFromCoordinate([extent[0], extent[3]]); + var mapOrigin = map.getPixelFromCoordinate([mapExtent[0], mapExtent[3]]); + var delta = [mapOrigin[0]-canvasOrigin[0], mapOrigin[1]-canvasOrigin[1]] +// var mapOpposite = map.getPixelFromCoordinate([mapExtent[2], mapExtent[1]]); + + //convert from pixel to xy + var xyTL = map.getCoordinateFromPixel([0,0]); + var xyBR = map.getCoordinateFromPixel([canvasWidth,canvasHeight]); + + // convert from xy to lat/long + var latlonTL = ol.proj.transform(xyTL, 'EPSG:3857', 'EPSG:4326'); + var latlonBR = ol.proj.transform(xyBR, 'EPSG:3857', 'EPSG:4326'); + +// TBD for V4, draw squares in transition zone properly instead of limiting to 45 + // draw ambiguity if selected and if latitude > 45 deg +/* if ( ambiguity && latlonTL[1] > 45 && latlonBR[1] > 45 )*/ { + + // convert from lat/long to canvas pixels + var toScreen = function(latlonPoint) { + var xyPoint = ol.proj.transform(latlonPoint, 'EPSG:4326', 'EPSG:3857'); + var pxPoint = map.getPixelFromCoordinate(xyPoint); + return ( [ (pxPoint[0]+delta[0])*pixelRatio, (pxPoint[1]+delta[1])*pixelRatio ] ); + } + + var shiftBits = 7; +// var truncBits = 16; // V4 + var truncBits = 19; // V5 + var scaleBits = 1e7/(1<<(shiftBits+truncBits)); + + // lets draw the lines; horizontal first then vertical + contextA.save(); + contextA.strokeStyle = 'red'; + + for( var t = (latlonBR[1] * scaleBits)|0, + r = ((latlonTL[1] * scaleBits)|0)+1; t <= r; t++) { + + var s = toScreen( [ latlonTL[0], t / scaleBits ] ); + var f = toScreen( [ latlonBR[0], t / scaleBits ] ); + + contextA.beginPath(); + contextA.moveTo(s[0],s[1]); + contextA.lineTo(f[0],f[1]); + contextA.stroke(); + } + +// var shiftBits = (( (latlonTL[1] <= 45) && (latlonTL[1] >= -45) ? 7 : 8) ); // V4 + var shiftBits = 7; // V5 +// var truncBits = 16; // V4 + var truncBits = 20; // V5 + var scaleBits = 1e7/(1<<(shiftBits+truncBits)); + + for( var t = (latlonTL[0] * scaleBits)|0, + r = ((latlonBR[0] * scaleBits)|0)+1; t <= r; t++) { + + var s = toScreen( [ t / scaleBits, latlonTL[1] ] ); + var f = toScreen( [ t / scaleBits, latlonBR[1] ] ); + + contextA.beginPath(); + contextA.moveTo(s[0],s[1]); + contextA.lineTo(f[0],f[1]); + contextA.stroke(); + } + contextA.restore(); + } + return canvasA; +} diff --git a/ogn_python/static/files/mgrs.min.js b/ogn_python/static/files/mgrs.min.js new file mode 100755 index 0000000..e8955d3 --- /dev/null +++ b/ogn_python/static/files/mgrs.min.js @@ -0,0 +1,12 @@ + +// https://raw.githubusercontent.com/proj4js/mgrs/master/mgrs.js +/** +Copyright (c) 2012, Mike Adair, Richard Greenwood, Didier Richard, Stephen Irons, Olivier Terral, Calvin Metcalf + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +**/ +var NUM_100K_SETS=6;var SET_ORIGIN_COLUMN_LETTERS="AJSAJS";var SET_ORIGIN_ROW_LETTERS="AFAFAF";var A=65;var I=73;var O=79;var V=86;var Z=90;forward=function(b,a){a=a||5;return encode(LLtoUTM({lat:b[1],lon:b[0]}),a)};inverse=function(a){var b=UTMtoLL(decode(a.toUpperCase()));return[b.left,b.bottom,b.right,b.top]};toPoint=function(b){var a=exports.inverse(b);return[(a[2]+a[0])/2,(a[3]+a[1])/2]};function degToRad(a){return(a*(Math.PI/180))}function radToDeg(a){return(180*(a/Math.PI))}function LLtoUTM(i){var l=i.lat;var t=i.lon;var r=6378137;var q=0.00669438;var h=0.9996;var o;var d;var f,e,k,m,g;var j=degToRad(l);var p=degToRad(t);var s;var n;n=Math.floor((t+180)/6)+1;if(t===180){n=60}if(l>=56&&l<64&&t>=3&&t<12){n=32}if(l>=72&&l<84){if(t>=0&&t<9){n=31}else{if(t>=9&&t<21){n=33}else{if(t>=21&&t<33){n=35}else{if(t>=33&&t<42){n=37}}}}}o=(n-1)*6-180+3;s=degToRad(o);d=(q)/(1-q);f=r/Math.sqrt(1-q*Math.sin(j)*Math.sin(j));e=Math.tan(j)*Math.tan(j);k=d*Math.cos(j)*Math.cos(j);m=Math.cos(j)*(p-s);g=r*((1-q/4-3*q*q/64-5*q*q*q/256)*j-(3*q/8+3*q*q/32+45*q*q*q/1024)*Math.sin(2*j)+(15*q*q/256+45*q*q*q/1024)*Math.sin(4*j)-(35*q*q*q/3072)*Math.sin(6*j));var c=(h*f*(m+(1-e+k)*m*m*m/6+(5-18*e+e*e+72*k-58*d)*m*m*m*m*m/120)+500000);var b=(h*(g+f*Math.tan(j)*(m*m/2+(5-e+9*k+4*k*k)*m*m*m*m/24+(61-58*e+e*e+600*k-330*d)*m*m*m*m*m*m/720)));if(l<0){b+=10000000}return{northing:Math.round(b),easting:Math.round(c),zoneNumber:n,zoneLetter:getLetterDesignator(l)}}function UTMtoLL(B){var b=B.northing;var d=B.easting;var c=B.zoneLetter;var g=B.zoneNumber;if(g<0||g>60){return null}var k=0.9996;var C=6378137;var w=0.00669438;var e;var i=(1-Math.sqrt(1-w))/(1+Math.sqrt(1-w));var o,p,u,z,q,j;var t;var r,v;var m=d-500000;var l=b;if(c<"N"){l-=10000000}t=(g-1)*6-180+3;e=(w)/(1-w);j=l/k;r=j/(C*(1-w/4-3*w*w/64-5*w*w*w/256));v=r+(3*i/2-27*i*i*i/32)*Math.sin(2*r)+(21*i*i/16-55*i*i*i*i/32)*Math.sin(4*r)+(151*i*i*i/96)*Math.sin(6*r);o=C/Math.sqrt(1-w*Math.sin(v)*Math.sin(v));p=Math.tan(v)*Math.tan(v);u=e*Math.cos(v)*Math.cos(v);z=C*(1-w)/Math.pow(1-w*Math.sin(v)*Math.sin(v),1.5);q=m/(o*k);var h=v-(o*Math.tan(v)/z)*(q*q/2-(5+3*p+10*u-4*u*u-9*e)*q*q*q*q/24+(61+90*p+298*u+45*p*p-252*e-3*u*u)*q*q*q*q*q*q/720);h=radToDeg(h);var f=(q-(1+2*p+u)*q*q*q/6+(5-2*u+28*p-3*u*u+8*e+24*p*p)*q*q*q*q*q/120)/Math.cos(v);f=t+radToDeg(f);var n;if(B.accuracy){var s=UTMtoLL({northing:B.northing+B.accuracy,easting:B.easting+B.accuracy,zoneLetter:B.zoneLetter,zoneNumber:B.zoneNumber});n={top:s.lat,right:s.lon,bottom:h,left:f}}else{n={lat:h,lon:f}}return n}function getLetterDesignator(a){var b="Z";if((84>=a)&&(a>=72)){b="X"}else{if((72>a)&&(a>=64)){b="W"}else{if((64>a)&&(a>=56)){b="V"}else{if((56>a)&&(a>=48)){b="U"}else{if((48>a)&&(a>=40)){b="T"}else{if((40>a)&&(a>=32)){b="S"}else{if((32>a)&&(a>=24)){b="R"}else{if((24>a)&&(a>=16)){b="Q"}else{if((16>a)&&(a>=8)){b="P"}else{if((8>a)&&(a>=0)){b="N"}else{if((0>a)&&(a>=-8)){b="M"}else{if((-8>a)&&(a>=-16)){b="L"}else{if((-16>a)&&(a>=-24)){b="K"}else{if((-24>a)&&(a>=-32)){b="J"}else{if((-32>a)&&(a>=-40)){b="H"}else{if((-40>a)&&(a>=-48)){b="G"}else{if((-48>a)&&(a>=-56)){b="F"}else{if((-56>a)&&(a>=-64)){b="E"}else{if((-64>a)&&(a>=-72)){b="D"}else{if((-72>a)&&(a>=-80)){b="C"}}}}}}}}}}}}}}}}}}}}return b}function encode(a,c){var d=""+a.easting,b=""+a.northing;return a.zoneNumber+a.zoneLetter+get100kID(a.easting,a.northing,a.zoneNumber)+d.substr(d.length-5,c)+b.substr(b.length-5,c)}function get100kID(f,e,d){var a=get100kSetForZone(d);var b=Math.floor(f/100000);var c=Math.floor(e/100000)%20;return getLetter100kID(b,c,a)}function get100kSetForZone(b){var a=b%NUM_100K_SETS;if(a===0){a=NUM_100K_SETS}return a}function getLetter100kID(c,j,d){var f=d-1;var e=SET_ORIGIN_COLUMN_LETTERS.charCodeAt(f);var h=SET_ORIGIN_ROW_LETTERS.charCodeAt(f);var a=e+c-1;var g=h+j;var i=false;if(a>Z){a=a-Z+A-1;i=true}if(a===I||(eI)||((a>I||eO)||((a>O||eZ){a=a-Z+A-1}if(g>V){g=g-V+A-1;i=true}else{i=false}if(((g===I)||((hI)))||(((g>I)||(hO)))||(((g>O)||(hV){g=g-V+A-1}var b=String.fromCharCode(a)+String.fromCharCode(g);return b}function decode(n){if(n&&n.length===0){throw ("MGRSPoint coverting from nothing")}var d=n.length;var a=null;var b="";var e;var q=0;while(!(/[A-Z]/).test(e=n.charAt(q))){if(q>=2){throw ("MGRSPoint bad conversion from: "+n)}b+=e;q++}var f=parseInt(b,10);if(q===0||q+3>d){throw ("MGRSPoint bad conversion from: "+n)}var c=n.charAt(q++);if(c<="A"||c==="B"||c==="Y"||c>="Z"||c==="I"||c==="O"){throw ("MGRSPoint zone letter "+c+" not handled: "+n)}a=n.substring(q,q+=2);var m=get100kSetForZone(f);var h=getEastingFromChar(a.charAt(0),m);var j=getNorthingFromChar(a.charAt(1),m);while(j0){k=100000/Math.pow(10,o);t=n.substring(q,q+o);u=parseFloat(t)*k;g=n.substring(q+o);s=parseFloat(g)*k}r=u+h;p=s+j;return{easting:r,northing:p,zoneLetter:c,zoneNumber:f,accuracy:k}}function getEastingFromChar(c,f){var d=SET_ORIGIN_COLUMN_LETTERS.charCodeAt(f-1);var a=100000;var b=false;while(d!==c.charCodeAt(0)){d++;if(d===I){d++}if(d===O){d++}if(d>Z){if(b){throw ("Bad character: "+c)}d=A;b=true}a+=100000}return a}function getNorthingFromChar(e,d){if(e>"V"){throw ("MGRSPoint given invalid Northing "+e)}var c=SET_ORIGIN_ROW_LETTERS.charCodeAt(d-1);var a=0;var b=false;while(c!==e.charCodeAt(0)){c++;if(c===I){c++}if(c===O){c++}if(c>V){if(b){throw ("Bad character: "+e)}c=A;b=true}a+=100000}return a}function getMinNorthing(a){var b;switch(a){case"C":b=1100000;break;case"D":b=2000000;break;case"E":b=2800000;break;case"F":b=3700000;break;case"G":b=4600000;break;case"H":b=5500000;break;case"J":b=6400000;break;case"K":b=7300000;break;case"L":b=8200000;break;case"M":b=9100000;break;case"N":b=0;break;case"P":b=800000;break;case"Q":b=1700000;break;case"R":b=2600000;break;case"S":b=3500000;break;case"T":b=4400000;break;case"U":b=5300000;break;case"V":b=6200000;break;case"W":b=7000000;break;case"X":b=7900000;break;default:b=-1}if(b>=0){return b}else{throw ("Invalid zone letter: "+a)}}; diff --git a/ogn_python/static/files/ol/ol.css b/ogn_python/static/files/ol/ol.css new file mode 100755 index 0000000..2a1af00 --- /dev/null +++ b/ogn_python/static/files/ol/ol.css @@ -0,0 +1,246 @@ +.ol-box { + box-sizing:border-box; + border-radius:2px; + border:2px solid #00f +} +.ol-mouse-position { + top:8px; + right:8px; + position:absolute +} +.ol-scale-line { + background:rgba(0,60,136,.3); + border-radius:4px; + bottom:8px; + left:8px; + padding:2px; + position:absolute +} +.ol-scale-line-inner { + border:1px solid #eee; + border-top:none; + color:#eee; + font-size:10px; + text-align:center; + margin:1px; + will-change:contents,width +} +.ol-overlay-container { + will-change:left,right,top,bottom +} +.ol-unsupported { + display:none +} +.ol-unselectable,.ol-viewport { + -webkit-touch-callout:none; + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; + -webkit-tap-highlight-color:transparent +} +.ol-selectable { + -webkit-touch-callout:default; + -webkit-user-select:auto; + -moz-user-select:auto; + -ms-user-select:auto; + user-select:auto +} +.ol-grabbing { + cursor:-webkit-grabbing; + cursor:-moz-grabbing; + cursor:grabbing +} +.ol-grab { + cursor:move; + cursor:-webkit-grab; + cursor:-moz-grab; + cursor:grab +} +.ol-control { + position:absolute; + background-color:rgba(255,255,255,.4); + border-radius:4px; + padding:2px +} +.ol-control:hover { + background-color:rgba(255,255,255,.6) +} +.ol-zoom { + top:.5em; + left:.5em +} +.ol-rotate { + top:.5em; + right:.5em; + transition:opacity .25s linear,visibility 0s linear +} +.ol-rotate.ol-hidden { + opacity:0; + visibility:hidden; + transition:opacity .25s linear,visibility 0s linear .25s +} +.ol-zoom-extent { + top:4.643em; + left:.5em +} +.ol-full-screen { + right:.5em; + top:.5em +} +@media print { + .ol-control { + display:none + } +} +.ol-control button { + display:block; + margin:1px; + padding:0; + color:#fff; + font-size:1.14em; + font-weight:700; + text-decoration:none; + text-align:center; + height:1.375em; + width:1.375em; + line-height:.4em; + background-color:rgba(0,60,136,.5); + border:none; + border-radius:2px +} +.ol-control button::-moz-focus-inner { + border:none; + padding:0 +} +.ol-zoom-extent button { + line-height:1.4em +} +.ol-compass { + display:block; + font-weight:400; + font-size:1.2em; + will-change:transform +} +.ol-touch .ol-control button { + font-size:1.5em +} +.ol-touch .ol-zoom-extent { + top:5.5em +} +.ol-control button:focus,.ol-control button:hover { + text-decoration:none; + background-color:rgba(0,60,136,.7) +} +.ol-zoom .ol-zoom-in { + border-radius:2px 2px 0 0 +} +.ol-zoom .ol-zoom-out { + border-radius:0 0 2px 2px +} +.ol-attribution { + text-align:right; + bottom:.5em; + right:.5em; + max-width:calc(100% - 1.3em) +} +.ol-attribution ul { + margin:0; + padding:0 .5em; + font-size:.7rem; + line-height:1.375em; + color:#000; + text-shadow:0 0 2px #fff +} +.ol-attribution li { + display:inline; + list-style:none; + line-height:inherit +} +.ol-attribution li:not(:last-child):after { + content:" " +} +.ol-attribution img { + max-height:2em; + max-width:inherit; + vertical-align:middle +} +.ol-attribution button,.ol-attribution ul { + display:inline-block +} +.ol-attribution.ol-collapsed ul { + display:none +} +.ol-attribution.ol-logo-only ul { + display:block +} +.ol-attribution:not(.ol-collapsed) { + background:rgba(255,255,255,.8) +} +.ol-attribution.ol-uncollapsible { + bottom:0; + right:0; + border-radius:4px 0 0; + height:1.1em; + line-height:1em +} +.ol-attribution.ol-logo-only { + background:0 0; + bottom:.4em; + height:1.1em; + line-height:1em +} +.ol-attribution.ol-uncollapsible img { + margin-top:-.2em; + max-height:1.6em +} +.ol-attribution.ol-logo-only button,.ol-attribution.ol-uncollapsible button { + display:none +} +.ol-zoomslider { + top:4.5em; + left:.5em; + height:200px +} +.ol-zoomslider button { + position:relative; + height:10px +} +.ol-touch .ol-zoomslider { + top:5.5em +} +.ol-overviewmap { + left:.5em; + bottom:.5em +} +.ol-overviewmap.ol-uncollapsible { + bottom:0; + left:0; + border-radius:0 4px 0 0 +} +.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button { + display:inline-block +} +.ol-overviewmap .ol-overviewmap-map { + border:1px solid #7b98bc; + height:150px; + margin:2px; + width:150px +} +.ol-overviewmap:not(.ol-collapsed) button { + bottom:1px; + left:2px; + position:absolute +} +.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button { + display:none +} +.ol-overviewmap:not(.ol-collapsed) { + background:rgba(255,255,255,.8) +} +.ol-overviewmap-box { + border:2px dotted rgba(0,60,136,.7) +} +.ol-overviewmap .ol-overviewmap-box:hover { + cursor:move +} diff --git a/ogn_python/static/files/ol/ol.js b/ogn_python/static/files/ol/ol.js new file mode 100755 index 0000000..4daad50 --- /dev/null +++ b/ogn_python/static/files/ol/ol.js @@ -0,0 +1,1073 @@ +// OpenLayers. See https://openlayers.org/ +// License: https://raw.githubusercontent.com/openlayers/openlayers/master/LICENSE.md +// Version: v4.6.5 +;(function (root, factory) { + if (typeof exports === "object") { + module.exports = factory(); + } else if (typeof define === "function" && define.amd) { + define([], factory); + } else { + root.ol = factory(); + } +}(this, function () { + var OPENLAYERS = {}; + var k,aa=this;function t(a,b){var c=OPENLAYERS;a=a.split(".");c=c||aa;a[0]in c||!c.execScript||c.execScript("var "+a[0]);for(var d;a.length&&(d=a.shift());)a.length||void 0===b?c[d]&&c[d]!==Object.prototype[d]?c=c[d]:c=c[d]={}:c[d]=b};var ba,da;function w(a,b){a.prototype=Object.create(b.prototype);a.prototype.constructor=a}function ea(){}function x(a){return a.xp||(a.xp=++fa)}var fa=0;function ha(a){this.message="Assertion failed. See https://openlayers.org/en/v4.6.5/doc/errors/#"+a+" for details.";this.code=a;this.name="AssertionError"}w(ha,Error);function ja(a,b,c,d){this.fa=a;this.la=b;this.ea=c;this.ka=d}function ka(a,b,c,d,e){return void 0!==e?(e.fa=a,e.la=b,e.ea=c,e.ka=d,e):new ja(a,b,c,d)}function ma(a,b,c){return a.fa<=b&&b<=a.la&&a.ea<=c&&c<=a.ka}function na(a,b){return a.fa==b.fa&&a.ea==b.ea&&a.la==b.la&&a.ka==b.ka};function oa(a,b){if(!a)throw new ha(b);};function pa(a,b,c){return Math.min(Math.max(a,b),c)}var qa=function(){var a;"cosh"in Math?a=Math.cosh:a=function(a){a=Math.exp(a);return(a+1/a)/2};return a}();function ra(a){oa(0a*b?a+b:a}function ya(a,b,c){return a+c*(b-a)};function za(a,b,c){void 0===c&&(c=[0,0]);c[0]=a[0]+2*b;c[1]=a[1]+2*b;return c}function Aa(a,b,c){void 0===c&&(c=[0,0]);c[0]=a[0]*b+.5|0;c[1]=a[1]*b+.5|0;return c}function Ba(a,b){if(Array.isArray(a))return a;void 0===b?b=[a,a]:b[0]=b[1]=a;return b};function Ca(a){for(var b=Da(),c=0,d=a.length;cd&&(g|=4);be&&(g|=2);0===g&&(g=1);return g}function Da(){return[Infinity,Infinity,-Infinity,-Infinity]}function Na(a,b,c,d,e){return e?(e[0]=a,e[1]=b,e[2]=c,e[3]=d,e):[a,b,c,d]}function Oa(a){return Na(Infinity,Infinity,-Infinity,-Infinity,a)}function Pa(a,b){var c=a[0];a=a[1];return Na(c,a,c,a,b)} +function Qa(a,b,c,d,e){e=Oa(e);return Ra(e,a,b,c,d)}function Sa(a,b){return a[0]==b[0]&&a[2]==b[2]&&a[1]==b[1]&&a[3]==b[3]}function Ta(a,b){b[0]a[2]&&(a[2]=b[2]);b[1]a[3]&&(a[3]=b[3]);return a}function Ea(a,b){b[0]a[2]&&(a[2]=b[0]);b[1]a[3]&&(a[3]=b[1])} +function Ra(a,b,c,d,e){for(;cb[0]?a[0]:b[0],c[1]=a[1]>b[1]?a[1]:b[1],c[2]=a[2]=b[0]&&a[1]<=b[3]&&a[3]>=b[1]}function bb(a){return a[2]Ab?f=Ab:f<-Ab&&(f=-Ab);b[e+1]=f}return b}function Db(a,b,c){var d=a.length;c=1b?1:ac)for(c=1;c>>0,d,e=0;e>=1}return c.join("")};function qc(a){this.minZoom=void 0!==a.minZoom?a.minZoom:0;this.b=a.resolutions;oa(nc(this.b,function(a,b){return b-a}),17);if(!a.origins)for(var b=0,c=this.b.length-1;b=a.minZoom;){2===a.l?(h=Math.floor(h/2),l=Math.floor(l/2),b=ka(h,h,l,l,d)):b=tc(a,f,g,d);if(c.call(null,g,b))return!0;--g}return!1}k.G=function(){return this.o};k.mj=function(){return this.maxZoom};k.nj=function(){return this.minZoom};k.Ic=function(a){return this.g?this.g:this.c[a]};k.Ta=function(a){return this.b[a]}; +k.oj=function(){return this.b};function vc(a,b,c,d){if(b[0]=Math.abs(c-f[0])&&25>=g)return!0}return!1}function Ed(a){var b=Fd(a,a),c=b.preventDefault;b.preventDefault=function(){a.preventDefault();c()};b.pointerId=1;b.isPrimary=!0;b.pointerType="mouse";return b}k=Cd.prototype; +k.Jm=function(a){if(!Dd(this,a)){(1).toString()in this.a&&this.cancel(a);var b=Ed(a);this.a[(1).toString()]=a;Gd(this.b,"pointerdown",b,a)}};k.Km=function(a){if(!Dd(this,a)){var b=Ed(a);Gd(this.b,"pointermove",b,a)}};k.Nm=function(a){if(!Dd(this,a)){var b=this.a[(1).toString()];b&&b.button===a.button&&(b=Ed(a),Gd(this.b,"pointerup",b,a),delete this.a[(1).toString()])}};k.Mm=function(a){if(!Dd(this,a)){var b=Ed(a);Hd(this.b,b,a)}};k.Lm=function(a){if(!Dd(this,a)){var b=Ed(a);Jd(this.b,b,a)}}; +k.cancel=function(a){var b=Ed(a);this.b.cancel(b,a);delete this.a[(1).toString()]};function Kd(a){Bd.call(this,a,{MSPointerDown:this.Sm,MSPointerMove:this.Tm,MSPointerUp:this.Wm,MSPointerOut:this.Um,MSPointerOver:this.Vm,MSPointerCancel:this.Rm,MSGotPointerCapture:this.Pm,MSLostPointerCapture:this.Qm});this.a=a.g;this.g=["","unavailable","touch","pen","mouse"]}w(Kd,Bd);function Ld(a,b){var c=b;"number"===typeof b.pointerType&&(c=Fd(b,b),c.pointerType=a.g[b.pointerType]);return c}k=Kd.prototype; +k.Sm=function(a){this.a[a.pointerId.toString()]=a;var b=Ld(this,a);Gd(this.b,"pointerdown",b,a)};k.Tm=function(a){var b=Ld(this,a);Gd(this.b,"pointermove",b,a)};k.Wm=function(a){var b=Ld(this,a);Gd(this.b,"pointerup",b,a);delete this.a[a.pointerId.toString()]};k.Um=function(a){var b=Ld(this,a);Jd(this.b,b,a)};k.Vm=function(a){var b=Ld(this,a);Hd(this.b,b,a)};k.Rm=function(a){var b=Ld(this,a);this.b.cancel(b,a);delete this.a[a.pointerId.toString()]}; +k.Qm=function(a){this.b.b(new Md("lostpointercapture",a,a))};k.Pm=function(a){this.b.b(new Md("gotpointercapture",a,a))};function Nd(a){Bd.call(this,a,{pointerdown:this.Kp,pointermove:this.Lp,pointerup:this.Op,pointerout:this.Mp,pointerover:this.Np,pointercancel:this.Jp,gotpointercapture:this.Wl,lostpointercapture:this.Hm})}w(Nd,Bd);k=Nd.prototype;k.Kp=function(a){Od(this.b,a)};k.Lp=function(a){Od(this.b,a)};k.Op=function(a){Od(this.b,a)};k.Mp=function(a){Od(this.b,a)};k.Np=function(a){Od(this.b,a)};k.Jp=function(a){Od(this.b,a)};k.Hm=function(a){Od(this.b,a)};k.Wl=function(a){Od(this.b,a)};function Md(a,b,c){Qc.call(this,a);this.b=b;a=c?c:{};this.buttons=Pd(a);this.pressure=Qd(a,this.buttons);this.bubbles="bubbles"in a?a.bubbles:!1;this.cancelable="cancelable"in a?a.cancelable:!1;this.view="view"in a?a.view:null;this.detail="detail"in a?a.detail:null;this.screenX="screenX"in a?a.screenX:0;this.screenY="screenY"in a?a.screenY:0;this.clientX="clientX"in a?a.clientX:0;this.clientY="clientY"in a?a.clientY:0;this.ctrlKey="ctrlKey"in a?a.ctrlKey:!1;this.altKey="altKey"in a?a.altKey:!1;this.shiftKey= +"shiftKey"in a?a.shiftKey:!1;this.metaKey="metaKey"in a?a.metaKey:!1;this.button="button"in a?a.button:0;this.relatedTarget="relatedTarget"in a?a.relatedTarget:null;this.pointerId="pointerId"in a?a.pointerId:0;this.width="width"in a?a.width:0;this.height="height"in a?a.height:0;this.tiltX="tiltX"in a?a.tiltX:0;this.tiltY="tiltY"in a?a.tiltY:0;this.pointerType="pointerType"in a?a.pointerType:"";this.isPrimary="isPrimary"in a?a.isPrimary:!1;b.preventDefault&&(this.preventDefault=function(){b.preventDefault()})} +w(Md,Qc);function Pd(a){if(a.buttons||Rd)a=a.buttons;else switch(a.which){case 1:a=1;break;case 2:a=4;break;case 3:a=2;break;default:a=0}return a}function Qd(a,b){var c=0;a.pressure?c=a.pressure:c=b?.5:0;return c}var Rd=!1;try{Rd=1===(new MouseEvent("click",{buttons:1})).buttons}catch(a){};function Sd(a,b){Bd.call(this,a,{touchstart:this.Qq,touchmove:this.Pq,touchend:this.Oq,touchcancel:this.Nq});this.a=a.g;this.j=b;this.g=void 0;this.f=0;this.c=void 0}w(Sd,Bd);k=Sd.prototype;k.Ej=function(){this.f=0;this.c=void 0}; +function Td(a,b,c){b=Fd(b,c);b.pointerId=c.identifier+2;b.bubbles=!0;b.cancelable=!0;b.detail=a.f;b.button=0;b.buttons=1;b.width=c.webkitRadiusX||c.radiusX||0;b.height=c.webkitRadiusY||c.radiusY||0;b.pressure=c.webkitForce||c.force||.5;b.isPrimary=a.g===c.identifier;b.pointerType="touch";b.clientX=c.clientX;b.clientY=c.clientY;b.screenX=c.screenX;b.screenY=c.screenY;return b} +function Ud(a,b,c){function d(){b.preventDefault()}var e=Array.prototype.slice.call(b.changedTouches),f=e.length,g;for(g=0;g=b.length){var e=[],f;for(f=0;fa.D||Math.abs(b.clientY-a.c.clientY)>a.D}k.ia=function(){this.v&&(Gc(this.v),this.v=null);this.s&&(Gc(this.s),this.s=null);this.i.forEach(Gc);this.i.length=0;this.a&&(Pc(this.a),this.a=null);this.f&&(Pc(this.f),this.f=null);Sc.prototype.ia.call(this)};function ge(a,b){this.s=a;this.c=b;this.b=[];this.g=[];this.a={}}ge.prototype.clear=function(){this.b.length=0;this.g.length=0;lb(this.a)};function he(a){var b=a.b,c=a.g,d=b[0];1==b.length?(b.length=0,c.length=0):(b[0]=b.pop(),c[0]=c.pop(),ie(a,0));b=a.c(d);delete a.a[b];return d}ge.prototype.i=function(a){oa(!(this.c(a)in this.a),31);var b=this.s(a);return Infinity!=b?(this.b.push(a),this.g.push(b),this.a[this.c(a)]=!0,je(this,0,this.b.length-1),!0):!1}; +function ie(a,b){for(var c=a.b,d=a.g,e=c.length,f=c[b],g=d[b],h=b;b>1;){var l=2*b+1,m=2*b+2;l=mb;){var g=c-1>>1;if(a[g]>f)d[c]=d[g],a[c]=a[g],c=g;else break}d[c]=e;a[c]=f} +function ke(a){var b=a.s,c=a.b,d=a.g,e=0,f=c.length,g;for(g=0;g>1)-1;0<=b;b--)ie(a,b)};function le(a,b){ge.call(this,function(b){return a.apply(null,b)},function(a){return a[0].lb()});this.v=b;this.j=0;this.f={}}w(le,ge);le.prototype.i=function(a){var b=ge.prototype.i.call(this,a);b&&y(a[0],"change",this.l,this);return b};le.prototype.l=function(a){a=a.target;var b=a.getState();if(2===b||3===b||4===b||5===b)Mc(a,"change",this.l,this),a=a.lb(),a in this.f&&(delete this.f[a],--this.j),this.v()}; +function me(a,b,c){for(var d=0,e=!1,f,g,h;a.je)return 1;if(e>d)return-1}return 0};function ze(a,b){a[0]+=b[0];a[1]+=b[1];return a}function Ae(a,b){var c=b.Bd(),d=b.xa();b=d[0];d=d[1];var e=a[0]-b;a=a[1]-d;0===e&&0===a&&(e=1);var f=Math.sqrt(e*e+a*a);return[b+c*e/f,d+c*a/f]}function Be(a,b){var c=a[0];a=a[1];var d=b[0],e=b[1];b=d[0];d=d[1];var f=e[0];e=e[1];var g=f-b,h=e-d;c=0===g&&0===h?0:(g*(c-b)+h*(a-d))/(g*g+h*h||0);0>=c?(a=b,c=d):1<=c?(a=f,c=e):(a=b+c*g,c=d+c*h);return[a,c]} +function Ce(a,b,c){b=wa(b+180,360)-180;var d=Math.abs(3600*b);c=c||0;var e=Math.pow(10,c),f=Math.floor(d/3600),g=Math.floor((d-3600*f)/60);d=Math.ceil((d-3600*f-60*g)*e)/e;60<=d&&(d=0,g+=1);60<=g&&(g=0,f+=1);return f+"\u00b0 "+xe(g)+"\u2032 "+xe(d,c)+"\u2033"+(0==b?"":" "+a.charAt(0>b?1:0))}function De(a,b,c){return a?b.replace("{x}",a[0].toFixed(c)).replace("{y}",a[1].toFixed(c)):""}function Ee(a,b){for(var c=!0,d=a.length-1;0<=d;--d)if(a[d]!=b[d]){c=!1;break}return c} +function Fe(a,b){var c=Math.cos(b);b=Math.sin(b);var d=a[1]*c+a[0]*b;a[0]=a[0]*c-a[1]*b;a[1]=d;return a}function Ge(a,b){a[0]*=b;a[1]*=b}function He(a,b){var c=a[0]-b[0];a=a[1]-b[1];return c*c+a*a}function Ie(a,b){return Math.sqrt(He(a,b))}function Je(a,b){return He(a,Be(a,b))}function Ke(a,b){return De(a,"{x}, {y}",b)};function Me(a){return Math.pow(a,3)}function Oe(a){return 1-Me(1-a)}function Pe(a){return 3*a*a-2*a*a*a}function Qe(a){return a};function Re(){return!0}function Se(){return!1};function Te(a,b,c,d,e,f){for(var g=f?f:[],h=0;ba||0!==this.f&&a<=this.f)return this;var b=a.toString();if(this.i.hasOwnProperty(b))return this.i[b];var c=this.xd(a);if(c.da().lengthe&&(e=f);f=h;g=l}return e}function qf(a,b,c,d,e){var f;var g=0;for(f=c.length;gh){for(;br&&(m=n,r=E)}r>e&&(l[(m-b)/d]=1,q+dla&&iala)&&(0>ca&&xaca)||(v[z++]=S,v[z++]=g,A=S,E=g);S=Ia;g=ta}}v[z++]=S;v[z++]=g}g=z}h.push(g);b=n}return g};function Df(a,b){hf.call(this);this.c=this.j=-1;this.na(a,b)}w(Df,hf);k=Df.prototype;k.clone=function(){var a=new Df(null);Ef(a,this.ja,this.A.slice());return a};k.Nb=function(a,b,c,d){if(df&&0<(m-h)*(f-l)-(e-h)*(n-l)&&g++:n<=f&&0>(m-h)*(f-l)-(e-h)*(n-l)&&g--;h=m;l=n}return 0!==g}function Hf(a,b,c,d,e,f){if(0===c.length||!Gf(a,b,c[0],d,e,f))return!1;var g;b=1;for(g=c.length;bv&&(m=(m+n)/2,Hf(a,b,c,d,m,q)&&(u=m,v=z)),m=n;isNaN(u)&&(u=e[f]);return g?(g.push(u,q,v),g):[u,q,v]};function Jf(a,b,c,d,e,f){for(var g=[a[b],a[b+1]],h=[],l;b+d=e[0]&&f[2]<=e[2]||f[1]>=e[1]&&f[3]<=e[3]?!0:Jf(a,b,c,d,function(a,b){var c=!1,d=Ma(e,a),f=Ma(e,b);if(1===d||1===f)c=!0;else{var g=e[0],h=e[1],r=e[2],u=e[3],v=b[0];b=b[1];a=(b-a[1])/(v-a[0]);f&2&&!(d&2)&&(c=v-(b-u)/a,c=c>=g&&c<=r);c||!(f&4)||d&4||(c=b-(v-r)*a,c=c>=h&&c<=u);c||!(f&8)||d&8||(c=v-(b-h)/a,c=c>=g&&c<=r);c||!(f&16)||d&16||(c=b-(v-g)*a,c=c>=h&&c<=u)}return c}):!1} +function Lf(a,b,c,d,e){var f=c[0];if(!(Kf(a,b,f,d,e)||Gf(a,b,f,d,e[0],e[1])||Gf(a,b,f,d,e[0],e[3])||Gf(a,b,f,d,e[2],e[1])||Gf(a,b,f,d,e[2],e[3])))return!1;if(1===c.length)return!0;b=1;for(f=c.length;ba||this.c.length<=a)return null;var b=new Df(null);Ef(b,this.ja,this.A.slice(0===a?0:this.c[a-1],this.c[a]));return b};k.Ud=function(){var a=this.ja,b=this.A,c=this.c,d=[],e=0,f;var g=0;for(f=c.length;g=a.minResolution&&ba.b.length)return!1;var b=Date.now()-a.f,c=a.b.length-3;if(a.b[c+2]b;)d-=3;b=a.b[c+2]-a.b[d+2];if(b<1E3/60)return!1;var e=a.b[c]-a.b[d];c=a.b[c+1]-a.b[d+1];a.g=Math.atan2(c,e);a.a=Math.sqrt(e*e+c*c)/b;return a.a>a.c};function Jg(a){Vc.call(this);this.v=null;this.Ha(!0);this.handleEvent=a.handleEvent}w(Jg,Vc);Jg.prototype.c=function(){return this.get("active")};Jg.prototype.i=function(){return this.v};Jg.prototype.Ha=function(a){this.set("active",a)};Jg.prototype.setMap=function(a){this.v=a};function Kg(a,b,c,d){if(void 0!==b){var e=a.Sa(),f=a.xa();void 0!==e&&f&&0=this.o}function vh(a){if(dh(a)){var b=this.a,c=a.pixel;b.c=this.f;b.g=c;sh(b);rh(b);this.b(new yh(zh,a.coordinate,a))}}th.prototype.U=function(){return this.a.U()}; +th.prototype.j=ea;function wh(a){if(!dh(a))return!0;this.a.setMap(null);this.s(a,this.f,a.pixel)&&(this.j(a),this.b(new yh(Ah,a.coordinate,a)));return!1}function uh(a){if(dh(a)&&Yg(a)&&this.C(a)){this.f=a.pixel;this.a.setMap(a.map);var b=this.a,c=this.f;b.c=this.f;b.g=c;sh(b);rh(b);this.b(new yh(Bh,a.coordinate,a));return!0}return!1}var Bh="boxstart",zh="boxdrag",Ah="boxend";function yh(a,b,c){Qc.call(this,a);this.coordinate=b;this.mapBrowserEvent=c}w(yh,Qc);function Ch(a){a=a?a:{};var b=a.condition?a.condition:bh;this.B=void 0!==a.duration?a.duration:200;this.T=void 0!==a.out?a.out:!1;th.call(this,{condition:b,className:a.className||"ol-dragzoom"})}w(Ch,th); +Ch.prototype.j=function(){var a=this.v,b=a.aa(),c=a.Cb(),d=this.U().G();if(this.T){var e=b.qd(c);d=[a.Ia(Wa(d)),a.Ia(Za(d))];a=Oa(void 0);var f;var g=0;for(f=d.length;gMath.abs(d)?Ph:Qh;if(this.l===Ph){b=b.aa();this.s?clearTimeout(this.s): +bg(b,1,1);this.s=setTimeout(this.B.bind(this),400);c=b.Pa()*Math.pow(2,d/300);var e=b.i,f=b.a,g=0;cf&&(c=Math.min(c,1.5*f),g=-1);if(this.a){var h=cg(b,c,this.a);b.ub(b.Sc(h))}b.gd(c);0===g&&this.O&&b.animate({resolution:b.constrainResolution(c,0g&&b.animate({resolution:f,easing:Oe,anchor:this.a,duration:500});this.f=a;return!1}this.j+=d;d=Math.max(this.$- +(a-this.f),0);clearTimeout(this.o);this.o=setTimeout(this.T.bind(this,b),d);return!1}Hh.prototype.B=function(){this.s=void 0;bg(this.v.aa(),1,-1)};Hh.prototype.T=function(a){a=a.aa();a.Ac()&&a.rd();Lg(a,-pa(this.j,-1,1),this.a,this.D);this.l=void 0;this.j=0;this.a=null;this.o=this.f=void 0};Hh.prototype.V=function(a){this.C=a;a||(this.a=null)};var Ph="trackpad",Qh="wheel";function Rh(a){fh.call(this,{handleDownEvent:Sh,handleDragEvent:Th,handleUpEvent:Uh});a=a||{};this.f=null;this.j=void 0;this.a=!1;this.s=0;this.C=void 0!==a.threshold?a.threshold:.3;this.o=void 0!==a.duration?a.duration:250}w(Rh,fh); +function Th(a){var b=0,c=this.l[0],d=this.l[1];c=Math.atan2(d.clientY-c.clientY,d.clientX-c.clientX);void 0!==this.j&&(b=c-this.j,this.s+=b,!this.a&&Math.abs(this.s)>this.C&&(this.a=!0));this.j=c;a=a.map;c=a.aa();if(c.l.rotation!==re){d=a.a.getBoundingClientRect();var e=hh(this.l);e[0]-=d.left;e[1]-=d.top;this.f=a.Ra(e);this.a&&(d=c.Sa(),a.render(),Kg(c,d+b,this.f))}} +function Uh(a){if(2>this.l.length){a=a.map.aa();bg(a,1,-1);if(this.a){var b=a.Sa(),c=this.f,d=this.o;b=a.constrainRotation(b,0);Kg(a,b,c,d)}return!1}return!0}function Sh(a){return 2<=this.l.length?(a=a.map,this.f=null,this.j=void 0,this.a=!1,this.s=0,this.D||bg(a.aa(),1,1),!0):!1}Rh.prototype.jd=Se;function Vh(a){fh.call(this,{handleDownEvent:Wh,handleDragEvent:Xh,handleUpEvent:Yh});a=a?a:{};this.s=a.constrainResolution||!1;this.f=null;this.o=void 0!==a.duration?a.duration:400;this.a=void 0;this.j=1}w(Vh,fh); +function Xh(a){var b=1,c=this.l[0],d=this.l[1],e=c.clientX-d.clientX;c=c.clientY-d.clientY;e=Math.sqrt(e*e+c*c);void 0!==this.a&&(b=this.a/e);this.a=e;a=a.map;e=a.aa();d=e.Pa();var f=e.a,g=e.i;c=d*b;c>f?(b=f/d,c=f):cthis.l.length){a=a.map.aa();bg(a,1,-1);var b=a.Pa();if(this.s||ba.a){var c=this.f,d=this.o;b=a.constrainResolution(b,0,this.j-1);Tg(a,b,c,d)}return!1}return!0}function Wh(a){return 2<=this.l.length?(a=a.map,this.f=null,this.a=void 0,this.j=1,this.D||bg(a.aa(),1,1),!0):!1}Vh.prototype.jd=Se;function Zh(a){a=a?a:{};var b=new B,c=new Gg(-.005,.05,100);(void 0!==a.altShiftDragRotate?a.altShiftDragRotate:1)&&b.push(new mh);(void 0!==a.doubleClickZoom?a.doubleClickZoom:1)&&b.push(new Ug({delta:a.zoomDelta,duration:a.zoomDuration}));(void 0!==a.dragPan?a.dragPan:1)&&b.push(new ih({kinetic:c}));(void 0!==a.pinchRotate?a.pinchRotate:1)&&b.push(new Rh);(void 0!==a.pinchZoom?a.pinchZoom:1)&&b.push(new Vh({constrainResolution:a.constrainResolution,duration:a.zoomDuration}));if(void 0!==a.keyboard? +a.keyboard:1)b.push(new Dh),b.push(new Fh({delta:a.zoomDelta,duration:a.zoomDuration}));(void 0!==a.mouseWheelZoom?a.mouseWheelZoom:1)&&b.push(new Hh({constrainResolution:a.constrainResolution,duration:a.zoomDuration}));(void 0!==a.shiftDragZoom?a.shiftDragZoom:1)&&b.push(new Ch({duration:a.zoomDuration}));return b};function $h(a,b,c,d){Sc.call(this);this.extent=a;this.a=c;this.resolution=b;this.state=d}w($h,Sc);$h.prototype.u=function(){this.b("change")};$h.prototype.G=function(){return this.extent};$h.prototype.getState=function(){return this.state};function ai(a,b,c,d,e){this.c=void 0!==e?e:null;$h.call(this,a,b,c,void 0!==e?0:2);this.g=d}w(ai,$h);ai.prototype.i=function(a){this.state=a?3:2;this.u()};ai.prototype.load=function(){0==this.state&&(this.state=1,this.u(),this.c(this.i.bind(this)))};ai.prototype.Y=function(){return this.g};function bi(a,b,c,d,e){Qc.call(this,a);this.vectorContext=b;this.frameState=c;this.context=d;this.glContext=e}w(bi,Qc);function ci(a){Sc.call(this);this.highWaterMark=void 0!==a?a:2048;this.i=0;this.a={};this.c=this.g=null}w(ci,Sc);function di(a){return a.i>a.highWaterMark}k=ci.prototype;k.clear=function(){this.i=0;this.a={};this.c=this.g=null;this.b("clear")};k.forEach=function(a,b){for(var c=this.g;c;)a.call(b,c.Pc,c.jc,this),c=c.kb}; +k.get=function(a){a=this.a[a];oa(void 0!==a,15);if(a===this.c)return a.Pc;a===this.g?(this.g=this.g.kb,this.g.Pb=null):(a.kb.Pb=a.Pb,a.Pb.kb=a.kb);a.kb=null;a.Pb=this.c;this.c=this.c.kb=a;return a.Pc};k.remove=function(a){var b=this.a[a];oa(void 0!==b,15);if(b===this.c){if(this.c=b.Pb)this.c.kb=null}else if(b===this.g){if(this.g=b.kb)this.g.Pb=null}else b.kb.Pb=b.Pb,b.Pb.kb=b.kb;delete this.a[a];--this.i;return b.Pc}; +k.pop=function(){var a=this.g;delete this.a[a.jc];a.kb&&(a.kb.Pb=null);this.g=a.kb;this.g||(this.c=null);--this.i;return a.Pc};k.replace=function(a,b){this.get(a);this.a[a].Pc=b};k.set=function(a,b){oa(!(a in this.a),16);b={jc:a,kb:null,Pb:this.c,Pc:b};this.c?this.c.kb=b:this.g=b;this.c=b;this.a[a]=b;++this.i};var ei=[0,0,0,1],fi=[],gi=[0,0,0,1],hi=[0,0,0,0],ii=new ci,ji={},ki=null,li={},ni=function(){function a(a){var b=mi();b.font="32px monospace";f=b.measureText("wmytzilWMYTZIL@#/&?$%10").width;var c=!0;"monospace"!=a&&(b.font="32px "+a+",monospace",c=b.measureText("wmytzilWMYTZIL@#/&?$%10").width!=f);return c}function b(){var b=!0,f;for(f in c)60>c[f]&&(a(f)?(c[f]=60,lb(li),ki=null,d.clear()):(++c[f],b=!1));b&&(window.clearInterval(e),e=void 0)}var c=ji,d=ii,e,f;return function(d){if(d=wg(d))for(var f= +0,g=d.length;f=e?1:2;var g=4===e||8===e;e=parseInt(d.substr(1+0*f,f),16);var h=parseInt(d.substr(1+1*f,f),16);var l=parseInt(d.substr(1+2*f,f),16);d=g?parseInt(d.substr(1+3*f,f), +16):255;1==f&&(e=(e<<4)+e,h=(h<<4)+h,l=(l<<4)+l,g&&(d=(d<<4)+d));f=[e,h,l,d/255]}else 0==d.indexOf("rgba(")?(d=d.slice(5,-1).split(",").map(Number),f=yi(d)):0==d.indexOf("rgb(")?(d=d.slice(4,-1).split(",").map(Number),d.push(1),f=yi(d)):oa(!1,14);d=f;a[c]=d;++b}return d}}();function yi(a){var b=[];b[0]=pa(a[0]+.5|0,0,255);b[1]=pa(a[1]+.5|0,0,255);b[2]=pa(a[2]+.5|0,0,255);b[3]=pa(a[3],0,1);return b};function zi(a){return"string"===typeof a||a instanceof CanvasPattern||a instanceof CanvasGradient?a:xi(a)};function Ai(){}k=Ai.prototype;k.Hh=function(){};k.Hb=function(){};k.Dd=function(){};k.cc=function(){};k.Ce=function(){};k.De=function(){};k.uc=function(){};k.vc=function(){};k.wc=function(){};k.xc=function(){};k.yc=function(){};k.zc=function(){};k.Wb=function(){};k.Oa=function(){};k.Zb=function(){};k.nb=function(){};function Bi(a,b,c,d,e){this.g=a;this.f=b;this.c=c;this.N=d;this.ob=e;this.M=this.b=this.a=this.Wa=this.O=this.T=null;this.$=this.V=this.v=this.B=this.C=this.D=0;this.ca=!1;this.i=this.ab=0;this.ra=!1;this.oa=0;this.ta="";this.Ub=this.ua=0;this.Ea=!1;this.s=this.La=0;this.qa=this.l=this.j=null;this.o=[];this.bb=We()}w(Bi,Ai); +function Ci(a,b,c){if(a.M){b=Te(b,0,c,2,a.N,a.o);c=a.g;var d=a.bb,e=c.globalAlpha;1!=a.v&&(c.globalAlpha=e*a.v);var f=a.ab;a.ca&&(f+=a.ob);var g;var h=0;for(g=b.length;ha.la&&(a.la=d.la),d.eaa.ka&&(a.ka=d.ka)):a[b][c]=d:(a[b]={},a[b][c]=d)} +function Wi(a,b,c,d,e,f,g,h,l,m){var n=x(b).toString();n in a.wantedTiles||(a.wantedTiles[n]={});var p=a.wantedTiles[n];a=a.tileQueue;var q,r,u;for(u=c.minZoom;u<=g;++u){var v=tc(c,f,u,v);var z=c.Ta(u);for(q=v.fa;q<=v.la;++q)for(r=v.ea;r<=v.ka;++r)if(g-u<=h){var A=b.ad(u,q,r,d,e);0==A.getState()&&(p[A.lb()]=!0,A.lb()in a.a||a.i([A,n,yc(c,A.ya),z]));void 0!==l&&l.call(m,A)}else b.kh(u,q,r,e)}};function Xi(a){Ki.call(this,a);this.V=We()}w(Xi,Ki);function Yi(a,b,c){var d=b.pixelRatio,e=b.size[0]*d,f=b.size[1]*d,g=b.viewState.rotation,h=$a(c),l=Za(c),m=Ya(c);c=Wa(c);af(b.coordinateToPixelTransform,h);af(b.coordinateToPixelTransform,l);af(b.coordinateToPixelTransform,m);af(b.coordinateToPixelTransform,c);a.save();qi(a,-g,e/2,f/2);a.beginPath();a.moveTo(h[0]*d,h[1]*d);a.lineTo(l[0]*d,l[1]*d);a.lineTo(m[0]*d,m[1]*d);a.lineTo(c[0]*d,c[1]*d);a.clip();qi(a,g,e/2,f/2)} +function Zi(a,b,c,d,e){var f=a.a;if(Tc(f,b)){var g=d.size[0]*d.pixelRatio,h=d.size[1]*d.pixelRatio,l=d.viewState.rotation;qi(c,-l,g/2,h/2);a=void 0!==e?e:$i(a,d,0);f.b(new bi(b,new Bi(c,d.pixelRatio,d.extent,a,d.viewState.rotation),d,c,null));qi(c,l,g/2,h/2)}}Xi.prototype.s=function(a,b,c,d){if(this.wa(a,b,0,Re,this))return c.call(d,this.a,null)};Xi.prototype.pf=function(a,b,c,d){Zi(this,"postcompose",a,b,d)}; +function $i(a,b,c){var d=b.viewState,e=b.pixelRatio,f=e/d.resolution;return ef(a.V,e*b.size[0]/2,e*b.size[1]/2,f,-f,-d.rotation,-d.center[0]+c,-d.center[1])};function aj(a){Xi.call(this,a);this.l=We();this.j=null}w(aj,Xi);aj.prototype.df=function(a,b,c){Zi(this,"precompose",c,a,void 0);var d=this.Y();if(d){var e=b.extent,f=void 0!==e&&!La(e,a.extent)&&hb(e,a.extent);f&&Yi(c,a,e);e=this.v();var g=c.globalAlpha;c.globalAlpha=b.opacity;c.drawImage(d,0,0,+d.width,+d.height,Math.round(e[4]),Math.round(e[5]),Math.round(d.width*e[0]),Math.round(d.height*e[3]));c.globalAlpha=g;f&&c.restore()}this.pf(c,a,b)}; +aj.prototype.wa=function(a,b,c,d,e){var f=this.a;return f.ha().wa(a,b.viewState.resolution,b.viewState.rotation,c,b.skippedFeatureUids,function(a){return d.call(e,a,f)})}; +aj.prototype.s=function(a,b,c,d){if(this.Y()){if(this.a.ha().wa!==ea)return Xi.prototype.s.apply(this,arguments);var e=af(this.l,a.slice());Ge(e,b.viewState.resolution/this.i);this.j||(this.j=hg(1,1));this.j.clearRect(0,0,1,1);this.j.drawImage(this.Y(),e[0],e[1],1,1,0,0,1,1);e=this.j.getImageData(0,0,1,1).data;if(0a.g){var b=0,c;for(c in a.b){var d=a.b[c];0!==(b++&3)||Tc(d)||(delete a.b[c],--a.a)}}}cj.prototype.get=function(a,b,c){a=b+":"+a+":"+(c?xi(c):"null");return a in this.b?this.b[a]:null};cj.prototype.set=function(a,b,c,d){this.b[b+":"+a+":"+(c?xi(c):"null")]=d;++this.a};cj.prototype.c=function(a){this.g=a;dj(this)};var ej=new cj;function fj(a,b){this.l=b;this.c={};this.v={}}w(fj,Oc);function gj(a){var b=a.viewState,c=a.coordinateToPixelTransform,d=a.pixelToCoordinateTransform;ef(c,a.size[0]/2,a.size[1]/2,1/b.resolution,-1/b.resolution,-b.rotation,-b.center[0],-b.center[1]);ff($e(d,c))}function hj(){dj(ej)}k=fj.prototype; +k.wa=function(a,b,c,d,e,f,g){function h(a,c){var f=x(a).toString(),g=b.layerStates[x(c)].Te;if(!(f in b.skippedFeatureUids)||g)return d.call(e,a,g?c:null)}var l,m=b.viewState,n=m.resolution,p=m.projection;m=a;if(p.g){p=p.G();var q=cb(p),r=a[0];if(rp[2])m=[r+q*Math.ceil((p[0]-r)/q),a[1]]}p=b.layerStatesArray;for(q=p.length-1;0<=q;--q){var u=p[q];r=u.layer;if(yg(u,n)&&f.call(g,r)&&(u=ij(this,r),r.ha()&&(l=u.wa(r.ha().D?m:a,b,c,h,e)),l))return l}}; +k.Ui=function(a,b,c,d,e){return void 0!==this.wa(a,b,c,Re,this,d,e)};function ij(a,b){var c=x(b).toString();if(c in a.c)return a.c[c];for(var d,e=a.S(),f=0,g=pg.length;fb?1:ae;){if(600l-h/2?-1:1);c(a,b,Math.max(e,Math.floor(b-l*n/h+m)),Math.min(f,Math.floor(b+(h-l)*n/h+m)),g)}h=a[b];l=e;n=f;d(a,e,b);for(0g(a[l],h);)l++;for(;0b?1:0}function f(a,b){if(!(this instanceof f))return new f(a,b);this.Lf=Math.max(4,a||9);this.wh=Math.max(2,Math.ceil(.4*this.Lf));b&&this.Ak(b);this.clear()}function g(a,b){h(a,0,a.children.length,b,a)}function h(a,b,c,d,e){e||(e=v(null));e.fa=Infinity;e.ea=Infinity;e.la=-Infinity;e.ka=-Infinity;for(var f;b=a.fa&&b.ka>=a.ea}function v(a){return{children:a,height:1,fb:!0,fa:Infinity,ea:Infinity,la:-Infinity,ka:-Infinity}}function z(a,b,c,d,e){for(var f=[b,c],g;f.length;)c=f.pop(),b=f.pop(),c-b<=d||(g= +b+Math.ceil((c-b)/d/2)*d,A(a,g,b,c,e),f.push(b,g,g,c))}var A=b;A.default=b;f.prototype={all:function(){return this.rh(this.data,[])},search:function(a){var b=this.data,c=[],d=this.xb;if(!u(a,b))return c;for(var e=[],f,g,h,l;b;){f=0;for(g=b.children.length;fthis.Lf)this.Dk(d, +b),b--;else break;this.uk(c,d,b)},Dk:function(a,b){var c=a[b],d=c.children.length,e=this.wh;this.vk(c,e,d);d=this.wk(c,e,d);d=v(c.children.splice(d,c.children.length-d));d.height=c.height;d.fb=c.fb;g(c,this.xb);g(d,this.xb);b?a[b-1].children.push(d):this.yh(c,d)},yh:function(a,b){this.data=v([a,b]);this.data.height=a.height+1;this.data.fb=!1;g(this.data,this.xb)},wk:function(a,b,c){var d,e;var f=e=Infinity;for(d=b;d<=c-b;d++){var g=h(a,0,d,this.xb);var l=h(a,d,c,this.xb);var m=Math.max(0,Math.min(g.la, +l.la)-Math.max(g.fa,l.fa))*Math.max(0,Math.min(g.ka,l.ka)-Math.max(g.ea,l.ea));g=p(g)+p(l);if(m=b;m--)n=a.children[m],l(f,a.fb?d(n):n),g+=q(f);return g}, +uk:function(a,b,c){for(;0<=c;c--)l(b[c],a)},yk:function(a){for(var b=a.length-1,c;0<=b;b--)0===a[b].children.length?0e.width?e.width-n:v;l=l+p>e.height?e.height-p:l;v=a.La;var ta=z[3]+u*r+z[1],la=z[0]+l*r+z[2],ca=c-z[3],ia=d-z[0];if(S||0!==q){var xa=[ca,ia];var Va=[ca+ta,ia];var ic=[ca+ta,ia+la];var Xa=[ca,ia+la]}z=null;0!==q?(f=c+f,g=d+g,z=ef(Ia,f,g,1,1,q,-f,-g),Oa(v),Ea(v,af(Ia,xa)),Ea(v,af(Ia,Va)),Ea(v,af(Ia,ic)),Ea(v,af(Ia,Xa))):Na(ca,ia,ca+ta,ia+la,v);q=b.canvas;q=v[0]<=q.width&& +0<=v[2]&&v[1]<=q.height&&0<=v[3];if(h){if(q||1!=h[4])Ta(h,v),(a=q?[b,z?z.slice(0):null,m,e,n,p,u,l,c,d,r]:null)&&S&&a.push(A,E,xa,Va,ic,Xa),h.push(a)}else q&&(S&&xj(a,b,xa,Va,ic,Xa,A,E),si(b,z,m,e,n,p,u,l,c,d,r))}function Aj(a,b){var c=a.pixelRatio;return 1==c?b:b.map(function(a){return a*c})} +function Bj(a,b,c,d,e,f,g){var h=a.coordinates.length,l=Cj(a);g&&(c+=e);g=[b[c],b[c+1]];var m=[NaN,NaN],n=!0,p;for(p=c+e;pXa&&(a.Xa(b),ta= +0);la>Xa&&(b.stroke(),la=0);ta||la||(b.beginPath(),v=z=NaN);++m;break;case 2:p=Z[1];var Le=h[p],Uf=h[p+1],Id=h[p+2]-Le,te=h[p+3]-Uf,Jh=Math.sqrt(Id*Id+te*te);b.moveTo(Le+Jh,Uf);b.arc(Le,Uf,Jh,0,2*Math.PI,!0);++m;break;case 3:b.closePath();++m;break;case 4:p=Z[1];q=Z[2];var Mg=Z[4],Ng=6==Z.length?Z[5]:void 0;ic.geometry=Z[3];ic.feature=Zb;m in xa||(xa[m]=[]);var Wf=xa[m];Ng?Ng(h,p,q,2,Wf):(Wf[0]=h[p],Wf[1]=h[p+1],Wf.length=2);Mg(Wf,ic);++m;break;case 6:p=Z[1];q=Z[2];Ia=Z[3];r=Z[4];u=Z[5];S=f?null: +Z[6];var rf=Z[7],yu=Z[8],zu=Z[9],Au=Z[10],Bu=Z[11],jp=Z[12],Cu=Z[13],Du=Z[14],Eu=Z[15];if(16sf[zp-2],Cp=Ap.length,Lh=sf[ve],Mh=sf[ve+1];ve+=2;for(var Og=sf[ve],Pg=sf[ve+1],Ok=0,Oi=Math.sqrt(Math.pow(Og-Lh,2)+Math.pow(Pg-Mh,2)),Yf="",Pk=0,Pi=0;PiMath.PI?-2*Math.PI:Qi<-Math.PI?2*Math.PI:0;if(Math.abs(Qi)>Iu){var Sg=null;break a}}var Ep=Ju/Oi,Fp=ya(Lh,Og,Ep),Gp=ya(Mh,Pg,Ep);Ni==Rg?(Kh&&(Xf[0]=Fp,Xf[1]=Gp,Xf[2]=Qg/2),Xf[4]=Yf):(Yf=Qk,Pk=Qg,Xf=[Fp,Gp,Qg/2,Rg,Yf],Kh?Nk.unshift(Xf):Nk.push(Xf),Ni=Rg);Bp+=Qg}Sg=Nk}if(Sg){var Ri;if(sp){var Zf=0;for(Ri=Sg.length;Zfthis.Wa&&(this.Wa=c.lineWidth,this.i=null)):(c.strokeStyle=void 0,c.lineCap=void 0,c.lineDash=null,c.lineDashOffset=void 0,c.lineJoin=void 0,c.lineWidth=void 0,c.miterLimit= +void 0)};k.Ah=function(a,b){var c=a.fillStyle;a=[10,c];"string"!==typeof c&&(b=b.G(),a.push([b[0],b[3]]));this.a.push(a)};k.pd=function(a){this.a.push([11,a.strokeStyle,a.lineWidth*this.pixelRatio,a.lineCap,a.lineJoin,a.miterLimit,Aj(this,a.lineDash),a.lineDashOffset*this.pixelRatio])};function Kj(a,b,c,d){var e=b.fillStyle;if("string"!==typeof e||b.Pk!=e)c.call(a,b,d),b.Pk=e} +function Lj(a,b,c){var d=b.strokeStyle,e=b.lineCap,f=b.lineDash,g=b.lineDashOffset,h=b.lineJoin,l=b.lineWidth,m=b.miterLimit;if(b.Vk!=d||b.Qk!=e||f!=b.Fh&&!jc(b.Fh,f)||b.Rk!=g||b.Sk!=h||b.Tk!=l||b.Uk!=m)c.call(a,b),b.Vk=d,b.Qk=e,b.Fh=f,b.Rk=g,b.Sk=h,b.Tk=l,b.Uk=m}function Fj(a,b){a.qa[2]=a.a.length;a.qa=null;a.T[2]=a.b.length;a.T=null;b=[7,b];a.a.push(b);a.b.push(b)}k.bf=ea;function Cj(a){a.i||(a.i=Ga(a.Ea),0e.maxAngle&&(S>E&&(E=S,n=Ia,A=m),S=0,Ia=m-h)),z=g,v=r,u=q);r=ta;q=la}g=S+g>E?[Ia,m]:[n,A];m=g[0];n=g[1]}else n=l[f];for(g=m;g=p)&&d.push(n[g],n[g+1]);g=d.length;if(0==g)return}g=Bj(this,d,0,g,h,!1,!1);Ej(this,b);if(e.backgroundFill||e.backgroundStroke)this.Oa(e.backgroundFill,e.backgroundStroke),Kj(this,this.state, +this.Ah,a),Lj(this,this.state,this.pd);Uj(this,l,c,g)}Fj(this,b)}}; +Sj.prototype.Y=function(a,b,c,d){var e=d+b+a+c+this.pixelRatio;if(!ii.a.hasOwnProperty(e)){var f=d?this.ab[d]||this.g:null,g=c?this.o[c]||this.c:null,h=this.s[b]||this.f,l=h.scale*this.pixelRatio,m=vj[h.textAlign||"center"];b=d&&f.lineWidth?f.lineWidth:0;a=a.split("\n");var n=a.length,p=[],q=h.font;var r=a.length;var u=0;var v;for(v=0;v=e)for(d=e;d=d;)Xj(c,a+b,a+d),Xj(c,a+d,a+b),Xj(c,a-d,a+b),Xj(c,a-b,a+d),Xj(c,a-b,a-d),Xj(c,a-d,a-b),Xj(c,a+d,a-b),Xj(c,a+b,a-d),d++,e+=1+2*d,0<2*(e-b)+1&&(--b,e+=1-2*b);return Wj[a]=c}k=Vj.prototype;k.Vb=function(a){var b=null;this.a&&(a?(b=this.g,b[4]++):(b=this.g=Da(),b.push(1)));return b};function Zj(a){for(var b in a.b){var c=a.b[b],d;for(d in c)c[d].bf()}} +k.wa=function(a,b,c,d,e,f,g){function h(a){for(var b=n.getImageData(0,0,l,l).data,c=0;cm[2];)++Ia,p=n*Ia,p=$i(this,a,p),r.Na(A,p,l,f),h-=n;p=$i(this,a,0)}qi(A,l,S/2,e/2);A!=c&&(z&&Zi(this,"render",A,a,p),v?(d=c.globalAlpha,c.globalAlpha=b.opacity,c.drawImage(A.canvas,-q,-u),c.globalAlpha=d):c.drawImage(A.canvas, +-q,-u),A.translate(-q,-u));v||(A.globalAlpha=E)}g&&c.restore();this.pf(c,a,b,p)};k.wa=function(a,b,c,d,e){if(this.c){var f=this.a,g={};return this.c.wa(a,b.viewState.resolution,b.viewState.rotation,c,{},function(a){var b=x(a).toString();if(!(b in g))return g[b]=!0,d.call(e,a,f)},null)}};k.Vi=function(){var a=this.a;a.Jb()&&this.c&&a.u()};k.Wi=function(){Mi(this)}; +k.$c=function(a){var b=this.a,c=b.ha();Ui(a,c);var d=a.viewHints[0],e=a.viewHints[1],f=b.ca,g=b.ra;if(!this.i&&!f&&d||!g&&e)return!0;f=a.extent;var h=a.viewState;g=h.projection;var l=h.resolution,m=a.pixelRatio;d=b.g;var n=b.f;e=b.get(ik);void 0===e&&(e=ck);f=Fa(f,n*l);n=h.projection.G();c.D&&h.projection.g&&!La(n,a.extent)&&(a=Math.max(cb(f)/2,cb(n)),f[0]=n[0]-a,f[2]=n[2]+a);if(!this.i&&this.o==l&&this.N==d&&this.v==e&&La(this.l,f))return this.j=!1,!0;this.c=null;this.i=!1;var p=new Vj(.5*l/m,f, +l,m,c.$,this.f,b.f);c.ae(f,l,g);a=function(a){var c=a.ib();if(c)var d=c.call(a,l);else(c=b.ib())&&(d=c(a,l));if(d){if(d){c=!1;if(Array.isArray(d))for(var e=0,f=d.length;e>1),h=+dc(g[e],c),0>h?l=e+1:(m=e,n=!h);e=n?l:~l;0>e?(c=(c-g[-e-2])/(g[-e-1]-g[-e-2]),b+=(-e-2)*d,g=ya(a[b],a[b+d],c),h=ya(a[b+1],a[b+d+1],c)):(g=a[b+e*d],h=a[b+e*d+1])}return f? +(f[0]=g,f[1]=h,f):[g,h]}function Sk(a,b,c,d,e,f){if(c==b)return null;if(e>1,e=a.j?1:Me(b/a.j)};function el(a,b,c,d,e,f){cl.call(this,a,b,f);this.f=d;this.l=c;this.M=new Image;null!==d&&(this.M.crossOrigin=d);this.c=null;this.v=e}w(el,cl);k=el.prototype;k.ia=function(){1==this.state&&(fl(this),this.M=gl());this.g&&Pc(this.g);this.state=5;this.u();cl.prototype.ia.call(this)};k.Y=function(){return this.M};k.lb=function(){return this.l};k.hn=function(){this.state=3;fl(this);this.M=gl();this.u()};k.jn=function(){this.state=this.M.naturalWidth&&this.M.naturalHeight?2:4;fl(this);this.u()}; +k.load=function(){3==this.state&&(this.state=0,this.M=new Image,null!==this.f&&(this.M.crossOrigin=this.f));0==this.state&&(this.state=1,this.u(),this.c=[Lc(this.M,"error",this.hn,this),Lc(this.M,"load",this.jn,this)],this.v(this,this.l))};function fl(a){a.c.forEach(Gc);a.c=null}function gl(){var a=hg(1,1);a.fillStyle="rgba(0,0,0,0)";a.fillRect(0,0,1,1);return a.canvas};function hl(a){this.b=a};function il(a){this.b=a}w(il,hl);il.prototype.S=function(){return 35632};function jl(a){this.b=a}w(jl,hl);jl.prototype.S=function(){return 35633};var kl=new il("precision mediump float;varying vec2 a;varying vec2 b;varying float c;varying float d;uniform float m;uniform vec4 n;uniform vec4 o;uniform vec2 p;void main(void){vec2 windowCenter=vec2((a.x+1.0)/2.0*p.x*d,(a.y+1.0)/2.0*p.y*d);vec2 windowOffset=vec2((b.x+1.0)/2.0*p.x*d,(b.y+1.0)/2.0*p.y*d);float radius=length(windowCenter-windowOffset);float dist=length(windowCenter-gl_FragCoord.xy);if(dist>radius+c){if(o.a==0.0){gl_FragColor=n;}else{gl_FragColor=o;}gl_FragColor.a=gl_FragColor.a-(dist-(radius+c));}else if(n.a==0.0){gl_FragColor=o;if(diststrokeDist){gl_FragColor=o;}else if(dist>=strokeDist-antialias){float step=smoothstep(strokeDist-antialias,strokeDist,dist);gl_FragColor=mix(n,o,step);}} gl_FragColor.a=gl_FragColor.a*m;if(gl_FragColor.a<=0.0){discard;}}"), +ll=new jl("varying vec2 a;varying vec2 b;varying float c;varying float d;attribute vec2 e;attribute float f;attribute float g;uniform mat4 h;uniform mat4 i;uniform mat4 j;uniform float k;uniform float l;void main(void){mat4 offsetMatrix=i*j;a=vec4(h*vec4(e,0.0,1.0)).xy;d=l;float lineWidth=k*l;c=lineWidth/2.0;if(lineWidth==0.0){lineWidth=2.0*l;}vec2 offset;float radius=g+3.0*l;//Until we get gl_VertexID in WebGL,we store an instruction.if(f==0.0){//Offsetting the edges of the triangle by lineWidth/2 is necessary,however//we should also leave some space for the antialiasing,thus we offset by lineWidth.offset=vec2(-1.0,1.0);}else if(f==1.0){offset=vec2(-1.0,-1.0);}else if(f==2.0){offset=vec2(1.0,-1.0);}else{offset=vec2(1.0,1.0);}gl_Position=h*vec4(e+offset*radius,0.0,1.0)+offsetMatrix*vec4(offset*lineWidth,0.0,0.0);b=vec4(h*vec4(e.x+g,e.y,0.0,1.0)).xy;if(distance(a,b)>20000.0){gl_Position=vec4(a,0.0,1.0);}}");function ml(a,b){this.g=a.getUniformLocation(b,"h");this.i=a.getUniformLocation(b,"i");this.c=a.getUniformLocation(b,"j");this.oa=a.getUniformLocation(b,"k");this.qa=a.getUniformLocation(b,"l");this.a=a.getUniformLocation(b,"m");this.C=a.getUniformLocation(b,"n");this.O=a.getUniformLocation(b,"o");this.T=a.getUniformLocation(b,"p");this.b=a.getAttribLocation(b,"e");this.j=a.getAttribLocation(b,"f");this.N=a.getAttribLocation(b,"g")};function nl(){return[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}function pl(a,b){a[0]=b[0];a[1]=b[1];a[4]=b[2];a[5]=b[3];a[12]=b[4];a[13]=b[5];return a};function ql(a,b){this.origin=eb(b);this.bb=We();this.Ea=We();this.La=We();this.V=nl();this.b=[];this.j=null;this.g=[];this.i=[];this.a=[];this.s=null;this.f=void 0}w(ql,Ai); +ql.prototype.Na=function(a,b,c,d,e,f,g,h,l,m,n){var p=a.b;if(this.f){var q=p.isEnabled(p.STENCIL_TEST);var r=p.getParameter(p.STENCIL_FUNC);var u=p.getParameter(p.STENCIL_VALUE_MASK);var v=p.getParameter(p.STENCIL_REF);var z=p.getParameter(p.STENCIL_WRITEMASK);var A=p.getParameter(p.STENCIL_FAIL);var E=p.getParameter(p.STENCIL_PASS_DEPTH_PASS);var S=p.getParameter(p.STENCIL_PASS_DEPTH_FAIL);p.enable(p.STENCIL_TEST);p.clear(p.STENCIL_BUFFER_BIT);p.stencilMask(255);p.stencilFunc(p.ALWAYS,1,255);p.stencilOp(p.KEEP, +p.KEEP,p.REPLACE);this.f.Na(a,b,c,d,e,f,g,h,l,m,n);p.stencilMask(0);p.stencilFunc(p.NOTEQUAL,1,255)}rl(a,34962,this.s);rl(a,34963,this.j);f=this.Bf(p,a,e,f);var Ia=Xe(this.bb);cf(Ia,2/(c*e[0]),2/(c*e[1]));bf(Ia,-d);df(Ia,-(b[0]-this.origin[0]),-(b[1]-this.origin[1]));b=Xe(this.La);cf(b,2/e[0],2/e[1]);e=Xe(this.Ea);0!==d&&bf(e,-d);p.uniformMatrix4fv(f.g,!1,pl(this.V,Ia));p.uniformMatrix4fv(f.i,!1,pl(this.V,b));p.uniformMatrix4fv(f.c,!1,pl(this.V,e));p.uniform1f(f.a,g);if(void 0===l)this.Od(p,a,h,!1); +else{m?a=this.Ee(p,a,h,l,n):(p.clear(p.COLOR_BUFFER_BIT|p.DEPTH_BUFFER_BIT),this.Od(p,a,h,!0),a=(a=l(null))?a:void 0);var ta=a}this.Cf(p,f);this.f&&(q||p.disable(p.STENCIL_TEST),p.clear(p.STENCIL_BUFFER_BIT),p.stencilFunc(r,v,u),p.stencilMask(z),p.stencilOp(A,S,E));return ta};function sl(a,b,c,d){a.drawElements(4,d-c,b.f?5125:5123,c*(b.f?4:2))};var tl=[0,0,0,1],ul=[],vl=[0,0,0,1];function wl(a,b,c,d,e,f){a=(c-a)*(f-b)-(e-a)*(d-b);return a<=xl&&a>=-xl?void 0:0f;f+=d)this.a[b++]=a[f],this.a[b++]=a[f+1],this.a[b++]=0,this.a[b++]=this.N,this.a[b++]=a[f],this.a[b++]=a[f+1],this.a[b++]=1,this.a[b++]=this.N,this.a[b++]=a[f],this.a[b++]=a[f+1],this.a[b++]=2,this.a[b++]=this.N,this.a[b++]=a[f],this.a[b++]= +a[f+1],this.a[b++]=3,this.a[b++]=this.N,this.b[c++]=e,this.b[c++]=e+1,this.b[c++]=e+2,this.b[c++]=e+2,this.b[c++]=e+3,this.b[c++]=e,e+=4}else this.c.u&&(this.l.pop(),this.l.length&&(d=this.l[this.l.length-1],this.c.fillColor=d[0],this.c.strokeColor=d[1],this.c.lineWidth=d[2],this.c.u=!1))};k.gb=function(){this.s=new yl(this.a);this.j=new yl(this.b);this.g.push(this.b.length);0===this.o.length&&0=h;){var l=this.g[g];var m=this.i[g];m=x(m).toString();c[m]&&(d!==f&&sl(a,b,d,f),f=l);g--;d=l}d!==f&&sl(a,b,d,f);d=f=h}}}; +k.Ee=function(a,b,c,d,e){var f,g;var h=this.g.length-2;var l=this.g[h+1];for(f=this.o.length-1;0<=f;--f){var m=this.l[f];a.uniform4fv(this.v.C,m[0]);Dl(this,a,m[1],m[2]);for(g=this.o[f];0<=h&&this.g[h]>=g;){m=this.g[h];var n=this.i[h];var p=x(n).toString();if(void 0===c[p]&&n.U()&&(void 0===e||hb(e,n.U().G()))&&(a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT),sl(a,b,m,l),l=d(n)))return l;h--;l=m}}};function Dl(a,b,c,d){b.uniform4fv(a.v.O,c);b.uniform1f(a.v.oa,d)} +k.Oa=function(a,b){if(b){var c=b.g;this.c.lineDash=c?c:ul;c=b.i;this.c.lineDashOffset=c?c:0;c=b.a;c instanceof CanvasGradient||c instanceof CanvasPattern?c=vl:c=vi(c).map(function(a,b){return 3!=b?a/255:a})||vl;b=b.c;b=void 0!==b?b:1}else c=[0,0,0,0],b=0;a=a?a.b:[0,0,0,0];a instanceof CanvasGradient||a instanceof CanvasPattern?a=tl:a=vi(a).map(function(a,b){return 3!=b?a/255:a})||tl;this.c.strokeColor&&jc(this.c.strokeColor,c)&&this.c.fillColor&&jc(this.c.fillColor,a)&&this.c.lineWidth===b||(this.c.u= +!0,this.c.fillColor=a,this.c.strokeColor=c,this.c.lineWidth=b,this.l.push([a,c,b]))};var El=new il("precision mediump float;varying vec2 a;varying float b;uniform float k;uniform sampler2D l;void main(void){vec4 texColor=texture2D(l,a);gl_FragColor.rgb=texColor.rgb;float alpha=texColor.a*b*k;if(alpha==0.0){discard;}gl_FragColor.a=alpha;}"),Fl=new jl("varying vec2 a;varying float b;attribute vec2 c;attribute vec2 d;attribute vec2 e;attribute float f;attribute float g;uniform mat4 h;uniform mat4 i;uniform mat4 j;void main(void){mat4 offsetMatrix=i;if(g==1.0){offsetMatrix=i*j;}vec4 offsets=offsetMatrix*vec4(e,0.0,0.0);gl_Position=h*vec4(c,0.0,1.0)+offsets;a=d;b=f;}");function Gl(a,b){this.g=a.getUniformLocation(b,"h");this.i=a.getUniformLocation(b,"i");this.c=a.getUniformLocation(b,"j");this.a=a.getUniformLocation(b,"k");this.b=a.getAttribLocation(b,"c");this.B=a.getAttribLocation(b,"d");this.v=a.getAttribLocation(b,"e");this.o=a.getAttribLocation(b,"f");this.D=a.getAttribLocation(b,"g")};function Hl(a,b){this.j=a;this.b=b;this.a={};this.c={};this.g={};this.s=this.v=this.i=this.l=null;(this.f=ec(da,"OES_element_index_uint"))&&b.getExtension("OES_element_index_uint");y(this.j,"webglcontextlost",this.zp,this);y(this.j,"webglcontextrestored",this.Ap,this)}w(Hl,Oc); +function rl(a,b,c){var d=a.b,e=c.b,f=String(x(c));if(f in a.a)d.bindBuffer(b,a.a[f].buffer);else{var g=d.createBuffer();d.bindBuffer(b,g);var h;34962==b?h=new Float32Array(e):34963==b&&(h=a.f?new Uint32Array(e):new Uint16Array(e));d.bufferData(b,h,c.a);a.a[f]={tc:c,buffer:g}}}function Bl(a,b){var c=a.b;b=String(x(b));var d=a.a[b];c.isContextLost()||c.deleteBuffer(d.buffer);delete a.a[b]}k=Hl.prototype; +k.ia=function(){Nc(this.j);var a=this.b;if(!a.isContextLost()){for(var b in this.a)a.deleteBuffer(this.a[b].buffer);for(b in this.g)a.deleteProgram(this.g[b]);for(b in this.c)a.deleteShader(this.c[b]);a.deleteFramebuffer(this.i);a.deleteRenderbuffer(this.s);a.deleteTexture(this.v)}};k.yp=function(){return this.b}; +function Il(a){if(!a.i){var b=a.b,c=b.createFramebuffer();b.bindFramebuffer(b.FRAMEBUFFER,c);var d=Jl(b,1,1),e=b.createRenderbuffer();b.bindRenderbuffer(b.RENDERBUFFER,e);b.renderbufferStorage(b.RENDERBUFFER,b.DEPTH_COMPONENT16,1,1);b.framebufferTexture2D(b.FRAMEBUFFER,b.COLOR_ATTACHMENT0,b.TEXTURE_2D,d,0);b.framebufferRenderbuffer(b.FRAMEBUFFER,b.DEPTH_ATTACHMENT,b.RENDERBUFFER,e);b.bindTexture(b.TEXTURE_2D,null);b.bindRenderbuffer(b.RENDERBUFFER,null);b.bindFramebuffer(b.FRAMEBUFFER,null);a.i=c; +a.v=d;a.s=e}return a.i}function Kl(a,b){var c=String(x(b));if(c in a.c)return a.c[c];var d=a.b,e=d.createShader(b.S());d.shaderSource(e,b.b);d.compileShader(e);return a.c[c]=e}function Cl(a,b,c){var d=x(b)+"/"+x(c);if(d in a.g)return a.g[d];var e=a.b,f=e.createProgram();e.attachShader(f,Kl(a,b));e.attachShader(f,Kl(a,c));e.linkProgram(f);return a.g[d]=f}k.zp=function(){lb(this.a);lb(this.c);lb(this.g);this.s=this.v=this.i=this.l=null};k.Ap=function(){}; +k.cd=function(a){if(a==this.l)return!1;this.b.useProgram(a);this.l=a;return!0};function Ll(a,b,c){var d=a.createTexture();a.bindTexture(a.TEXTURE_2D,d);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.LINEAR);a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.LINEAR);void 0!==b&&a.texParameteri(3553,10242,b);void 0!==c&&a.texParameteri(3553,10243,c);return d}function Jl(a,b,c){var d=Ll(a,void 0,void 0);a.texImage2D(a.TEXTURE_2D,0,a.RGBA,b,c,0,a.RGBA,a.UNSIGNED_BYTE,null);return d} +function Ml(a,b){var c=Ll(a,33071,33071);a.texImage2D(a.TEXTURE_2D,0,a.RGBA,a.RGBA,a.UNSIGNED_BYTE,b);return c};function Nl(a,b){ql.call(this,a,b);this.C=this.D=void 0;this.v=[];this.o=[];this.qa=this.oa=this.height=void 0;this.Wa=null;this.width=this.scale=this.rotation=this.rotateWithView=this.O=this.T=this.opacity=void 0}w(Nl,ql);k=Nl.prototype;k.Db=function(a){var b=this.s,c=this.j,d=this.ig(!0),e=a.b;return function(){if(!e.isContextLost()){var f;var g=0;for(f=d.length;g=m;){var n=this.g[h];var p=this.i[h];var q=x(p).toString();if(void 0===c[q]&&p.U()&&(void 0===e||hb(e,p.U().G()))&&(a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT),sl(a,b,n,g),g=d(p)))return g;g=n;h--}}}; +k.gb=function(){this.qa=this.oa=this.height=this.C=this.D=void 0;this.b=null;this.scale=this.rotation=this.rotateWithView=this.O=this.T=this.opacity=void 0;this.a=null;this.width=void 0};function Ql(a,b){Nl.call(this,a,b);this.l=[];this.c=[];this.B=[];this.N=[]}w(Ql,Nl);k=Ql.prototype;k.wc=function(a,b){this.g.push(this.b.length);this.i.push(b);b=a.da();Ol(this,b,b.length,a.pa())};k.yc=function(a,b){this.g.push(this.b.length);this.i.push(b);b=a.da();Ol(this,b,b.length,a.pa())}; +k.gb=function(a){var b=a.b;this.v.push(this.b.length);this.o.push(this.b.length);this.s=new yl(this.a);this.j=new yl(this.b);var c={};Pl(this.B,this.l,c,b);Pl(this.N,this.c,c,b);this.c=this.l=null;Nl.prototype.gb.call(this,a)}; +k.Zb=function(a){var b=a.Vc(),c=a.Y(1),d=a.He(),e=a.Eg(),f=a.i,g=a.bd(),h=a.s,l=a.f,m=a.oc();a=a.a;if(0===this.l.length)this.l.push(c);else{var n=this.l[this.l.length-1];x(n)!=x(c)&&(this.v.push(this.b.length),this.l.push(c))}0===this.c.length?this.c.push(e):(n=this.c[this.c.length-1],x(n)!=x(e)&&(this.o.push(this.b.length),this.c.push(e)));this.D=b[0];this.C=b[1];this.height=m[1];this.oa=d[1];this.qa=d[0];this.opacity=f;this.T=g[0];this.O=g[1];this.rotation=l;this.rotateWithView=h;this.scale=a;this.width= +m[0]};k.ig=function(a){return a?this.B.concat(this.N):this.B};k.ag=function(){return this.N};function Rl(a,b,c){var d=b-c;return a[0]===a[d]&&a[1]===a[d+1]&&3<(b-0)/c?!!mf(a,0,b,c):!1};var Sl=new il("precision mediump float;varying float a;varying vec2 aVertex;varying float c;uniform float m;uniform vec4 n;uniform vec2 o;uniform float p;void main(void){if(a>0.0){vec2 windowCoords=vec2((aVertex.x+1.0)/2.0*o.x*p,(aVertex.y+1.0)/2.0*o.y*p);if(length(windowCoords-gl_FragCoord.xy)>c*p){discard;}} gl_FragColor=n;float alpha=n.a*m;if(alpha==0.0){discard;}gl_FragColor.a=alpha;}"),Tl=new jl("varying float a;varying vec2 aVertex;varying float c;attribute vec2 d;attribute vec2 e;attribute vec2 f;attribute float g;uniform mat4 h;uniform mat4 i;uniform mat4 j;uniform float k;uniform float l;bool nearlyEquals(in float value,in float ref){float epsilon=0.000000000001;return value>=ref-epsilon&&value<=ref+epsilon;}void alongNormal(out vec2 offset,in vec2 nextP,in float turnDir,in float direction){vec2 dirVect=nextP-e;vec2 normal=normalize(vec2(-turnDir*dirVect.y,turnDir*dirVect.x));offset=k/2.0*normal*direction;}void miterUp(out vec2 offset,out float round,in bool isRound,in float direction){float halfWidth=k/2.0;vec2 tangent=normalize(normalize(f-e)+normalize(e-d));vec2 normal=vec2(-tangent.y,tangent.x);vec2 dirVect=f-e;vec2 tmpNormal=normalize(vec2(-dirVect.y,dirVect.x));float miterLength=abs(halfWidth/dot(normal,tmpNormal));offset=normal*direction*miterLength;round=0.0;if(isRound){round=1.0;}else if(miterLength>l+k){offset=halfWidth*tmpNormal*direction;}} bool miterDown(out vec2 offset,in vec4 projPos,in mat4 offsetMatrix,in float direction){bool degenerate=false;vec2 tangent=normalize(normalize(f-e)+normalize(e-d));vec2 normal=vec2(-tangent.y,tangent.x);vec2 dirVect=d-e;vec2 tmpNormal=normalize(vec2(-dirVect.y,dirVect.x));vec2 longOffset,shortOffset,longVertex;vec4 shortProjVertex;float halfWidth=k/2.0;if(length(f-e)>length(d-e)){longOffset=tmpNormal*direction*halfWidth;shortOffset=normalize(vec2(dirVect.y,-dirVect.x))*direction*halfWidth;longVertex=f;shortProjVertex=h*vec4(d,0.0,1.0);}else{shortOffset=tmpNormal*direction*halfWidth;longOffset=normalize(vec2(dirVect.y,-dirVect.x))*direction*halfWidth;longVertex=d;shortProjVertex=h*vec4(f,0.0,1.0);}vec4 p1=h*vec4(longVertex,0.0,1.0)+offsetMatrix*vec4(longOffset,0.0,0.0);vec4 p2=projPos+offsetMatrix*vec4(longOffset,0.0,0.0);vec4 p3=shortProjVertex+offsetMatrix*vec4(-shortOffset,0.0,0.0);vec4 p4=shortProjVertex+offsetMatrix*vec4(shortOffset,0.0,0.0);float denom=(p4.y-p3.y)*(p2.x-p1.x)-(p4.x-p3.x)*(p2.y-p1.y);float firstU=((p4.x-p3.x)*(p1.y-p3.y)-(p4.y-p3.y)*(p1.x-p3.x))/denom;float secondU=((p2.x-p1.x)*(p1.y-p3.y)-(p2.y-p1.y)*(p1.x-p3.x))/denom;float epsilon=0.000000000001;if(firstU>epsilon&&firstU<1.0-epsilon&&secondU>epsilon&&secondU<1.0-epsilon){shortProjVertex.x=p1.x+firstU*(p2.x-p1.x);shortProjVertex.y=p1.y+firstU*(p2.y-p1.y);offset=shortProjVertex.xy;degenerate=true;}else{float miterLength=abs(halfWidth/dot(normal,tmpNormal));offset=normal*direction*miterLength;}return degenerate;}void squareCap(out vec2 offset,out float round,in bool isRound,in vec2 nextP,in float turnDir,in float direction){round=0.0;vec2 dirVect=e-nextP;vec2 firstNormal=normalize(dirVect);vec2 secondNormal=vec2(turnDir*firstNormal.y*direction,-turnDir*firstNormal.x*direction);vec2 hypotenuse=normalize(firstNormal-secondNormal);vec2 normal=vec2(turnDir*hypotenuse.y*direction,-turnDir*hypotenuse.x*direction);float length=sqrt(c*c*2.0);offset=normal*length;if(isRound){round=1.0;}} void main(void){bool degenerate=false;float direction=float(sign(g));mat4 offsetMatrix=i*j;vec2 offset;vec4 projPos=h*vec4(e,0.0,1.0);bool round=nearlyEquals(mod(g,2.0),0.0);a=0.0;c=k/2.0;aVertex=projPos.xy;if(nearlyEquals(mod(g,3.0),0.0)||nearlyEquals(mod(g,17.0),0.0)){alongNormal(offset,f,1.0,direction);}else if(nearlyEquals(mod(g,5.0),0.0)||nearlyEquals(mod(g,13.0),0.0)){alongNormal(offset,d,-1.0,direction);}else if(nearlyEquals(mod(g,23.0),0.0)){miterUp(offset,a,round,direction);}else if(nearlyEquals(mod(g,19.0),0.0)){degenerate=miterDown(offset,projPos,offsetMatrix,direction);}else if(nearlyEquals(mod(g,7.0),0.0)){squareCap(offset,a,round,f,1.0,direction);}else if(nearlyEquals(mod(g,11.0),0.0)){squareCap(offset,a,round,d,-1.0,direction);}if(!degenerate){vec4 offsets=offsetMatrix*vec4(offset,0.0,0.0);gl_Position=projPos+offsets;}else{gl_Position=vec4(offset,0.0,1.0);}}");function Ul(a,b){this.g=a.getUniformLocation(b,"h");this.i=a.getUniformLocation(b,"i");this.c=a.getUniformLocation(b,"j");this.oa=a.getUniformLocation(b,"k");this.O=a.getUniformLocation(b,"l");this.a=a.getUniformLocation(b,"m");this.C=a.getUniformLocation(b,"n");this.T=a.getUniformLocation(b,"o");this.qa=a.getUniformLocation(b,"p");this.l=a.getAttribLocation(b,"d");this.b=a.getAttribLocation(b,"e");this.s=a.getAttribLocation(b,"f");this.f=a.getAttribLocation(b,"g")};function Vl(a,b){ql.call(this,a,b);this.v=null;this.o=[];this.l=[];this.c={strokeColor:null,lineCap:void 0,lineDash:null,lineDashOffset:void 0,lineJoin:void 0,lineWidth:void 0,miterLimit:void 0,u:!1}}w(Vl,ql); +function Wl(a,b,c,d){var e,f=a.a.length,g=a.b.length,h="bevel"===a.c.lineJoin?0:"miter"===a.c.lineJoin?1:2,l="butt"===a.c.lineCap?0:"square"===a.c.lineCap?1:2,m=Rl(b,c,d),n=g,p=1;for(e=0;ec&&(this.g.push(c),this.i.push(b),this.c.u&&(this.l.push(c),this.c.u=!1))}; +function gm(a,b,c,d){Rl(b,b.length,d)||(b.push(b[0]),b.push(b[1]));Wl(a,b,b.length,d);if(c.length){var e;b=0;for(e=c.length;b=n;){var p=this.g[m]; +var q=this.i[m];q=x(q).toString();c[q]&&(g!==l&&(sl(a,b,g,l),a.clear(a.DEPTH_BUFFER_BIT)),l=p);m--;g=p}g!==l&&(sl(a,b,g,l),a.clear(a.DEPTH_BUFFER_BIT));g=l=n}}d||(a.disable(a.DEPTH_TEST),a.clear(a.DEPTH_BUFFER_BIT),a.depthMask(f),a.depthFunc(e))}; +k.Ee=function(a,b,c,d,e){var f,g;var h=this.g.length-2;var l=this.g[h+1];for(f=this.l.length-1;0<=f;--f){var m=this.o[f];im(this,a,m[0],m[1],m[2]);for(g=this.l[f];0<=h&&this.g[h]>=g;){m=this.g[h];var n=this.i[h];var p=x(n).toString();if(void 0===c[p]&&n.U()&&(void 0===e||hb(e,n.U().G()))&&(a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT),sl(a,b,m,l),l=d(n)))return l;h--;l=m}}};function im(a,b,c,d,e){b.uniform4fv(a.v.C,c);b.uniform1f(a.v.oa,d);b.uniform1f(a.v.O,e)} +k.Oa=function(a,b){a=b.f;this.c.lineCap=void 0!==a?a:"round";a=b.g;this.c.lineDash=a?a:ul;a=b.i;this.c.lineDashOffset=a?a:0;a=b.j;this.c.lineJoin=void 0!==a?a:"round";a=b.a;a instanceof CanvasGradient||a instanceof CanvasPattern?a=vl:a=vi(a).map(function(a,b){return 3!=b?a/255:a})||vl;var c=b.c;c=void 0!==c?c:1;b=b.l;b=void 0!==b?b:10;this.c.strokeColor&&jc(this.c.strokeColor,a)&&this.c.lineWidth===c&&this.c.miterLimit===b||(this.c.u=!0,this.c.strokeColor=a,this.c.lineWidth=c,this.c.miterLimit=b, +this.o.push([a,c,b]))};var Zl=3,$l=5,Yl=7,am=11,bm=13,cm=17,dm=19,em=23;var jm=new il("precision mediump float;uniform vec4 e;uniform float f;void main(void){gl_FragColor=e;float alpha=e.a*f;if(alpha==0.0){discard;}gl_FragColor.a=alpha;}"),km=new jl("attribute vec2 a;uniform mat4 b;uniform mat4 c;uniform mat4 d;void main(void){gl_Position=b*vec4(a,0.0,1.0);}");function lm(a,b){this.g=a.getUniformLocation(b,"b");this.i=a.getUniformLocation(b,"c");this.c=a.getUniformLocation(b,"d");this.C=a.getUniformLocation(b,"e");this.a=a.getUniformLocation(b,"f");this.b=a.getAttribLocation(b,"a")};function mm(){this.b=this.a=this.g=void 0;this.c=0}function nm(a){var b=a.b;if(b){var c=b.next,d=b.Eb;c&&(c.Eb=d);d&&(d.next=c);a.b=c||d;a.g===a.a?(a.b=void 0,a.g=void 0,a.a=void 0):a.g===b?a.g=a.b:a.a===b&&(a.a=d?a.b.Eb:a.b);a.c--}}function om(a){a.b=a.g;if(a.b)return a.b.data}function pm(a){if(a.b&&a.b.next)return a.b=a.b.next,a.b.data}function qm(a){if(a.b&&a.b.next)return a.b.next.data}function rm(a){if(a.b&&a.b.Eb)return a.b=a.b.Eb,a.b.data}function sm(a){if(a.b&&a.b.Eb)return a.b.Eb.data} +function tm(a){if(a.b)return a.b.data}mm.prototype.concat=function(a){if(a.b){if(this.b){var b=this.b.next;this.b.next=a.g;a.g.Eb=this.b;b.Eb=a.a;a.a.next=b;this.c+=a.c}else this.b=a.b,this.g=a.g,this.a=a.a,this.c=a.c;a.b=void 0;a.g=void 0;a.a=void 0;a.c=0}};function um(){this.a=rj.Jc(void 0);this.b={}}k=um.prototype;k.Ca=function(a,b){a={fa:a[0],ea:a[1],la:a[2],ka:a[3],value:b};this.a.Ca(a);this.b[x(b)]=a};k.load=function(a,b){for(var c=Array(b.length),d=0,e=b.length;d=g;p-=c)q=Im(a,b[p],b[p+1],h++),m.push(Jm(n,q,d)),l.push([Math.min(n.x,q.x),Math.min(n.y,q.y),Math.max(n.x,q.x),Math.max(n.y,q.y)]),n=q;m.push(Jm(q,f,d));l.push([Math.min(n.x,q.x), +Math.min(n.y,q.y),Math.max(n.x,q.x),Math.max(n.y,q.y)]);e.load(l,m)}function Dm(a){var b=om(a),c=b,d=[c.Z.x,c.Z.y];do c=pm(a),c.Z.x>d[0]&&(d=[c.Z.x,c.Z.y]);while(c!==b);return d}function Em(a,b,c){var d=om(a),e=d,f=pm(a),g=!1;do{var h=c?wl(f.X.x,f.X.y,e.X.x,e.X.y,e.Z.x,e.Z.y):wl(e.Z.x,e.Z.y,e.X.x,e.X.y,f.X.x,f.X.y);void 0===h?(Km(e,f,a,b),g=!0,f===d&&(d=qm(a)),f=e,rm(a)):e.X.Kb!==h&&(e.X.Kb=h,g=!0);e=f;f=pm(a)}while(e!==d);return g} +function Gm(a,b,c,d,e){for(var f=om(a);f.X.x!==b;)f=pm(a);b=f.X;d={x:d,y:b.y,qb:-1};var g=Infinity,h;var l=Fm({Z:b,X:d},e,!0);var m=0;for(h=l.length;mxl&&d<1-xl&&c>xl&&c<1-xl||e&&0<=d&&1>=d&&0<=c&&1>=c))return[a.x+d*(b.x-a.x),a.y+d*(b.y-a.y)]} +function Qm(a,b,c,d,e){if(void 0===b.Kb||void 0===d.Kb)return!1;var f=(c.x-d.x)*(b.y-d.y)>(c.y-d.y)*(b.x-d.x);e=(e.x-d.x)*(b.y-d.y)<(e.y-d.y)*(b.x-d.x);a=(a.x-b.x)*(d.y-b.y)>(a.y-b.y)*(d.x-b.x);c=(c.x-b.x)*(d.y-b.y)<(c.y-b.y)*(d.x-b.x);b=b.Kb?c||a:c&&a;return(d.Kb?e||f:e&&f)&&b}k=Am.prototype; +k.xc=function(a,b){var c=a.td(),d=a.pa(),e=this.b.length,f=this.f.b.length;a=a.da();var g,h,l;var m=h=0;for(g=c.length;me&&(this.g.push(e),this.i.push(b),this.l.u&&(this.c.push(e),this.l.u=!1));this.f.b.length>f&&hm(this.f, +b,f)};k.zc=function(a,b){var c=a.pb(),d=a.pa();if(0=n;){var p=this.g[m];var q=this.i[m];q=x(q).toString(); +c[q]&&(g!==l&&(sl(a,b,g,l),a.clear(a.DEPTH_BUFFER_BIT)),l=p);m--;g=p}g!==l&&(sl(a,b,g,l),a.clear(a.DEPTH_BUFFER_BIT));g=l=n}}d||(a.disable(a.DEPTH_TEST),a.clear(a.DEPTH_BUFFER_BIT),a.depthMask(f),a.depthFunc(e))}; +k.Ee=function(a,b,c,d,e){var f,g;var h=this.g.length-2;var l=this.g[h+1];for(f=this.c.length-1;0<=f;--f){var m=this.o[f];a.uniform4fv(this.v.C,m);for(g=this.c[f];0<=h&&this.g[h]>=g;){m=this.g[h];var n=this.i[h];var p=x(n).toString();if(void 0===c[p]&&n.U()&&(void 0===e||hb(e,n.U().G()))&&(a.clear(a.COLOR_BUFFER_BIT|a.DEPTH_BUFFER_BIT),sl(a,b,m,l),l=d(n)))return l;h--;l=m}}}; +k.Oa=function(a,b){a=a?a.b:[0,0,0,0];a instanceof CanvasGradient||a instanceof CanvasPattern?a=tl:a=vi(a).map(function(a,b){return 3!=b?a/255:a})||tl;this.l.fillColor&&jc(a,this.l.fillColor)||(this.l.fillColor=a,this.l.u=!0,this.o.push(a));b?this.f.Oa(null,b):this.f.Oa(null,new Ak({color:[0,0,0,0],lineWidth:0}))};function Rm(a,b){this.b=b;this.a=[{x:0,y:0,width:a,height:a}];this.c={};this.g=hg(a,a);this.i=this.g.canvas}Rm.prototype.get=function(a){return this.c[a]||null}; +Rm.prototype.add=function(a,b,c,d,e){var f;var g=0;for(f=this.a.length;g=b+this.b&&h.height>=c+this.b)return f={offsetX:h.x+this.b,offsetY:h.y+this.b,image:this.i},this.c[a]=f,d.call(e,this.g,h.x+this.b,h.y+this.b),a=g,b+=this.b,d=c+this.b,h.width-b>h.height-d?(c={x:h.x+b,y:h.y,width:h.width-b,height:h.height},b={x:h.x,y:h.y+d,width:b,height:h.height-d},Sm(this,a,c,b)):(c={x:h.x+b,y:h.y,width:h.width-b,height:d},b={x:h.x,y:h.y+d,width:h.width,height:h.height-d}, +Sm(this,a,c,b)),f}return null};function Sm(a,b,c,d){b=[b,1];0this.g||c+this.b>this.g)return null;d=Wm(this,!1,a,b,c,d,f);if(!d)return null;a=Wm(this,!0,a,b,c,void 0!==e?e:ea,f);return Vm(d,a)};function Wm(a,b,c,d,e,f,g){var h=b?a.i:a.f,l;var m=0;for(l=h.length;ma[0]||a[0]>e[0]||0>a[1]||a[1]>e[1])&&(this.i|| +(this.i=hg(1,1)),this.i.clearRect(0,0,1,1),this.i.drawImage(this.M.Y(),a[0],a[1],1,1,0,0,1,1),e=this.i.getImageData(0,0,1,1).data,0d?b[0]=d-c:0>e&&(b[0]=Math.abs(e)+c),0>f?b[1]=f-c:0>g&&(b[1]=Math.abs(g)+c),0=== +b[0]&&0===b[1])||(c=a.aa().xa(),c=a.Ia(c),b=[c[0]+b[0],c[1]+b[1]],a.aa().animate({center:a.Ra(b),duration:this.autoPanAnimation.duration,easing:this.autoPanAnimation.easing}))}}};k.rm=function(){Hn(this)};k.Hj=function(a){this.set(Cn,a)};k.setMap=function(a){this.set(Dn,a)};k.Mj=function(a){this.set(En,a)};k.We=function(a){this.set(Fn,a)};function In(a,b){var c=a.getBoundingClientRect();a=c.left+window.pageXOffset;c=c.top+window.pageYOffset;return[a,c,a+b[0],c+b[1]]}k.Pj=function(a){this.set(Gn,a)}; +function Jn(a,b){a.a.visible!==b&&(a.element.style.display=b?"":"none",a.a.visible=b)} +function Hn(a){var b=a.Ve(),c=a.pi();if(b&&b.c&&c){c=b.Ia(c);var d=b.Cb();b=a.element.style;var e=a.Xh(),f=a.Yh();Jn(a,!0);var g=e[0];e=e[1];if("bottom-right"==f||"center-right"==f||"top-right"==f)""!==a.a.Se&&(a.a.Se=b.left=""),g=Math.round(d[0]-c[0]-g)+"px",a.a.xf!=g&&(a.a.xf=b.right=g);else{""!==a.a.xf&&(a.a.xf=b.right="");if("bottom-center"==f||"center-center"==f||"top-center"==f)g-=a.element.offsetWidth/2;g=Math.round(c[0]+g)+"px";a.a.Se!=g&&(a.a.Se=b.left=g)}if("bottom-left"==f||"bottom-center"== +f||"bottom-right"==f)""!==a.a.Ef&&(a.a.Ef=b.top=""),c=Math.round(d[1]-c[1]-e)+"px",a.a.ze!=c&&(a.a.ze=b.bottom=c);else{""!==a.a.ze&&(a.a.ze=b.bottom="");if("center-left"==f||"center-center"==f||"center-right"==f)e-=a.element.offsetHeight/2;c=Math.round(c[1]+e)+"px";a.a.Ef!=c&&(a.a.Ef=b.top=c)}}else Jn(a,!1)}var Cn="element",Dn="map",En="offset",Fn="position",Gn="positioning";function Kn(a,b,c,d,e,f){cl.call(this,a,b,f);this.c=0;this.l=null;this.v=d;this.a=null;this.f={};this.C=e;this.N=c}w(Kn,cl);k=Kn.prototype;k.ia=function(){this.a=null;this.f={};this.state=5;this.u();cl.prototype.ia.call(this)};k.G=function(){return this.l||Ln};k.qn=function(){return this.v};k.pn=function(){return this.a};k.lb=function(){return this.N};k.rn=function(){return this.o};function ok(a,b,c){return a.f[x(b)+","+c]} +k.load=function(){0==this.state&&(oj(this,1),this.C(this,this.N),this.D(null,NaN,null))};k.Cp=function(a,b,c){this.vg(b);this.Ij(a);this.ri(c)};k.Bp=function(){oj(this,3)};k.ri=function(a){this.l=a};k.Ij=function(a){this.a=a;oj(this,2)};k.vg=function(a){this.o=a};k.ug=function(a){this.D=a};var Ln=[0,0,4096,4096];function Mn(a){a=a?a:{};this.c=void 0!==a.className?a.className:"ol-full-screen";var b=void 0!==a.label?a.label:"\u2922";this.l="string"===typeof b?document.createTextNode(b):b;b=void 0!==a.labelActive?a.labelActive:"\u00d7";this.v="string"===typeof b?document.createTextNode(b):b;var c=a.tipLabel?a.tipLabel:"Toggle full-screen";b=document.createElement("button");b.className=this.c+"-"+Nn();b.setAttribute("type","button");b.title=c;b.appendChild(this.l);y(b,"click",this.C,this);c=document.createElement("div"); +c.className=this.c+" ol-unselectable ol-control "+(On()?"":"ol-unsupported");c.appendChild(b);vg.call(this,{element:c,target:a.target});this.D=void 0!==a.keys?a.keys:!1;this.j=a.source}w(Mn,vg); +Mn.prototype.C=function(a){a.preventDefault();On()&&(a=this.a)&&(Nn()?document.exitFullscreen?document.exitFullscreen():document.msExitFullscreen?document.msExitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen():(a=this.j?"string"===typeof this.j?document.getElementById(this.j):this.j:a.Cc(),this.D?a.mozRequestFullScreenWithKeys?a.mozRequestFullScreenWithKeys():a.webkitRequestFullscreen?a.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT): +Pn(a):Pn(a)))};Mn.prototype.o=function(){var a=this.element.firstElementChild,b=this.a;Nn()?(a.className=this.c+"-true",ig(this.v,this.l)):(a.className=this.c+"-false",ig(this.l,this.v));b&&b.Oc()};Mn.prototype.setMap=function(a){vg.prototype.setMap.call(this,a);a&&this.s.push(y(document,Qn(),this.o,this))}; +function On(){var a=document.body;return!!(a.webkitRequestFullscreen||a.mozRequestFullScreen&&document.mozFullScreenEnabled||a.msRequestFullscreen&&document.msFullscreenEnabled||a.requestFullscreen&&document.fullscreenEnabled)}function Nn(){return!!(document.webkitIsFullScreen||document.mozFullScreen||document.msFullscreenElement||document.fullscreenElement)} +function Pn(a){a.requestFullscreen?a.requestFullscreen():a.msRequestFullscreen?a.msRequestFullscreen():a.mozRequestFullScreen?a.mozRequestFullScreen():a.webkitRequestFullscreen&&a.webkitRequestFullscreen()}var Qn=function(){var a;return function(){if(!a){var b=document.body;b.webkitRequestFullscreen?a="webkitfullscreenchange":b.mozRequestFullScreen?a="mozfullscreenchange":b.msRequestFullscreen?a="MSFullscreenChange":b.requestFullscreen&&(a="fullscreenchange")}return a}}();function Rn(a){a=a?a:{};var b=document.createElement("DIV");b.className=void 0!==a.className?a.className:"ol-mouse-position";vg.call(this,{element:b,render:a.render?a.render:Sn,target:a.target});y(this,Xc(Tn),this.En,this);a.coordinateFormat&&this.Gj(a.coordinateFormat);a.projection&&this.ti(a.projection);this.o=void 0!==a.undefinedHTML?a.undefinedHTML:"";this.v=b.innerHTML;this.l=this.j=this.c=null}w(Rn,vg); +function Sn(a){a=a.frameState;a?this.c!=a.viewState.projection&&(this.c=a.viewState.projection,this.j=null):this.c=null;Un(this,this.l)}k=Rn.prototype;k.En=function(){this.j=null};k.Qh=function(){return this.get(Vn)};k.si=function(){return this.get(Tn)};k.mm=function(a){this.l=this.a.ud(a);Un(this,this.l)};k.nm=function(){Un(this,null);this.l=null};k.setMap=function(a){vg.prototype.setMap.call(this,a);a&&(a=a.a,this.s.push(y(a,"mousemove",this.mm,this),y(a,"mouseout",this.nm,this)))}; +k.Gj=function(a){this.set(Vn,a)};k.ti=function(a){this.set(Tn,Ob(a))};function Un(a,b){var c=a.o;if(b&&a.c){if(!a.j){var d=a.si();a.j=d?Pb(a.c,d):$b}if(b=a.a.Ra(b))a.j(b,b),c=(c=a.Qh())?c(b):b.toString()}a.v&&c==a.v||(a.element.innerHTML=c,a.v=c)}var Tn="projection",Vn="coordinateFormat";function Wn(a){function b(a){a=h.Sd(a);l.a.aa().ub(a);window.removeEventListener("mousemove",c);window.removeEventListener("mouseup",b)}function c(a){a=h.Sd({clientX:a.clientX-n.offsetWidth/2,clientY:a.clientY+n.offsetHeight/2});m.We(a)}a=a?a:{};this.j=void 0!==a.collapsed?a.collapsed:!0;this.l=void 0!==a.collapsible?a.collapsible:!0;this.l||(this.j=!1);var d=void 0!==a.className?a.className:"ol-overviewmap",e=void 0!==a.tipLabel?a.tipLabel:"Overview map",f=void 0!==a.collapseLabel?a.collapseLabel: +"\u00ab";"string"===typeof f?(this.o=document.createElement("span"),this.o.textContent=f):this.o=f;f=void 0!==a.label?a.label:"\u00bb";"string"===typeof f?(this.D=document.createElement("span"),this.D.textContent=f):this.D=f;var g=this.l&&!this.j?this.o:this.D;f=document.createElement("button");f.setAttribute("type","button");f.title=e;f.appendChild(g);y(f,"click",this.Hn,this);this.C=document.createElement("DIV");this.C.className="ol-overviewmap-map";var h=this.c=new G({controls:new B,interactions:new B, +view:a.view});a.layers&&a.layers.forEach(function(a){h.xe(a)},this);e=document.createElement("DIV");e.className="ol-overviewmap-box";e.style.boxSizing="border-box";this.v=new Bn({position:[0,0],positioning:"bottom-left",element:e});this.c.ye(this.v);e=document.createElement("div");e.className=d+" ol-unselectable ol-control"+(this.j&&this.l?" ol-collapsed":"")+(this.l?"":" ol-uncollapsible");e.appendChild(this.C);e.appendChild(f);vg.call(this,{element:e,render:a.render?a.render:Xn,target:a.target}); +var l=this,m=this.v,n=this.v.Rd();n.addEventListener("mousedown",function(){window.addEventListener("mousemove",c);window.addEventListener("mouseup",b)})}w(Wn,vg);k=Wn.prototype;k.setMap=function(a){var b=this.a;a!==b&&(b&&((b=b.aa())&&Mc(b,Xc("rotation"),this.Qe,this),this.c.Ad(null)),vg.prototype.setMap.call(this,a),a&&(this.c.Ad(this.C),this.s.push(y(a,"propertychange",this.lm,this)),0===this.c.Xe().kc()&&this.c.zf(a.hc()),a=a.aa()))&&(y(a,Xc("rotation"),this.Qe,this),ag(a)&&(this.c.Oc(),Yn(this)))}; +k.lm=function(a){"view"===a.key&&((a=a.oldValue)&&Mc(a,Xc("rotation"),this.Qe,this),a=this.a.aa(),y(a,Xc("rotation"),this.Qe,this))};k.Qe=function(){this.c.aa().ce(this.a.aa().Sa())};function Xn(){var a=this.a,b=this.c;if(a.c&&b.c){var c=a.Cb();a=a.aa().qd(c);var d=b.Cb();c=b.aa().qd(d);var e=b.Ia($a(a)),f=b.Ia(Ya(a));b=Math.abs(e[0]-f[0]);e=Math.abs(e[1]-f[1]);f=d[0];d=d[1];b<.1*f||e<.1*d||b>.75*f||e>.75*d?Yn(this):La(c,a)||(a=this.c,c=this.a.aa(),a.aa().ub(c.xa()))}Zn(this)} +function Yn(a){var b=a.a;a=a.c;var c=b.Cb();b=b.aa().qd(c);a=a.aa();ib(b,1/(.1*Math.pow(2,Math.log(7.5)/Math.LN2/2)));a.Uf(b)}function Zn(a){var b=a.a,c=a.c;if(b.c&&c.c){var d=b.Cb(),e=b.aa(),f=c.aa();c=e.Sa();b=a.v;var g=a.v.Rd(),h=e.qd(d);d=f.Pa();e=Wa(h);f=Za(h);if(a=a.a.aa().xa()){var l=[e[0]-a[0],e[1]-a[1]];Fe(l,c);ze(l,a)}b.We(l);g&&(g.style.width=Math.abs((e[0]-f[0])/d)+"px",g.style.height=Math.abs((f[1]-e[1])/d)+"px")}}k.Hn=function(a){a.preventDefault();$n(this)}; +function $n(a){a.element.classList.toggle("ol-collapsed");a.j?ig(a.o,a.D):ig(a.D,a.o);a.j=!a.j;var b=a.c;a.j||b.c||(b.Oc(),Yn(a),Lc(b,"postrender",function(){Zn(this)},a))}k.Gn=function(){return this.l};k.Jn=function(a){this.l!==a&&(this.l=a,this.element.classList.toggle("ol-uncollapsible"),!a&&this.j&&$n(this))};k.In=function(a){this.l&&this.j!==a&&$n(this)};k.Fn=function(){return this.j};k.Hl=function(){return this.c};function ao(a){a=a?a:{};var b=void 0!==a.className?a.className:"ol-scale-line";this.l=document.createElement("DIV");this.l.className=b+"-inner";this.c=document.createElement("DIV");this.c.className=b+" ol-unselectable";this.c.appendChild(this.l);this.o=null;this.v=void 0!==a.minWidth?a.minWidth:64;this.j=!1;this.B=void 0;this.D="";vg.call(this,{element:this.c,render:a.render?a.render:bo,target:a.target});y(this,Xc(co),this.V,this);this.O(a.units||"metric")}w(ao,vg);var eo=[1,2,5];ao.prototype.C=function(){return this.get(co)}; +function bo(a){(a=a.frameState)?this.o=a.viewState:this.o=null;fo(this)}ao.prototype.V=function(){fo(this)};ao.prototype.O=function(a){this.set(co,a)}; +function fo(a){var b=a.o;if(b){var c=b.center,d=b.projection,e=a.C();b=Nb(d,b.resolution,c,"degrees"==e?"degrees":"m");"degrees"!=e&&(b*=d.Bc());var f=a.v*b;c="";"degrees"==e?(c=ub.degrees,"degrees"==d.a?f*=c:b/=c,ff?(c="in",b/=.0254):1609.344>f?(c="ft",b/=.3048):(c="mi",b/=1609.344):"nautical"==e?(b/=1852,c="nm"):"metric"==e?.001>f?(c="\u03bcm",b*=1E6):1>f?(c="mm",b*=1E3):1E3>f?c="m":(c="km",b/=1E3):"us"==e?.9144>f? +(c="in",b*=39.37):1609.344>f?(c="ft",b/=.30480061):(c="mi",b/=1609.3472):oa(!1,33);for(e=3*Math.floor(Math.log(a.v*b)/Math.log(10));;){f=eo[(e%3+3)%3]*Math.pow(10,Math.floor(e/3));d=Math.round(f/b);if(isNaN(d)){a.c.style.display="none";a.j=!1;return}if(d>=a.v)break;++e}b=f+" "+c;a.D!=b&&(a.l.innerHTML=b,a.D=b);a.B!=d&&(a.l.style.width=d+"px",a.B=d);a.j||(a.c.style.display="",a.j=!0)}else a.j&&(a.c.style.display="none",a.j=!1)}var co="units";function go(a){a=a?a:{};this.c=void 0;this.j=ho;this.D=this.v=0;this.O=null;this.$=!1;this.V=void 0!==a.duration?a.duration:200;var b=void 0!==a.className?a.className:"ol-zoomslider",c=document.createElement("button");c.setAttribute("type","button");c.className=b+"-thumb ol-unselectable";var d=document.createElement("div");d.className=b+" ol-unselectable ol-control";d.appendChild(c);this.l=new Xd(d);y(this.l,"pointerdown",this.$l,this);y(this.l,"pointermove",this.Yl,this);y(this.l,"pointerup",this.Zl, +this);y(d,"click",this.Xl,this);y(c,"click",Rc);vg.call(this,{element:d,render:a.render?a.render:io})}w(go,vg);go.prototype.ia=function(){Pc(this.l);vg.prototype.ia.call(this)};var ho=0;k=go.prototype;k.setMap=function(a){vg.prototype.setMap.call(this,a);a&&a.render()}; +function io(a){if(a.frameState){if(!this.$){var b=this.element,c=b.offsetWidth,d=b.offsetHeight,e=b.firstElementChild,f=getComputedStyle(e);b=e.offsetWidth+parseFloat(f.marginRight)+parseFloat(f.marginLeft);e=e.offsetHeight+parseFloat(f.marginTop)+parseFloat(f.marginBottom);this.O=[b,e];c>d?(this.j=1,this.D=c-b):(this.j=ho,this.v=d-e);this.$=!0}a=a.frameState.viewState.resolution;a!==this.c&&(this.c=a,jo(this,a))}} +k.Xl=function(a){var b=this.a.aa();a=ko(this,pa(1===this.j?(a.offsetX-this.O[0]/2)/this.D:(a.offsetY-this.O[1]/2)/this.v,0,1));b.animate({resolution:b.constrainResolution(a),duration:this.V,easing:Oe})};k.$l=function(a){this.o||a.b.target!==this.element.firstElementChild||(bg(this.a.aa(),1,1),this.C=a.clientX,this.B=a.clientY,this.o=!0)}; +k.Yl=function(a){if(this.o){var b=this.element.firstElementChild;this.c=ko(this,pa(1===this.j?(a.clientX-this.C+parseInt(b.style.left,10))/this.D:(a.clientY-this.B+parseInt(b.style.top,10))/this.v,0,1));this.a.aa().gd(this.c);jo(this,this.c);this.C=a.clientX;this.B=a.clientY}};k.Zl=function(){if(this.o){var a=this.a.aa();bg(a,1,-1);a.animate({resolution:a.constrainResolution(this.c),duration:this.V,easing:Oe});this.o=!1;this.B=this.C=void 0}}; +function jo(a,b){b=1-gg(a.a.aa())(b);var c=a.element.firstElementChild;1==a.j?c.style.left=a.D*b+"px":c.style.top=a.v*b+"px"}function ko(a,b){return fg(a.a.aa())(1-b)};function lo(a){a=a?a:{};this.extent=a.extent?a.extent:null;var b=void 0!==a.className?a.className:"ol-zoom-extent",c=void 0!==a.label?a.label:"E",d=void 0!==a.tipLabel?a.tipLabel:"Fit to extent",e=document.createElement("button");e.setAttribute("type","button");e.title=d;e.appendChild("string"===typeof c?document.createTextNode(c):c);y(e,"click",this.c,this);c=document.createElement("div");c.className=b+" ol-unselectable ol-control";c.appendChild(e);vg.call(this,{element:c,target:a.target})} +w(lo,vg);lo.prototype.c=function(a){a.preventDefault();a=this.a.aa();var b=this.extent?this.extent:a.v.G();a.Uf(b)};var mo=document.implementation.createDocument("","",null);function no(a,b){return mo.createElementNS(a,b)}function oo(a,b){return po(a,b,[]).join("")}function po(a,b,c){if(a.nodeType==Node.CDATA_SECTION_NODE||a.nodeType==Node.TEXT_NODE)b?c.push(String(a.nodeValue).replace(/(\r\n|\r|\n)/g,"")):c.push(a.nodeValue);else for(a=a.firstChild;a;a=a.nextSibling)po(a,b,c);return c}function qo(a){return a instanceof Document}function ro(a){return a instanceof Node} +function so(a){return(new DOMParser).parseFromString(a,"application/xml")}function to(a,b){return function(c,d){c=a.call(b,c,d);void 0!==c&&gc(d[d.length-1],c)}}function uo(a,b){return function(c,d){c=a.call(void 0!==b?b:this,c,d);void 0!==c&&d[d.length-1].push(c)}}function vo(a,b){return function(c,d){c=a.call(void 0!==b?b:this,c,d);void 0!==c&&(d[d.length-1]=c)}} +function wo(a){return function(b,c){var d=a.call(this,b,c);if(void 0!==d){c=c[c.length-1];b=b.localName;var e;b in c?e=c[b]:e=c[b]=[];e.push(d)}}}function L(a,b){return function(c,d){var e=a.call(this,c,d);void 0!==e&&(d[d.length-1][void 0!==b?b:c.localName]=e)}}function M(a,b){return function(c,d,e){a.call(void 0!==b?b:this,c,d,e);e[e.length-1].node.appendChild(c)}} +function xo(a){var b,c;return function(d,e,f){if(void 0===b){b={};var g={};g[d.localName]=a;b[d.namespaceURI]=g;c=yo(d.localName)}zo(b,c,e,f)}}function yo(a,b){return function(c,d,e){c=d[d.length-1].node;d=a;void 0===d&&(d=e);e=b;void 0===b&&(e=c.namespaceURI);return no(e,d)}}var Ao=yo();function Bo(a,b){for(var c=b.length,d=Array(c),e=0;eh.status){var a=b.S();if("json"==a||"text"==a)var e=h.responseText;else"xml"==a?(e=h.responseXML)||(e=so(h.responseText)):"arraybuffer"==a&&(e=h.response);e?c.call(this,b.Qa(e,{featureProjection:g}),b.sb(e),b.cg()):d.call(this)}else d.call(this)}.bind(this);h.onerror=function(){d.call(this)}.bind(this); +h.send()}}function Fo(a,b){return Eo(a,b,function(a){this.Qc(a)},ea)};function Go(){this.i=this.defaultDataProjection=null}function Ho(a,b,c){var d;c&&(d={dataProjection:c.dataProjection?c.dataProjection:a.sb(b),featureProjection:c.featureProjection});return Io(a,d)}function Io(a,b){return kb({dataProjection:a.defaultDataProjection,featureProjection:a.i},b)}Go.prototype.cg=function(){return null}; +function Jo(a,b,c){var d=c?Ob(c.featureProjection):null,e=c?Ob(c.dataProjection):null,f;d&&e&&!Xb(d,e)?a instanceof gf?f=(b?a.clone():a).mb(b?d:e,b?e:d):f=bc(a,e,d):f=a;if(b&&c&&void 0!==c.decimals){var g=Math.pow(10,c.decimals);f===a&&(f=f.clone());f.Rc(function(a){for(var b=0,c=a.length;ba||this.c.length<=a)return null;var b=new I(null);b.ba(this.ja,this.A.slice(0===a?0:this.c[a-1],this.c[a]));return b}; +k.wd=function(){var a=this.A,b=this.c,c=this.ja,d=[],e=0,f;var g=0;for(f=b.length;ga||b<=a)return null;b=new C(null);b.ba(this.ja,this.A.slice(a*this.a,(a+1)*this.a));return b};k.de=function(){var a=this.A,b=this.ja,c=this.a,d=[],e;var f=0;for(e=a.length;fa||this.c.length<=a)return null;if(0===a)var b=0;else b=this.c[a-1],b=b[b.length-1];a=this.c[a].slice();var c=a[a.length-1];if(0!==b){var d;var e=0;for(d=a.length;ea||0!==this.f&&ac;++c){var d=parseInt(b[c],10).toString(16);b[c]=1==d.length?"0"+d:d}ip(a,b.join(""))}function us(a,b,c){a={node:a};var d=b.S();if("GeometryCollection"==d){var e=b.vd();var f=vs}else"MultiPoint"==d?(e=b.de(),f=ws):"MultiLineString"==d?(e=b.wd(),f=xs):"MultiPolygon"==d?(e=b.Vd(),f=ys):oa(!1,39);Do(a,zs,f,e,c)}function As(a,b,c){Do({node:a},Bs,Cs,[b],c)} +function Ds(a,b,c){var d={node:a};b.c&&a.setAttribute("id",b.c);a=b.L();var e={address:1,description:1,name:1,open:1,phoneNumber:1,styleUrl:1,visibility:1};e[b.a]=1;var f=Object.keys(a||{}).sort().filter(function(a){return!e[a]});if(0>4;if(128>f)return d(a,g,b);f=e[c.ga++];g|=(f&127)<<3;if(128>f)return d(a,g,b);f=e[c.ga++];g|=(f&127)<<10;if(128>f)return d(a,g,b);f=e[c.ga++];g|=(f&127)<<17;if(128>f)return d(a,g,b);f=e[c.ga++];g|=(f&127)<<24;if(128>f)return d(a,g,b);f=e[c.ga++];if(128>f)return d(a,g|(f&1)<<31,b);throw Error("Expected varint not more than 10 bytes"); +}function d(a,b,c){return c?4294967296*b+(a>>>0):4294967296*(b>>>0)+(a>>>0)}var e={read:function(a,b,c,d,e){var f=8*e-d-1;var g=(1<>1,l=-7;e=c?e-1:0;var m=c?-1:1,v=a[b+e];e+=m;c=v&(1<<-l)-1;v>>=-l;for(l+=f;0>=-l;for(l+=d;0>1,m=23===e?Math.pow(2, +-24)-Math.pow(2,-77):0;n=d?0:n-1;var z=d?1:-1,A=0>b||0===b&&0>1/b?1:0;b=Math.abs(b);isNaN(b)||Infinity===b?(b=isNaN(b)?1:0,d=h):(d=Math.floor(Math.log(b)/Math.LN2),1>b*(f=Math.pow(2,-d))&&(d--,f*=2),b=1<=d+l?b+m/f:b+m*Math.pow(2,1-l),2<=b*f&&(d++,f/=2),d+l>=h?(b=0,d=h):1<=d+l?(b=(b*f-1)*Math.pow(2,e),d+=l):(b=b*Math.pow(2,l-1)*Math.pow(2,e),d=0));for(;8<=e;a[c+n]=b&255,n+=z,b/=256,e-=8);d=d<>3,f=this.ga;this.type=d&7;a(e,b,this);this.ga===f&&this.Lq(d)}return b},Zp:function(){var a=e.read(this.tc,this.ga,!0,23,4);this.ga+=4;return a},Vp:function(){var a=e.read(this.tc,this.ga,!0,52,8);this.ga+=8;return a},Ua:function(a){var b=this.tc;var d=b[this.ga++];var e=d&127;if(128>d)return e;d=b[this.ga++];e|=(d&127)<<7;if(128>d)return e;d=b[this.ga++];e|=(d&127)<<14;if(128>d)return e;d=b[this.ga++];e|=(d&127)<<21;if(128>d)return e;d=b[this.ga]; +return c(e|(d&15)<<28,a,this)},lq:function(){return this.Ua(!0)},Ug:function(){var a=this.Ua();return 1===a%2?(a+1)/-2:a/2},Tp:function(){return!!this.Ua()},Vg:function(){for(var a=this.Ua()+this.ga,b=this.tc,c="",d=this.ga;da)break;if(1===p)128>e&&(n=e);else if(2===p){var q=b[d+1];128===(q&192)&&(n=(e&31)<<6|q&63,127>=n&&(n=null))}else if(3===p){q=b[d+1];var r=b[d+2];128===(q&192)&&128===(r&192)&&(n=(e&15)<<12|(q&63)<<6|r&63,2047>=n||55296<= +n&&57343>=n)&&(n=null)}else if(4===p){q=b[d+1];r=b[d+2];var u=b[d+3];128===(q&192)&&128===(r&192)&&128===(u&192)&&(n=(e&15)<<18|(q&63)<<12|(r&63)<<6|u&63,65535>=n||1114112<=n)&&(n=null)}null===n?(n=65533,p=1):65535>>10&1023|55296),n=56320|n&1023);c+=String.fromCharCode(n);d+=p}this.ga=a;return c},Lq:function(a){a&=7;if(a===b.c)for(;127>3,a=1===a?c.Vg():2===a?c.Zp():3===a?c.Vp():4===a?c.lq():5===a?c.Ua():6===a?c.Ug():7===a?c.Tp():null;b.values.push(a)}} +function mt(a,b,c){if(1==a)b.id=c.Ua();else if(2==a)for(a=c.Ua()+c.ga;c.ga>=3),n--,1===m||2===m?(p+=b.Ug(),q+=b.Ug(),1===m&&r>u&&(l.push(r),u=r),g.push(p,q),r+=2):7===m?r>u&&(g.push(g[u],g[u+1]),r+=2):oa(!1,59);r>u&&l.push(r);b=h.length;var v;1===d?v=1===b?"Point":"MultiPoint":2===d?v=1===b?"LineString":"MultiLineString":3===d&&(v="Polygon");d=v;if(a.b===it)g=new a.b(d, +g,h,f,e);else{if("Polygon"==d){d=[];l=b=v=0;for(c=h.length;lc?~(c<<1):c<<1;b="";d=0;for(c=a.length;d>=5;g+=String.fromCharCode(f+63);b+=g}return b} +function zt(a,b){b=b?b:1E5;var c=[],d=0,e=0,f;var g=0;for(f=a.length;gh?(c.push(d),e=d=0):e+=5}a=0;for(d=c.length;a>1):e>>1;a=0;for(d=c.length;a=b||"."==b||"-"==b){c.type=4;b=a.b;var d=!1,e=!1;do{if("."==f)d=!0;else if("e"==f||"E"==f)e=!0;var f=a.a.charAt(++a.b)}while("0"<=f&&"9">=f||"."==f&&(void 0===d||!d)||!e&&("e"==f||"E"==f)||e&&("-"==f||"+"==f));a=parseFloat(a.a.substring(b,a.b--));c.value=a}else if("a"<=b&&"z">=b||"A"<=b&&"Z">=b){c.type=1;b=a.b;do f=a.a.charAt(++a.b);while("a"<=f&&"z">= +f||"A"<=f&&"Z">=f);a=a.a.substring(b,a.b--).toUpperCase();c.value=a}else{if(" "==b||"\t"==b||"\r"==b||"\n"==b)return Uu(a);if(""===b)c.type=6;else throw Error("Unexpected character: "+b);}return c}function Qu(a){this.g=a;this.a="XY"}function Su(a){a.b=Uu(a.g)}function Vu(a,b){(b=a.b.type==b)&&Su(a);return b} +function Tu(a){var b=a.b;if(Vu(a,1)){b=b.value;var c="XY",d=a.b;1==a.b.type&&(d=d.value,"Z"===d?c="XYZ":"M"===d?c="XYM":"ZM"===d&&(c="XYZM"),"XY"!==c&&Su(a));a.a=c;if("GEOMETRYCOLLECTION"==b){a:{if(Vu(a,2)){b=[];do b.push(Tu(a));while(Vu(a,5));if(Vu(a,3)){a=b;break a}}else if(Wu(a)){a=[];break a}throw Error(Xu(a));}return new Mq(a)}d=Yu[b];c=Zu[b];if(!d||!c)throw Error("Invalid geometry type: "+b);b=d.call(a);return new c(b,a.a)}throw Error(Xu(a));}k=Qu.prototype; +k.Hg=function(){if(Vu(this,2)){var a=$u(this);if(Vu(this,3))return a}else if(Wu(this))return null;throw Error(Xu(this));};k.Gg=function(){if(Vu(this,2)){var a=av(this);if(Vu(this,3))return a}else if(Wu(this))return[];throw Error(Xu(this));};k.Ig=function(){if(Vu(this,2)){var a=bv(this);if(Vu(this,3))return a}else if(Wu(this))return[];throw Error(Xu(this));}; +k.Hp=function(){if(Vu(this,2)){var a;if(2==this.b.type)for(a=[this.Hg()];Vu(this,5);)a.push(this.Hg());else a=av(this);if(Vu(this,3))return a}else if(Wu(this))return[];throw Error(Xu(this));};k.Gp=function(){if(Vu(this,2)){var a=bv(this);if(Vu(this,3))return a}else if(Wu(this))return[];throw Error(Xu(this));};k.Ip=function(){if(Vu(this,2)){for(var a=[this.Ig()];Vu(this,5);)a.push(this.Ig());if(Vu(this,3))return a}else if(Wu(this))return[];throw Error(Xu(this));}; +function $u(a){for(var b=[],c=a.a.length,d=0;d=b[0]||a[1]<=b[1]&&a[3]>=b[1]?!0:Ua(a,this.Bb,this)):!1}; +k.ub=function(a){var b=this.a,c=a.slice();c[b]=c[0]+(this.A[b]-this.A[0]);var d;for(d=1;da.sc:e<=a.sc}a.s?(e=b.coordinate,c=a.j.U(),a.f===Kw?d=a.a:a.f===Jw?(d=a.a[0],d=d[d.length-1],Rw(a,b)&&(e=a.s.slice())):(d=a.a,d=d[d.length-1]),d[0]=e[0],d[1]=e[1],a.cb(a.a,c),a.B&&a.B.U().na(e),c instanceof D&&a.f!==Jw?(a.C||(a.C=new Hk(new I(null))),e=c.Wh(0),b=a.C.U(),b.ba(e.ja,e.da())):a.T&&(b=a.C.U(),b.na(a.T)),Tw(a)):(b=b.coordinate.slice(),a.B?a.B.U().na(b):(a.B=new Hk(new C(b)), +Tw(a)));return!0}function Rw(a,b){var c=!1;if(a.j){var d=!1,e=[a.s];a.f===Lw?d=a.a.length>a.Ea:a.f===Jw&&(d=a.a[0].length>a.Ea,e=[a.a[0][0],a.a[0][a.a[0].length-2]]);if(d){d=b.map;for(var f=0,g=e.length;f=a.ua&&(a.o?e.pop():d=!0);e.push(b.slice());a.cb(e,c)}else a.f===Jw&&(e=a.a[0],e.length>=a.ua&&(a.o?e.pop():d=!0),e.push(b.slice()),d&&(a.s=e[0]),a.cb(a.a,c));Tw(a);d&&a.Pd()} +k.nq=function(){if(this.j){var a=this.j.U();if(this.f===Lw){var b=this.a;b.splice(-2,1);this.cb(b,a);2<=b.length&&(this.s=b[b.length-2].slice())}else if(this.f===Jw){b=this.a[0];b.splice(-2,1);var c=this.C.U();c.na(b);this.cb(this.a,a)}0===b.length&&(this.s=null);Tw(this)}}; +k.Pd=function(){var a=Sw(this),b=this.a,c=a.U();this.f===Lw?(b.pop(),this.cb(b,c)):this.f===Jw&&(b[0].pop(),this.cb(b,c),b=c.W());"MultiPoint"===this.O?a.Va(new No([b])):"MultiLineString"===this.O?a.Va(new P([b])):"MultiPolygon"===this.O&&a.Va(new Q([b]));this.b(new Uw("drawend",a));this.La&&this.La.push(a);this.ob&&this.ob.Gb(a)};function Sw(a){a.s=null;var b=a.j;b&&(a.j=null,a.B=null,a.C=null,a.ra.ha().clear(!0));return b} +k.Zn=function(a){var b=a.U();this.j=a;this.a=b.W();a=this.a[this.a.length-1];this.s=a.slice();this.a.push(a.slice());Tw(this);this.b(new Uw("drawstart",this.j))};k.jd=Se;function Tw(a){var b=[];a.j&&b.push(a.j);a.C&&b.push(a.C);a.B&&b.push(a.B);a=a.ra.ha();a.clear(!0);a.Qc(b)}k.Ki=function(){var a=this.v,b=this.c();a&&b||Sw(this);this.ra.setMap(b?a:null)}; +function Iw(a){var b;"Point"===a||"MultiPoint"===a?b=Kw:"LineString"===a||"MultiLineString"===a?b=Lw:"Polygon"===a||"MultiPolygon"===a?b=Jw:"Circle"===a&&(b=Qw);return b}var Kw="Point",Lw="LineString",Jw="Polygon",Qw="Circle";function Uw(a,b){Qc.call(this,a);this.feature=b}w(Uw,Qc);function Vw(a){var b=a||{};this.a=this.j=null;this.C=void 0!==b.pixelTolerance?b.pixelTolerance:10;this.B=!1;this.T=this.s=null;a||(a={});fh.call(this,{handleDownEvent:Ww,handleDragEvent:Xw,handleEvent:Yw,handleUpEvent:Zw});this.o=new T({source:new U({useSpatialIndex:!1,wrapX:!!a.wrapX}),style:a.boxStyle?a.boxStyle:$w(),updateWhileAnimating:!0,updateWhileInteracting:!0});this.O=new T({source:new U({useSpatialIndex:!1,wrapX:!!a.wrapX}),style:a.pointerStyle?a.pointerStyle:ax(),updateWhileAnimating:!0, +updateWhileInteracting:!0});a.extent&&this.f(a.extent)}w(Vw,fh);function Yw(a){if(!(a instanceof Ad))return!0;if("pointermove"==a.type&&!this.D){var b=a.pixel,c=a.map,d=bx(this,b,c);d||(d=c.Ra(b));cx(this,d)}gh.call(this,a);return!1} +function Ww(a){function b(a){var b=null,c=null;a[0]==e[0]?b=e[2]:a[0]==e[2]&&(b=e[0]);a[1]==e[1]?c=e[3]:a[1]==e[3]&&(c=e[1]);return null!==b&&null!==c?[b,c]:null}var c=a.pixel,d=a.map,e=this.G();(a=bx(this,c,d))&&e?(c=a[0]==e[0]||a[0]==e[2]?a[0]:null,d=a[1]==e[1]||a[1]==e[3]?a[1]:null,null!==c&&null!==d?this.a=dx(b(a)):null!==c?this.a=ex(b([c,e[1]]),b([c,e[3]])):null!==d&&(this.a=ex(b([e[0],d]),b([e[2],d])))):(a=d.Ra(c),this.f([a[0],a[1],a[0],a[1]]),this.a=dx(a));return!0} +function Xw(a){this.a&&(a=a.coordinate,this.f(this.a(a)),cx(this,a));return!0}function Zw(){this.a=null;var a=this.G();a&&0!==ab(a)||this.f(null);return!1}function $w(){var a=Gk();return function(){return a.Polygon}}function ax(){var a=Gk();return function(){return a.Point}}function dx(a){return function(b){return Ca([a,b])}}function ex(a,b){return a[0]==b[0]?function(c){return Ca([a,[c[0],b[1]]])}:a[1]==b[1]?function(c){return Ca([a,[b[0],c[1]]])}:null} +function bx(a,b,c){function d(a,b){return Je(e,a)-Je(e,b)}var e=c.Ra(b),f=a.G();if(f){f=[[[f[0],f[1]],[f[0],f[3]]],[[f[0],f[3]],[f[2],f[3]]],[[f[2],f[3]],[f[2],f[1]]],[[f[2],f[1]],[f[0],f[1]]]];f.sort(d);f=f[0];var g=Be(e,f),h=c.Ia(g);if(Ie(b,h)<=a.C)return b=c.Ia(f[0]),c=c.Ia(f[1]),b=He(h,b),c=He(h,c),a.B=Math.sqrt(Math.min(b,c))<=a.C,a.B&&(g=b>c?f[1]:f[0]),g}return null}function cx(a,b){var c=a.T;c?c.U().na(b):(c=new Hk(new C(b)),a.T=c,a.O.ha().Gb(c))} +Vw.prototype.setMap=function(a){this.o.setMap(a);this.O.setMap(a);fh.prototype.setMap.call(this,a)};Vw.prototype.G=function(){return this.j};Vw.prototype.f=function(a){this.j=a?a:null;var b=this.s;b?a?b.Va(Rf(a)):b.Va(void 0):(this.s=b=a?new Hk(Rf(a)):new Hk({}),this.o.ha().Gb(b));this.b(new fx(this.j))};function fx(a){Qc.call(this,"extentchanged");this.extent=a}w(fx,Qc);function gx(a){fh.call(this,{handleDownEvent:hx,handleDragEvent:ix,handleEvent:jx,handleUpEvent:kx});this.Md=a.condition?a.condition:eh;this.bb=function(a){return Wg(a)&&$g(a)};this.ob=a.deleteCondition?a.deleteCondition:this.bb;this.sc=a.insertVertexCondition?a.insertVertexCondition:Re;this.La=this.f=null;this.Ea=[0,0];this.C=this.T=!1;this.a=new um;this.ra=void 0!==a.pixelTolerance?a.pixelTolerance:10;this.s=this.ua=!1;this.j=[];this.B=new T({source:new U({useSpatialIndex:!1,wrapX:!!a.wrapX}),style:a.style? +a.style:lx(),updateWhileAnimating:!0,updateWhileInteracting:!0});this.ca={Point:this.io,LineString:this.Mi,LinearRing:this.Mi,Polygon:this.jo,MultiPoint:this.fo,MultiLineString:this.eo,MultiPolygon:this.ho,Circle:this.bo,GeometryCollection:this.co};this.V=null;a.source?(this.V=a.source,a=new B(this.V.ee()),y(this.V,"addfeature",this.vm,this),y(this.V,"removefeature",this.xm,this)):a=a.features;if(!a)throw Error("The modify interaction requires features or a source");this.o=a;this.o.forEach(this.xg, +this);y(this.o,"add",this.$n,this);y(this.o,"remove",this.ao,this);this.O=null}w(gx,fh);k=gx.prototype;k.xg=function(a){var b=a.U();b&&b.S()in this.ca&&this.ca[b.S()].call(this,a,b);(b=this.v)&&b.c&&this.c()&&mx(this,this.Ea,b);y(a,"change",this.Li,this)};function nx(a,b){a.C||(a.C=!0,a.b(new ox("modifystart",a.o,b)))}function px(a,b){qx(a,b);a.f&&0===a.o.kc()&&(a.B.ha().Lb(a.f),a.f=null);Mc(b,"change",a.Li,a)} +function qx(a,b){a=a.a;var c=[];a.forEach(function(a){b===a.feature&&c.push(a)});for(var d=c.length-1;0<=d;--d)a.remove(c[d])}k.Ha=function(a){this.f&&!a&&(this.B.ha().Lb(this.f),this.f=null);fh.prototype.Ha.call(this,a)};k.setMap=function(a){this.B.setMap(a);fh.prototype.setMap.call(this,a)};k.vm=function(a){a.feature&&this.o.push(a.feature)};k.xm=function(a){a.feature&&this.o.remove(a.feature)};k.$n=function(a){this.xg(a.element)};k.Li=function(a){this.s||(a=a.target,px(this,a),this.xg(a))}; +k.ao=function(a){px(this,a.element)};k.io=function(a,b){var c=b.W();a={feature:a,geometry:b,ma:[c,c]};this.a.Ca(b.G(),a)};k.fo=function(a,b){var c=b.W(),d;var e=0;for(d=c.length;em?h[1]:h[0]),rx(a,l),m=1,c=f.length;mn&&(n=0);f=g.geometry;var p=d=f.W();var q=!1;switch(f.S()){case "MultiLineString":2c&&(a.index+=e)})}function lx(){var a=Gk();return function(){return a.Point}}function ox(a,b,c){Qc.call(this,a);this.features=b;this.mapBrowserEvent=c}w(ox,Qc);function wx(a){Jg.call(this,{handleEvent:xx});a=a?a:{};this.C=a.condition?a.condition:$g;this.D=a.addCondition?a.addCondition:Se;this.B=a.removeCondition?a.removeCondition:Se;this.T=a.toggleCondition?a.toggleCondition:bh;this.s=a.multi?a.multi:!1;this.l=a.filter?a.filter:Re;this.j=a.hitTolerance?a.hitTolerance:0;this.f=new T({source:new U({useSpatialIndex:!1,features:a.features,wrapX:a.wrapX}),style:a.style?a.style:yx(),updateWhileAnimating:!0,updateWhileInteracting:!0});if(a.layers)if("function"=== +typeof a.layers)a=a.layers;else{var b=a.layers;a=function(a){return ec(b,a)}}else a=Re;this.o=a;this.a={};a=this.f.ha().i;y(a,"add",this.ko,this);y(a,"remove",this.oo,this)}w(wx,Jg);k=wx.prototype;k.lo=function(){return this.f.ha().i};k.mo=function(){return this.j};k.no=function(a){a=x(a);return this.a[a]}; +function xx(a){if(!this.C(a))return!0;var b=this.D(a),c=this.B(a),d=this.T(a),e=!b&&!c&&!d,f=a.map,g=this.f.ha().i,h=[],l=[];if(e){lb(this.a);f.Tc(a.pixel,function(a,b){if(this.l(a,b))return l.push(a),a=x(a),this.a[a]=b,!this.s}.bind(this),{layerFilter:this.o,hitTolerance:this.j});for(e=g.kc()-1;0<=e;--e){f=g.item(e);var m=l.indexOf(f);-1b?m[1]:m[0],l=d.Ia(f)}else a.C&&(f=h?Ae(c,g[0].feature.U()):Be(c,m),l=d.Ia(f),Ie(b,l)<=a.f&&(e=!0,a.O&& +!h&&(c=d.Ia(m[0]),h=d.Ia(m[1]),c=He(l,c),b=He(l,h),h=Math.sqrt(Math.min(c,b)),h=h<=a.f)))&&(f=c>b?m[1]:m[0],l=d.Ia(f));e&&(l=[Math.round(l[0]),Math.round(l[1])])}return{Mq:e,vertex:f,Vq:l}}k.$j=function(a){this.Lb(a,!1);this.Gb(a,!1)};k.ro=function(a,b){b=Sf(b).W()[0];var c;var d=0;for(c=b.length-1;dXa&&(Xa=Zb,m=Z)}if(0===Xa){g=null;break a}Xa=g[m];g[m]=g[l];g[l]=Xa;for(m=l+1;mthis.b/2){var b=[[a.source[0][0],a.source[0][1]],[a.source[1][0],a.source[1][1]],[a.source[2][0],a.source[2][1]]];b[0][0]-n>this.b/2&&(b[0][0]-=this.b);b[1][0]-n>this.b/2&&(b[1][0]-=this.b);b[2][0]-n>this.b/2&&(b[2][0]-=this.b);Math.max(b[0][0],b[1][0],b[2][0])-Math.min(b[0][0],b[1][0],b[2][0])p,u=!1;if(0a.v),u)){Math.abs(b[0]-d[0])<=Math.abs(b[1]-d[1])?(r=[(c[0]+d[0])/2,(c[1]+d[1])/2],q=a.a(r),n=[(e[0]+b[0])/2,(e[1]+b[1])/2],p=a.a(n),fy(a,b,c,r,n,f,g,q,p,m-1),fy(a,n,r,d,e,p,q,h,l,m-1)):(r=[(b[0]+c[0])/2,(b[1]+c[1])/2],q=a.a(r),n=[(d[0]+e[0])/2,(d[1]+e[1])/2],p=a.a(n),fy(a,b,r,n,e,f,q,p,l,m-1),fy(a,r,c,d,n,q,g,h,p,m-1));return}if(r){if(!a.s)return;a.l=!0}a.c.push({source:[f,h,l],target:[b,d,e]});a.c.push({source:[f,g,h],target:[b,c,d]})}} +function gy(a){var b=Da();a.c.forEach(function(a){a=a.source;Ea(b,a[0]);Ea(b,a[1]);Ea(b,a[2])});return b};function hy(a,b,c,d,e,f,g,h,l,m,n){cl.call(this,e,0);this.B=void 0!==n?n:!1;this.C=g;this.D=h;this.N=null;this.c=b;this.l=d;this.v=f?f:e;this.a=[];this.Id=null;this.f=0;f=d.Ma(this.v);h=this.l.G();e=this.c.G();f=h?gb(f,h):f;if(0===ab(f))this.state=4;else if((h=a.G())&&(e?e=gb(e,h):e=h),d=by(a,c,eb(f),d.Ta(this.v[0])),!isFinite(d)||0>=d)this.state=4;else if(this.o=new ey(a,c,f,e,d*(void 0!==m?m:.5)),0===this.o.c.length)this.state=4;else if(this.f=b.Dc(d),c=gy(this.o),e&&(a.g?(c[1]=pa(c[1],e[1],e[3]), +c[3]=pa(c[3],e[1],e[3])):c=gb(c,e)),ab(c)){a=tc(b,c,this.f);for(b=a.fa;b<=a.la;b++)for(c=a.ea;c<=a.ka;c++)(m=l(this.f,b,c,g))&&this.a.push(m);0===this.a.length&&(this.state=4)}else this.state=4}w(hy,cl);hy.prototype.ia=function(){1==this.state&&(this.Id.forEach(Gc),this.Id=null);cl.prototype.ia.call(this)};hy.prototype.Y=function(){return this.N}; +hy.prototype.he=function(){var a=[];this.a.forEach(function(b){b&&2==b.getState()&&a.push({extent:this.c.Ma(b.ya),image:b.Y()})},this);this.a.length=0;if(0===a.length)this.state=3;else{var b=this.v[0],c=this.l.Za(b),d="number"===typeof c?c:c[0];c="number"===typeof c?c:c[1];b=this.l.Ta(b);var e=this.c.Ta(this.f),f=this.l.Ma(this.v);this.N=dy(d,c,this.C,e,this.c.G(),b,f,this.o,a,this.D,this.B);this.state=2}this.u()}; +hy.prototype.load=function(){if(0==this.state){this.state=1;this.u();var a=0;this.Id=[];this.a.forEach(function(b){var c=b.getState();if(0==c||1==c){a++;var d=y(b,"change",function(){var c=b.getState();if(2==c||3==c||4==c)Gc(d),a--,0===a&&(this.Id.forEach(Gc),this.Id=null,this.he())},this);this.Id.push(d)}},this);this.a.forEach(function(a){0==a.getState()&&a.load()});0===a&&setTimeout(this.he.bind(this),0)}};function iy(a){uw.call(this,{attributions:a.attributions,extent:a.extent,logo:a.logo,projection:a.projection,state:a.state,wrapX:a.wrapX});this.bb=void 0!==a.opaque?a.opaque:!1;this.sc=void 0!==a.tilePixelRatio?a.tilePixelRatio:1;this.tileGrid=void 0!==a.tileGrid?a.tileGrid:null;this.a=new $x(a.cacheSize);this.j=[0,0];this.jc="";this.Ea={transition:a.transition}}w(iy,uw);k=iy.prototype;k.cj=function(){return di(this.a)};k.sd=function(a,b){(a=this.Yd(a))&&a.sd(b)}; +function Li(a,b,c,d,e){a=a.Yd(b);if(!a)return!1;b=!0;for(var f,g,h=d.fa;h<=d.la;++h)for(var l=d.ea;l<=d.ka;++l)f=c+"/"+h+"/"+l,g=!1,a.a.hasOwnProperty(f)&&(f=a.get(f),(g=2===f.getState())&&(g=!1!==e(f))),g||(b=!1);return b}k.Zf=function(){return 0};function jy(a,b){a.jc!==b&&(a.jc=b,a.u())}k.eg=function(){return this.bb};k.jb=function(){return this.tileGrid};k.eb=function(a){return this.tileGrid?this.tileGrid:zc(a)};k.Yd=function(a){var b=this.c;return b&&!Xb(b,a)?null:this.a};k.Xc=function(){return this.sc}; +k.Zd=function(a,b,c){c=this.eb(c);b=this.Xc(b);a=Ba(c.Za(a),this.j);return 1==b?a:Aa(a,b,this.j)};function ky(a,b,c){var d=void 0!==c?c:a.c;c=a.eb(d);if(a.D&&d.c){var e=b;b=e[0];a=yc(c,e);d=Dc(d);Ja(d,a)?b=e:(e=cb(d),a[0]+=e*Math.ceil((d[0]-a[0])/e),b=c.jg(a,b))}e=b[0];d=b[1];a=b[2];if(c.minZoom>e||e>c.maxZoom)c=!1;else{var f=c.G();c=(c=f?tc(c,f,e):c.a?c.a[e]:null)?ma(c,d,a):!0}return c?b:null}k.sa=function(){this.a.clear();this.u()};k.kh=ea;function ly(a,b){Qc.call(this,a);this.tile=b}w(ly,Qc);function my(a){iy.call(this,{attributions:a.attributions,cacheSize:a.cacheSize,extent:a.extent,logo:a.logo,opaque:a.opaque,projection:a.projection,state:a.state,tileGrid:a.tileGrid,tilePixelRatio:a.tilePixelRatio,wrapX:a.wrapX,transition:a.transition});this.tileLoadFunction=a.tileLoadFunction;this.tileUrlFunction=this.dc?this.dc.bind(this):Xx;this.urls=null;a.urls?this.vb(a.urls):a.url&&this.rb(a.url);a.tileUrlFunction&&this.hb(a.tileUrlFunction);this.V={}}w(my,iy);k=my.prototype;k.yb=function(){return this.tileLoadFunction}; +k.zb=function(){return this.tileUrlFunction};k.Ab=function(){return this.urls};k.dj=function(a){a=a.target;var b=x(a),c=a.getState();if(1==c){this.V[b]=!0;var d="tileloadstart"}else b in this.V&&(delete this.V[b],d=3==c?"tileloaderror":2==c||5==c?"tileloadend":void 0);void 0!=d&&this.b(new ly(d,a))};k.Fb=function(a){this.a.clear();this.tileLoadFunction=a;this.u()};k.hb=function(a,b){this.tileUrlFunction=a;ay(this.a);"undefined"!==typeof b?jy(this,b):this.u()}; +k.rb=function(a){var b=this.urls=Yx(a);this.hb(this.dc?this.dc.bind(this):Vx(b,this.tileGrid),a)};k.vb=function(a){this.urls=a;var b=a.join("\n");this.hb(this.dc?this.dc.bind(this):Vx(a,this.tileGrid),b)};k.kh=function(a,b,c){a=a+"/"+b+"/"+c;this.a.a.hasOwnProperty(a)&&this.a.get(a)};function ny(a){my.call(this,{attributions:a.attributions,cacheSize:a.cacheSize,extent:a.extent,logo:a.logo,opaque:a.opaque,projection:a.projection,state:a.state,tileGrid:a.tileGrid,tileLoadFunction:a.tileLoadFunction?a.tileLoadFunction:oy,tilePixelRatio:a.tilePixelRatio,tileUrlFunction:a.tileUrlFunction,url:a.url,urls:a.urls,wrapX:a.wrapX,transition:a.transition});this.crossOrigin=void 0!==a.crossOrigin?a.crossOrigin:null;this.tileClass=void 0!==a.tileClass?a.tileClass:el;this.f={};this.s={};this.ob= +a.reprojectionErrorThreshold;this.O=!1}w(ny,my);k=ny.prototype;k.cj=function(){if(di(this.a))return!0;for(var a in this.f)if(di(this.f[a]))return!0;return!1};k.sd=function(a,b){a=this.Yd(a);this.a.sd(this.a==a?b:{});for(var c in this.f){var d=this.f[c];d.sd(d==a?b:{})}};k.Zf=function(a){return this.c&&a&&!Xb(this.c,a)?0:this.$f()};k.$f=function(){return 0};k.eg=function(a){return this.c&&a&&!Xb(this.c,a)?!1:my.prototype.eg.call(this,a)}; +k.eb=function(a){var b=this.c;return!this.tileGrid||b&&!Xb(b,a)?(b=x(a).toString(),b in this.s||(this.s[b]=zc(a)),this.s[b]):this.tileGrid};k.Yd=function(a){var b=this.c;if(!b||Xb(b,a))return this.a;a=x(a).toString();a in this.f||(this.f[a]=new $x(this.a.highWaterMark));return this.f[a]}; +function py(a,b,c,d,e,f,g){b=[b,c,d];e=(c=ky(a,b,f))?a.tileUrlFunction(c,e,f):void 0;e=new a.tileClass(b,void 0!==e?0:4,void 0!==e?e:"",a.crossOrigin,a.tileLoadFunction,a.Ea);e.key=g;y(e,"change",a.dj,a);return e} +k.ad=function(a,b,c,d,e){var f=this.c;if(f&&e&&!Xb(f,e)){var g=this.Yd(e);c=[a,b,c];var h;a=c[0]+"/"+c[1]+"/"+c[2];g.a.hasOwnProperty(a)&&(h=g.get(a));b=this.jc;if(h&&h.key==b)return h;var l=this.eb(f),m=this.eb(e),n=ky(this,c,e);d=new hy(f,l,e,m,c,n,this.Xc(d),this.$f(),function(a,b,c,d){return qy(this,a,b,c,d,f)}.bind(this),this.ob,this.O);d.key=b;h?(d.g=h,dl(d),g.replace(a,d)):g.set(a,d);return d}return qy(this,a,b,c,d,f||e)}; +function qy(a,b,c,d,e,f){var g=b+"/"+c+"/"+d,h=a.jc;if(a.a.a.hasOwnProperty(g)){var l=a.a.get(g);if(l.key!=h){var m=l;l=py(a,b,c,d,e,f,h);0==m.getState()?l.g=m.g:l.g=m;dl(l);a.a.replace(g,l)}}else l=py(a,b,c,d,e,f,h),a.a.set(g,l);return l}k.Qb=function(a){if(this.O!=a){this.O=a;for(var b in this.f)this.f[b].clear();this.u()}};k.Rb=function(a,b){if(a=Ob(a))a=x(a).toString(),a in this.s||(this.s[a]=b)};function oy(a,b){a.Y().src=b};function ry(a){this.i=void 0!==a.hidpi?a.hidpi:!1;ny.call(this,{cacheSize:a.cacheSize,crossOrigin:"anonymous",opaque:!0,projection:Ob("EPSG:3857"),reprojectionErrorThreshold:a.reprojectionErrorThreshold,state:"loading",tileLoadFunction:a.tileLoadFunction,tilePixelRatio:this.i?2:1,wrapX:void 0!==a.wrapX?a.wrapX:!0,transition:a.transition});this.o=void 0!==a.culture?a.culture:"en-us";this.$=void 0!==a.maxZoom?a.maxZoom:-1;this.l=a.key;this.B=a.imagerySet;Zx("https://dev.virtualearth.net/REST/v1/Imagery/Metadata/"+ +this.B+"?uriScheme=https&include=ImageryProviders&key="+this.l+"&c="+this.o,this.La.bind(this),void 0,"jsonp")}w(ry,ny);ry.prototype.ca=function(){return this.l};ry.prototype.ua=function(){return this.B}; +ry.prototype.La=function(a){if(200!=a.statusCode||"OK"!=a.statusDescription||"ValidCredentials"!=a.authenticationResultCode||1!=a.resourceSets.length||1!=a.resourceSets[0].resources.length)ww(this,"error");else{var b=a.brandLogoUri;-1==b.indexOf("https")&&(b=b.replace("http","https"));var c=a.resourceSets[0].resources[0];a=-1==this.$?c.zoomMax:this.$;var d=Dc(this.c);this.tileGrid=Bc({extent:d,minZoom:c.zoomMin,maxZoom:a,tileSize:(c.imageWidth==c.imageHeight?c.imageWidth:[c.imageWidth,c.imageHeight])/ +(this.i?2:1)});var e=this.o,f=this.i;this.tileUrlFunction=Wx(c.imageUrlSubdomains.map(function(a){var b=[0,0,0],d=c.imageUrl.replace("{subdomain}",a).replace("{culture}",e);return function(a){if(a)return oc(a[0],a[1],-a[2]-1,b),a=d,f&&(a+="&dpi=d1&device=mobile"),a.replace("{quadkey}",pc(b))}}));if(c.imageryProviders){var g=Pb(Ob("EPSG:4326"),this.c);this.va(function(a){var b=[],d=a.viewState.zoom;c.imageryProviders.map(function(c){for(var e=!1,f=c.coverageAreas,h=0,l=f.length;h=m.zoomMin&&d<=m.zoomMax&&(m=m.bbox,m=jb([m[1],m[0],m[3],m[2]],g),hb(m,a.extent))){e=!0;break}}e&&b.push(c.attribution)});b.push('Terms of Use');return b})}this.T=b;ww(this,"ready")}};function sy(a){a=a||{};var b=void 0!==a.projection?a.projection:"EPSG:3857",c=void 0!==a.tileGrid?a.tileGrid:Bc({extent:Dc(b),maxZoom:a.maxZoom,minZoom:a.minZoom,tileSize:a.tileSize});ny.call(this,{attributions:a.attributions,cacheSize:a.cacheSize,crossOrigin:a.crossOrigin,logo:a.logo,opaque:a.opaque,projection:b,reprojectionErrorThreshold:a.reprojectionErrorThreshold,tileGrid:c,tileLoadFunction:a.tileLoadFunction,tilePixelRatio:a.tilePixelRatio,tileUrlFunction:a.tileUrlFunction,url:a.url,urls:a.urls, +wrapX:void 0!==a.wrapX?a.wrapX:!0,transition:a.transition})}w(sy,ny);function ty(a){this.o=a.account;this.B=a.map||"";this.i=a.config||{};this.l={};sy.call(this,{attributions:a.attributions,cacheSize:a.cacheSize,crossOrigin:a.crossOrigin,logo:a.logo,maxZoom:void 0!==a.maxZoom?a.maxZoom:18,minZoom:a.minZoom,projection:a.projection,state:"loading",wrapX:a.wrapX});uy(this)}w(ty,sy);k=ty.prototype;k.nl=function(){return this.i};k.Sq=function(a){kb(this.i,a);uy(this)};k.uq=function(a){this.i=a||{};uy(this)}; +function uy(a){var b=JSON.stringify(a.i);if(a.l[b])vy(a,a.l[b]);else{var c="https://"+a.o+".carto.com/api/v1/map";a.B&&(c+="/named/"+a.B);var d=new XMLHttpRequest;d.addEventListener("load",a.em.bind(a,b));d.addEventListener("error",a.dm.bind(a));d.open("POST",c);d.setRequestHeader("Content-type","application/json");d.send(JSON.stringify(a.i))}} +k.em=function(a,b){b=b.target;if(!b.status||200<=b.status&&300>b.status){try{var c=JSON.parse(b.responseText)}catch(d){ww(this,"error");return}vy(this,c);this.l[a]=c;ww(this,"ready")}else ww(this,"error")};k.dm=function(){ww(this,"error")};function vy(a,b){a.rb("https://"+b.cdn_url.https+"/"+a.o+"/api/v1/map/"+b.layergroupid+"/{z}/{x}/{y}.png")};function X(a){U.call(this,{attributions:a.attributions,extent:a.extent,logo:a.logo,projection:a.projection,wrapX:a.wrapX});this.resolution=void 0;this.distance=void 0!==a.distance?a.distance:20;this.features=[];this.geometryFunction=a.geometryFunction||function(a){a=a.U();oa(a instanceof C,10);return a};this.source=a.source;this.source.I("change",X.prototype.sa,this)}w(X,U);k=X.prototype;k.Eo=function(){return this.distance};k.Fo=function(){return this.source}; +k.ae=function(a,b,c){this.source.ae(a,b,c);b!==this.resolution&&(this.clear(),this.resolution=b,wy(this),this.Qc(this.features))};k.vq=function(a){this.distance=a;this.sa()};k.sa=function(){this.clear();wy(this);this.Qc(this.features);U.prototype.sa.call(this)}; +function wy(a){if(void 0!==a.resolution){a.features.length=0;for(var b=Da(),c=a.distance*a.resolution,d=a.source.ee(),e={},f=0,g=d.length;fm*l?h*g/(m*p):l*g/(n*p),SETVIEWCENTERX:f[0],SETVIEWCENTERY:f[1]};kb(e,this.f);d=Gy(d,e);d=new bl(a,b,c,d,this.V,this.a);y(d,"change",this.j,this)}else d=null;this.M=d;this.B=this.g;return d};k.Mo=function(){return this.a};k.Po=function(a){kb(this.f,a);this.u()};k.Oo=function(a){this.M=null;this.a=a;this.u()};function Ky(a){var b=a.imageExtent,c=void 0!==a.crossOrigin?a.crossOrigin:null,d=void 0!==a.imageLoadFunction?a.imageLoadFunction:Fy;zy.call(this,{attributions:a.attributions,logo:a.logo,projection:Ob(a.projection)});this.M=new bl(b,void 0,1,a.url,c,d);this.a=a.imageSize?a.imageSize:null;y(this.M,"change",this.j,this)}w(Ky,zy);Ky.prototype.Wc=function(a){return hb(a,this.M.G())?this.M:null}; +Ky.prototype.j=function(a){if(2==this.M.getState()){var b=this.M.G(),c=this.M.Y();if(this.a){var d=this.a[0];var e=this.a[1]}else d=c.width,e=c.height;b=Math.ceil(cb(b)/(db(b)/e));if(b!=d){b=hg(b,e);var f=b.canvas;b.drawImage(c,0,0,d,e,0,0,f.width,f.height);this.M.ih(f)}}zy.prototype.j.call(this,a)};function Ly(a){this.a=a.source;this.ob=We();this.f=hg();this.l=[0,0];this.ca=rj.Jc(9);this.bb=void 0==a.renderBuffer?100:a.renderBuffer;this.B=null;Iy.call(this,{attributions:a.attributions,canvasFunction:this.Mk.bind(this),logo:a.logo,projection:a.projection,ratio:a.ratio,resolutions:a.resolutions,state:this.a.getState()});this.O=null;this.s=void 0;this.aj(a.style);y(this.a,"change",this.To,this)}w(Ly,Iy);k=Ly.prototype; +k.Mk=function(a,b,c,d,e){var f=new Vj(.5*b/c,a,b,c,this.a.$,this.ca,this.bb);this.a.ae(a,b,e);var g=!1;this.a.ec(a,function(a){var d;if(!(d=g)){var e;(d=a.ib())?e=d.call(a,b):this.s&&(e=this.s(a,b));if(e){var h,p=!1;Array.isArray(e)||(e=[e]);d=0;for(h=e.length;dOpenStreetMap contributors.'];sy.call(this,{attributions:b,cacheSize:a.cacheSize,crossOrigin:void 0!==a.crossOrigin?a.crossOrigin:"anonymous",opaque:void 0!==a.opaque?a.opaque:!0,maxZoom:void 0!==a.maxZoom?a.maxZoom:19,reprojectionErrorThreshold:a.reprojectionErrorThreshold,tileLoadFunction:a.tileLoadFunction,url:void 0!==a.url?a.url:"https://{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png", +wrapX:a.wrapX})}w(Ry,sy);rj.nf={};rj.nf.Hf=function(){}; +(function(a){function b(a,b,c){if(g)return new ImageData(a,b,c);b=h.createImageData(b,c);b.data.set(a);return b}function c(a){var b=!0;try{new ImageData(10,10)}catch(n){b=!1}return function(c){var d=c.buffers,e=c.meta,f=c.width,g=c.height,h=d.length,l=d[0].byteLength;if(c.imageOps){l=Array(h);for(c=0;cthis.Bk;)this.Nd.shift().callback(null,null)};f.prototype.uh=function(){if(0===this.ve&&0Stamen Design, under CC BY 3.0.','© OpenStreetMap contributors.'],az={terrain:{Ob:"jpg",opaque:!0},"terrain-background":{Ob:"jpg",opaque:!0},"terrain-labels":{Ob:"png",opaque:!1},"terrain-lines":{Ob:"png",opaque:!1},"toner-background":{Ob:"png",opaque:!0},toner:{Ob:"png",opaque:!0},"toner-hybrid":{Ob:"png",opaque:!1},"toner-labels":{Ob:"png", +opaque:!1},"toner-lines":{Ob:"png",opaque:!1},"toner-lite":{Ob:"png",opaque:!0},watercolor:{Ob:"jpg",opaque:!0}},$y={terrain:{minZoom:4,maxZoom:18},toner:{minZoom:0,maxZoom:20},watercolor:{minZoom:1,maxZoom:16}};function cz(a){a=a||{};ny.call(this,{attributions:a.attributions,cacheSize:a.cacheSize,crossOrigin:a.crossOrigin,logo:a.logo,projection:a.projection,reprojectionErrorThreshold:a.reprojectionErrorThreshold,tileGrid:a.tileGrid,tileLoadFunction:a.tileLoadFunction,url:a.url,urls:a.urls,wrapX:void 0!==a.wrapX?a.wrapX:!0,transition:a.transition});this.i=a.params||{};this.l=Da();jy(this,dz(this))}w(cz,ny);function dz(a){var b=0,c=[],d;for(d in a.i)c[b++]=d+"-"+a.i[d];return c.join("/")}cz.prototype.o=function(){return this.i}; +cz.prototype.Xc=function(a){return a}; +cz.prototype.dc=function(a,b,c){var d=this.tileGrid;d||(d=this.eb(c));if(!(d.b.length<=a[0])){var e=d.Ma(a,this.l),f=Ba(d.Za(a[0]),this.j);1!=b&&(f=Aa(f,b,this.j));d={F:"image",FORMAT:"PNG32",TRANSPARENT:!0};kb(d,this.i);var g=this.urls;g?(c=c.wb.split(":").pop(),d.SIZE=f[0]+","+f[1],d.BBOX=e.join(","),d.BBOXSR=c,d.IMAGESR=c,d.DPI=Math.round(d.DPI?d.DPI*b:90*b),a=(1==g.length?g[0]:g[wa((a[1]<a.status){try{var b=JSON.parse(a.responseText)}catch(c){this.ef();return}this.Cg(b)}else this.ef()};k.ap=function(){this.ef()};k.Sl=function(){return this.i}; +k.Cg=function(a){var b=Ob("EPSG:4326"),c=this.c;if(void 0!==a.bounds){var d=Pb(b,c);d=jb(a.bounds,d)}var e=a.minzoom||0,f=a.maxzoom||22;this.tileGrid=c=Bc({extent:Dc(c),maxZoom:f,minZoom:e});this.tileUrlFunction=Vx(a.tiles,c);if(void 0!==a.attribution&&!this.C){var g=void 0!==d?d:b.G();this.va(function(b){return hb(g,b.extent)?[a.attribution]:null})}this.i=a;ww(this,"ready")};k.ef=function(){ww(this,"error")};function hz(a){iy.call(this,{projection:Ob("EPSG:3857"),state:"loading"});this.s=void 0!==a.preemptive?a.preemptive:!0;this.l=Xx;this.f=void 0;this.i=a.jsonp||!1;if(a.url)if(this.i)Zx(a.url,this.Dg.bind(this),this.ff.bind(this));else{var b=new XMLHttpRequest;b.addEventListener("load",this.gp.bind(this));b.addEventListener("error",this.fp.bind(this));b.open("GET",a.url);b.send()}else a.tileJSON?this.Dg(a.tileJSON):oa(!1,51)}w(hz,iy);k=hz.prototype; +k.gp=function(a){a=a.target;if(!a.status||200<=a.status&&300>a.status){try{var b=JSON.parse(a.responseText)}catch(c){this.ff();return}this.Dg(b)}else this.ff()};k.fp=function(){this.ff()};k.Pl=function(){return this.f};k.al=function(a,b,c,d,e){this.tileGrid?(b=this.tileGrid.Le(a,b),iz(this.ad(b[0],b[1],b[2],1,this.c),a,c,d,e)):!0===e?setTimeout(function(){c.call(d,null)},0):c.call(d,null)};k.ff=function(){ww(this,"error")}; +k.Dg=function(a){var b=Ob("EPSG:4326"),c=this.c;if(void 0!==a.bounds){var d=Pb(b,c);d=jb(a.bounds,d)}var e=a.minzoom||0,f=a.maxzoom||22;this.tileGrid=c=Bc({extent:Dc(c),maxZoom:f,minZoom:e});this.f=a.template;if(e=a.grids){this.l=Vx(e,c);if(void 0!==a.attribution){var g=void 0!==d?d:b.G();this.va(function(b){return hb(g,b.extent)?[a.attribution]:null})}ww(this,"ready")}else ww(this,"error")}; +k.ad=function(a,b,c,d,e){var f=a+"/"+b+"/"+c;if(this.a.a.hasOwnProperty(f))return this.a.get(f);a=[a,b,c];b=ky(this,a,e);d=this.l(b,d,e);d=new jz(a,void 0!==d?0:4,void 0!==d?d:"",this.tileGrid.Ma(a),this.s,this.i);this.a.set(f,d);return d};k.kh=function(a,b,c){a=a+"/"+b+"/"+c;this.a.a.hasOwnProperty(a)&&this.a.get(a)};function jz(a,b,c,d,e,f){cl.call(this,a,b);this.v=c;this.a=d;this.N=e;this.c=this.l=this.f=null;this.o=f}w(jz,cl);k=jz.prototype;k.Y=function(){return null}; +k.getData=function(a){if(!this.f||!this.l)return null;var b=this.f[Math.floor((1-(a[1]-this.a[1])/(this.a[3]-this.a[1]))*this.f.length)];if("string"!==typeof b)return null;b=b.charCodeAt(Math.floor((a[0]-this.a[0])/(this.a[2]-this.a[0])*b.length));93<=b&&b--;35<=b&&b--;b-=32;a=null;b in this.l&&(b=this.l[b],this.c&&b in this.c?a=this.c[b]:a=b);return a}; +function iz(a,b,c,d,e){0==a.state&&!0===e?(Lc(a,"change",function(){c.call(d,this.getData(b))},a),kz(a)):!0===e?setTimeout(function(){c.call(d,this.getData(b))}.bind(a),0):c.call(d,a.getData(b))}k.lb=function(){return this.v};k.Ne=function(){this.state=3;this.u()};k.bj=function(a){this.f=a.grid;this.l=a.keys;this.c=a.data;this.state=4;this.u()}; +function kz(a){if(0==a.state)if(a.state=1,a.o)Zx(a.v,a.bj.bind(a),a.Ne.bind(a));else{var b=new XMLHttpRequest;b.addEventListener("load",a.ep.bind(a));b.addEventListener("error",a.cp.bind(a));b.open("GET",a.v);b.send()}}k.ep=function(a){a=a.target;if(!a.status||200<=a.status&&300>a.status){try{var b=JSON.parse(a.responseText)}catch(c){this.Ne();return}this.bj(b)}else this.Ne()};k.cp=function(){this.Ne()};k.load=function(){this.N&&kz(this)};function lz(a){a=a||{};var b=a.params||{};ny.call(this,{attributions:a.attributions,cacheSize:a.cacheSize,crossOrigin:a.crossOrigin,logo:a.logo,opaque:!("TRANSPARENT"in b?b.TRANSPARENT:1),projection:a.projection,reprojectionErrorThreshold:a.reprojectionErrorThreshold,tileClass:a.tileClass,tileGrid:a.tileGrid,tileLoadFunction:a.tileLoadFunction,url:a.url,urls:a.urls,wrapX:void 0!==a.wrapX?a.wrapX:!0,transition:a.transition});this.o=void 0!==a.gutter?a.gutter:0;this.i=b;this.l=!0;this.B=a.serverType; +this.$=void 0!==a.hidpi?a.hidpi:!0;this.ca=Da();mz(this);jy(this,nz(this))}w(lz,ny);k=lz.prototype; +k.hp=function(a,b,c,d){c=Ob(c);var e=this.c,f=this.tileGrid;f||(f=this.eb(c));b=f.Le(a,b);if(!(f.b.length<=b[0])){var g=f.Ta(b[0]),h=f.Ma(b,this.ca);f=Ba(f.Za(b[0]),this.j);var l=this.o;0!==l&&(f=za(f,l,this.j),h=Fa(h,g*l,h));e&&e!==c&&(g=by(e,c,a,g),h=bc(h,c,e),a=ac(a,c,e));l={SERVICE:"WMS",VERSION:"1.3.0",REQUEST:"GetFeatureInfo",FORMAT:"image/png",TRANSPARENT:!0,QUERY_LAYERS:this.i.LAYERS};kb(l,this.i,d);d=Math.floor((h[3]-a[1])/g);l[this.l?"I":"X"]=Math.floor((a[0]-h[0])/g);l[this.l?"J":"Y"]= +d;return oz(this,b,f,h,1,e||c,l)}};k.$f=function(){return this.o};k.ip=function(){return this.i}; +function oz(a,b,c,d,e,f,g){var h=a.urls;if(h){g.WIDTH=c[0];g.HEIGHT=c[1];g[a.l?"CRS":"SRS"]=f.wb;"STYLES"in a.i||(g.STYLES="");if(1!=e)switch(a.B){case "geoserver":c=90*e+.5|0;g.FORMAT_OPTIONS="FORMAT_OPTIONS"in g?g.FORMAT_OPTIONS+(";dpi:"+c):"dpi:"+c;break;case "mapserver":g.MAP_RESOLUTION=90*e;break;case "carmentaserver":case "qgis":g.DPI=90*e;break;default:oa(!1,52)}f=f.b;a.l&&"ne"==f.substr(0,2)&&(a=d[0],d[0]=d[1],d[1]=a,a=d[2],d[2]=d[3],d[3]=a);g.BBOX=d.join(",");return Gy(1==h.length?h[0]:h[wa((b[1]<< +b[0])+b[2],h.length)],g)}}k.Xc=function(a){return this.$&&void 0!==this.B?a:1};function nz(a){var b=0,c=[],d;for(d in a.i)c[b++]=d+"-"+a.i[d];return c.join("/")} +k.dc=function(a,b,c){var d=this.tileGrid;d||(d=this.eb(c));if(!(d.b.length<=a[0])){1==b||this.$&&void 0!==this.B||(b=1);var e=d.Ta(a[0]),f=d.Ma(a,this.ca);d=Ba(d.Za(a[0]),this.j);var g=this.o;0!==g&&(d=za(d,g,this.j),f=Fa(f,e*g,f));1!=b&&(d=Aa(d,b,this.j));e={SERVICE:"WMS",VERSION:"1.3.0",REQUEST:"GetMap",FORMAT:"image/png",TRANSPARENT:!0};kb(e,this.i);return oz(this,a,d,f,b,c,e)}};k.jp=function(a){kb(this.i,a);mz(this);jy(this,nz(this))};function mz(a){a.l=0<=ye(a.i.VERSION||"1.3.0")};function pz(a,b,c,d,e,f,g,h,l,m,n,p,q,r,u){cl.call(this,a,b,u);this.v={};this.o={};this.c=m;this.a=[];this.D=c;this.l=f;this.f=[];this.N=[];if(f){var v=l.Ma(f),z=l.Ta(a[0]);h.Vf(v,h.Dc(z),function(a){var b=gb(v,h.Ma(a)),c=h.G();c&&(b=gb(b,c));.5<=cb(b)/z&&.5<=db(b)/z&&(b=a.toString(),c=m[b],c||(c=g(a,n,p),c=m[b]=new q(a,void 0==c?4:0,void 0==c?"":c,d,e),this.N.push(y(c,"change",r))),c.c++,this.a.push(b))}.bind(this))}}w(pz,cl);k=pz.prototype; +k.ia=function(){for(var a=0,b=this.a.length;ag||d>g;)e.push([Math.ceil(c/g),Math.ceil(d/g)]),g+=g;break;case xz:for(;c>g||d>g;)e.push([Math.ceil(c/g),Math.ceil(d/g)]),c>>=1,d>>=1;break;default:oa(!1,53)}e.push([1,1]);e.reverse();d=[1];var h=[0];g=1;for(c=e.length;ga?Pe(2*a):1-Pe(2*(a-.5))}); +t("ol.extent.boundingExtent",Ca);t("ol.extent.buffer",Fa);t("ol.extent.containsCoordinate",Ja);t("ol.extent.containsExtent",La);t("ol.extent.containsXY",Ka);t("ol.extent.createEmpty",Da);t("ol.extent.equals",Sa);t("ol.extent.extend",Ta);t("ol.extent.getArea",ab);t("ol.extent.getBottomLeft",Wa);t("ol.extent.getBottomRight",Ya);t("ol.extent.getCenter",eb);t("ol.extent.getHeight",db);t("ol.extent.getIntersection",gb);t("ol.extent.getSize",function(a){return[a[2]-a[0],a[3]-a[1]]}); +t("ol.extent.getTopLeft",$a);t("ol.extent.getTopRight",Za);t("ol.extent.getWidth",cb);t("ol.extent.intersects",hb);t("ol.extent.isEmpty",bb);t("ol.extent.applyTransform",jb);t("ol.Feature",Hk);Hk.prototype.clone=Hk.prototype.clone;Hk.prototype.getGeometry=Hk.prototype.U;Hk.prototype.getId=Hk.prototype.an;Hk.prototype.getGeometryName=Hk.prototype.sl;Hk.prototype.getStyle=Hk.prototype.bn;Hk.prototype.getStyleFunction=Hk.prototype.ib;Hk.prototype.setGeometry=Hk.prototype.Va;Hk.prototype.setStyle=Hk.prototype.sg; +Hk.prototype.setId=Hk.prototype.qc;Hk.prototype.setGeometryName=Hk.prototype.Lc;t("ol.featureloader.xhr",Fo);t("ol.Geolocation",Jk);Jk.prototype.getAccuracy=Jk.prototype.el;Jk.prototype.getAccuracyGeometry=Jk.prototype.fl;Jk.prototype.getAltitude=Jk.prototype.gl;Jk.prototype.getAltitudeAccuracy=Jk.prototype.hl;Jk.prototype.getHeading=Jk.prototype.cn;Jk.prototype.getPosition=Jk.prototype.dn;Jk.prototype.getProjection=Jk.prototype.mi;Jk.prototype.getSpeed=Jk.prototype.Ol;Jk.prototype.getTracking=Jk.prototype.ni; +Jk.prototype.getTrackingOptions=Jk.prototype.ai;Jk.prototype.setProjection=Jk.prototype.oi;Jk.prototype.setTracking=Jk.prototype.Ue;Jk.prototype.setTrackingOptions=Jk.prototype.Rj;t("ol.Graticule",Xk);Xk.prototype.getMap=Xk.prototype.gn;Xk.prototype.getMeridians=Xk.prototype.Cl;Xk.prototype.getParallels=Xk.prototype.Jl;Xk.prototype.setMap=Xk.prototype.setMap;t("ol.has.DEVICE_PIXEL_RATIO",nd);t("ol.has.CANVAS",pd);t("ol.has.DEVICE_ORIENTATION",qd);t("ol.has.GEOLOCATION",rd);t("ol.has.TOUCH",sd); +t("ol.has.WEBGL",hd);bl.prototype.getImage=bl.prototype.Y;bl.prototype.load=bl.prototype.load;el.prototype.getImage=el.prototype.Y;t("ol.inherits",w);t("ol.interaction.defaults",Zh);t("ol.Kinetic",Gg);t("ol.loadingstrategy.all",tw);t("ol.loadingstrategy.bbox",function(a){return[a]});t("ol.loadingstrategy.tile",function(a){return function(b,c){c=a.Dc(c);b=tc(a,b,c);var d=[];c=[c,0,0];for(c[1]=b.fa;c[1]<=b.la;++c[1])for(c[2]=b.ea;c[2]<=b.ka;++c[2])d.push(a.Ma(c));return d}});t("ol.Map",K); +ed.prototype.originalEvent=ed.prototype.originalEvent;ed.prototype.pixel=ed.prototype.pixel;ed.prototype.coordinate=ed.prototype.coordinate;ed.prototype.dragging=ed.prototype.dragging;dd.prototype.map=dd.prototype.map;dd.prototype.frameState=dd.prototype.frameState;t("ol.Object",Vc);Vc.prototype.get=Vc.prototype.get;Vc.prototype.getKeys=Vc.prototype.P;Vc.prototype.getProperties=Vc.prototype.L;Vc.prototype.set=Vc.prototype.set;Vc.prototype.setProperties=Vc.prototype.H;Vc.prototype.unset=Vc.prototype.R; +Zc.prototype.key=Zc.prototype.key;Zc.prototype.oldValue=Zc.prototype.oldValue;t("ol.Observable",Uc);t("ol.Observable.unByKey",function(a){if(Array.isArray(a))for(var b=0,c=a.length;bb||180Terms of Use');ry.prototype.getApiKey=ry.prototype.ca;ry.prototype.getImagerySet=ry.prototype.ua;t("ol.source.CartoDB",ty);ty.prototype.getConfig=ty.prototype.nl;ty.prototype.updateConfig=ty.prototype.Sq;ty.prototype.setConfig=ty.prototype.uq;t("ol.source.Cluster",X);X.prototype.getDistance=X.prototype.Eo; +X.prototype.getSource=X.prototype.Fo;X.prototype.setDistance=X.prototype.vq;t("ol.source.Image",zy);By.prototype.image=By.prototype.image;t("ol.source.ImageArcGISRest",Hy);Hy.prototype.getParams=Hy.prototype.Ho;Hy.prototype.getImageLoadFunction=Hy.prototype.Go;Hy.prototype.getUrl=Hy.prototype.Io;Hy.prototype.setImageLoadFunction=Hy.prototype.Jo;Hy.prototype.setUrl=Hy.prototype.Ko;Hy.prototype.updateParams=Hy.prototype.Lo;t("ol.source.ImageCanvas",Iy);t("ol.source.ImageMapGuide",Jy); +Jy.prototype.getParams=Jy.prototype.No;Jy.prototype.getImageLoadFunction=Jy.prototype.Mo;Jy.prototype.updateParams=Jy.prototype.Po;Jy.prototype.setImageLoadFunction=Jy.prototype.Oo;t("ol.source.ImageStatic",Ky);t("ol.source.ImageVector",Ly);Ly.prototype.getSource=Ly.prototype.Qo;Ly.prototype.getStyle=Ly.prototype.Ro;Ly.prototype.getStyleFunction=Ly.prototype.ib;Ly.prototype.setStyle=Ly.prototype.aj;t("ol.source.ImageWMS",Ny);Ny.prototype.getGetFeatureInfoUrl=Ny.prototype.Uo; +Ny.prototype.getParams=Ny.prototype.Wo;Ny.prototype.getImageLoadFunction=Ny.prototype.Vo;Ny.prototype.getUrl=Ny.prototype.Xo;Ny.prototype.setImageLoadFunction=Ny.prototype.Yo;Ny.prototype.setUrl=Ny.prototype.Zo;Ny.prototype.updateParams=Ny.prototype.$o;t("ol.source.OSM",Ry);t("ol.source.OSM.ATTRIBUTION",'© OpenStreetMap contributors.');t("ol.source.Raster",Sy);Sy.prototype.setOperation=Sy.prototype.s;Wy.prototype.extent=Wy.prototype.extent; +Wy.prototype.resolution=Wy.prototype.resolution;Wy.prototype.data=Wy.prototype.data;t("ol.source.Source",uw);uw.prototype.getAttributions=uw.prototype.za;uw.prototype.getLogo=uw.prototype.Aa;uw.prototype.getProjection=uw.prototype.Da;uw.prototype.getState=uw.prototype.getState;uw.prototype.refresh=uw.prototype.sa;uw.prototype.setAttributions=uw.prototype.va;t("ol.source.Stamen",Zy);t("ol.source.Tile",iy);iy.prototype.getTileGrid=iy.prototype.jb;ly.prototype.tile=ly.prototype.tile; +t("ol.source.TileArcGISRest",cz);cz.prototype.getParams=cz.prototype.o;cz.prototype.updateParams=cz.prototype.B;t("ol.source.TileDebug",ez);t("ol.source.TileImage",ny);ny.prototype.setRenderReprojectionEdges=ny.prototype.Qb;ny.prototype.setTileGridForProjection=ny.prototype.Rb;t("ol.source.TileJSON",gz);gz.prototype.getTileJSON=gz.prototype.Sl;t("ol.source.TileUTFGrid",hz);hz.prototype.getTemplate=hz.prototype.Pl;hz.prototype.forDataAtCoordinateAndResolution=hz.prototype.al; +t("ol.source.TileWMS",lz);lz.prototype.getGetFeatureInfoUrl=lz.prototype.hp;lz.prototype.getParams=lz.prototype.ip;lz.prototype.updateParams=lz.prototype.jp;my.prototype.getTileLoadFunction=my.prototype.yb;my.prototype.getTileUrlFunction=my.prototype.zb;my.prototype.getUrls=my.prototype.Ab;my.prototype.setTileLoadFunction=my.prototype.Fb;my.prototype.setTileUrlFunction=my.prototype.hb;my.prototype.setUrl=my.prototype.rb;my.prototype.setUrls=my.prototype.vb;t("ol.source.Vector",U); +U.prototype.addFeature=U.prototype.Gb;U.prototype.addFeatures=U.prototype.Qc;U.prototype.clear=U.prototype.clear;U.prototype.forEachFeature=U.prototype.Lh;U.prototype.forEachFeatureInExtent=U.prototype.ec;U.prototype.forEachFeatureIntersectingExtent=U.prototype.Mh;U.prototype.getFeaturesCollection=U.prototype.Th;U.prototype.getFeatures=U.prototype.ee;U.prototype.getFeaturesAtCoordinate=U.prototype.Sh;U.prototype.getFeaturesInExtent=U.prototype.Yf;U.prototype.getClosestFeatureToCoordinate=U.prototype.Oh; +U.prototype.getExtent=U.prototype.G;U.prototype.getFeatureById=U.prototype.Rh;U.prototype.getFormat=U.prototype.ej;U.prototype.getUrl=U.prototype.fj;U.prototype.removeLoadedExtent=U.prototype.Cj;U.prototype.removeFeature=U.prototype.Lb;U.prototype.setLoader=U.prototype.hj;Bw.prototype.feature=Bw.prototype.feature;t("ol.source.VectorTile",rz);rz.prototype.clear=rz.prototype.clear;t("ol.source.WMTS",Y);Y.prototype.getDimensions=Y.prototype.ol;Y.prototype.getFormat=Y.prototype.kp; +Y.prototype.getLayer=Y.prototype.lp;Y.prototype.getMatrixSet=Y.prototype.Al;Y.prototype.getRequestEncoding=Y.prototype.Nl;Y.prototype.getStyle=Y.prototype.mp;Y.prototype.getVersion=Y.prototype.Ul;Y.prototype.updateDimensions=Y.prototype.Tq; +t("ol.source.WMTS.optionsFromCapabilities",function(a,b){var c=hc(a.Contents.Layer,function(a){return a.Identifier==b.layer});if(null===c)return null;var d=a.Contents.TileMatrixSet;var e=1e&&(e=0);var f=c.TileMatrixSetLink[e].TileMatrixSet;var g=c.TileMatrixSetLink[e].TileMatrixSetLimits;var h=c.Format[0];"format"in b&&(h=b.format);e=mc(c.Style,function(a){return"style"in b?a.Title==b.style:a.isDefault});0>e&&(e=0);e=c.Style[e].Identifier;var l={};"Dimension"in c&&c.Dimension.forEach(function(a){var b=a.Identifier,c=a.Default;void 0===c&&(c=a.Value[0]);l[b]=c});var m=hc(a.Contents.TileMatrixSet,function(a){return a.Identifier==f}),n,p=m.SupportedCRS;p&&(n=Ob(p.replace(/urn:ogc:def:crs:(\w+):(.*:)?(\w+)$/, +"$1:$3"))||Ob(p));"projection"in b&&(p=Ob(b.projection),!p||n&&!Xb(p,n)||(n=p));p=c.WGS84BoundingBox;if(void 0!==p){var q=Ob("EPSG:4326").G();q=p[0]==q[0]&&p[2]==q[2];var r=bc(p,"EPSG:4326",n);(p=n.G())&&(La(p,r)||(r=void 0))}g=tz(m,r,g);var u=[];m=b.requestEncoding;m=void 0!==m?m:"";if("OperationsMetadata"in a&&"GetTile"in a.OperationsMetadata)for(a=a.OperationsMetadata.GetTile.DCP.HTTP.Get,r=0,p=a.length;r.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} +.dropdown-submenu:hover>.dropdown-menu{display:block;} +.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;} +.dropdown-submenu:hover>a:after{border-left-color:#ffffff;} +.dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-200%;right:+100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} + +.tt-dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + font-size: 14px; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +.tt-suggestion > p { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; + color: #333333; + white-space: nowrap; +} +.tt-suggestion > p:hover, +.tt-suggestion > p:focus, +.tt-suggestion.tt-cursor p { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #428bca; +} +.tooltip { + position: relative; + padding: 3px; + background: rgba(0, 0, 0, 0.8); + color: white; + opacity: 0.7; + white-space: nowrap; + font: 10pt sans-serif; +} + +.ol-zoom { + left: 50%; + top: 0px; +} + +.ol-control button { + float: left +} + +.ol-rotate { + visibility: hidden; +} + +.l-outer-container { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} + +.l-table { + display: table; +} + +.l-table-row { + display: table-row; +} + +.l-table-cell { + display: table-cell; +} + +.l-container { + width: 100%; + height: 100%; + padding-left : 0px; + padding-right : 0px; +} + +.l-body-content-outer-wrapper { + height: 100%; +} + +.l-body-content-inner-wrapper { + height: 100%; + position: relative; + overflow: auto; +} + +.l-body-content { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} + +.l-smaller { + margin-right: 0px; + margin-bottom: 0px; + margin-top: 0px; + padding: 5px 5px"; + } \ No newline at end of file diff --git a/ogn_python/static/files/tinycolor.js b/ogn_python/static/files/tinycolor.js new file mode 100755 index 0000000..bd46e8f --- /dev/null +++ b/ogn_python/static/files/tinycolor.js @@ -0,0 +1,935 @@ +// TinyColor v0.9.16 +// https://github.com/bgrins/TinyColor +// 2013-08-10, Brian Grinstead, MIT License + +(function() { + +var trimLeft = /^[\s,#]+/, + trimRight = /\s+$/, + tinyCounter = 0, + math = Math, + mathRound = math.round, + mathMin = math.min, + mathMax = math.max, + mathRandom = math.random; + +function tinycolor (color, opts) { + + color = (color) ? color : ''; + opts = opts || { }; + + // If input is already a tinycolor, return itself + if (typeof color == "object" && color.hasOwnProperty("_tc_id")) { + return color; + } + + var rgb = inputToRGB(color); + var r = rgb.r, + g = rgb.g, + b = rgb.b, + a = rgb.a, + roundA = mathRound(100*a) / 100, + format = opts.format || rgb.format; + + // Don't let the range of [0,255] come back in [0,1]. + // Potentially lose a little bit of precision here, but will fix issues where + // .5 gets interpreted as half of the total, instead of half of 1 + // If it was supposed to be 128, this was already taken care of by `inputToRgb` + if (r < 1) { r = mathRound(r); } + if (g < 1) { g = mathRound(g); } + if (b < 1) { b = mathRound(b); } + + return { + ok: rgb.ok, + format: format, + _tc_id: tinyCounter++, + alpha: a, + getAlpha: function() { + return a; + }, + setAlpha: function(value) { + a = boundAlpha(value); + roundA = mathRound(100*a) / 100; + }, + toHsv: function() { + var hsv = rgbToHsv(r, g, b); + return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: a }; + }, + toHsvString: function() { + var hsv = rgbToHsv(r, g, b); + var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100); + return (a == 1) ? + "hsv(" + h + ", " + s + "%, " + v + "%)" : + "hsva(" + h + ", " + s + "%, " + v + "%, "+ roundA + ")"; + }, + toHsl: function() { + var hsl = rgbToHsl(r, g, b); + return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: a }; + }, + toHslString: function() { + var hsl = rgbToHsl(r, g, b); + var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100); + return (a == 1) ? + "hsl(" + h + ", " + s + "%, " + l + "%)" : + "hsla(" + h + ", " + s + "%, " + l + "%, "+ roundA + ")"; + }, + toHex: function(allow3Char) { + return rgbToHex(r, g, b, allow3Char); + }, + toHexString: function(allow3Char) { + return '#' + rgbToHex(r, g, b, allow3Char); + }, + toHexStringAlpha: function(allow3Char) { + return '#' + rgbToHex(r, g, b, false) + roundA.toString(16); + }, + toRgb: function() { + return { r: mathRound(r), g: mathRound(g), b: mathRound(b), a: a }; + }, + toRgbString: function() { + return (a == 1) ? + "rgb(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ")" : + "rgba(" + mathRound(r) + ", " + mathRound(g) + ", " + mathRound(b) + ", " + roundA + ")"; + }, + toPercentageRgb: function() { + return { r: mathRound(bound01(r, 255) * 100) + "%", g: mathRound(bound01(g, 255) * 100) + "%", b: mathRound(bound01(b, 255) * 100) + "%", a: a }; + }, + toPercentageRgbString: function() { + return (a == 1) ? + "rgb(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%)" : + "rgba(" + mathRound(bound01(r, 255) * 100) + "%, " + mathRound(bound01(g, 255) * 100) + "%, " + mathRound(bound01(b, 255) * 100) + "%, " + roundA + ")"; + }, + toName: function() { + if (a === 0) { + return "transparent"; + } + + return hexNames[rgbToHex(r, g, b, true)] || false; + }, + toFilter: function(secondColor) { + var hex = rgbToHex(r, g, b); + var secondHex = hex; + var alphaHex = Math.round(parseFloat(a) * 255).toString(16); + var secondAlphaHex = alphaHex; + var gradientType = opts && opts.gradientType ? "GradientType = 1, " : ""; + + if (secondColor) { + var s = tinycolor(secondColor); + secondHex = s.toHex(); + secondAlphaHex = Math.round(parseFloat(s.alpha) * 255).toString(16); + } + + return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr=#" + pad2(alphaHex) + hex + ",endColorstr=#" + pad2(secondAlphaHex) + secondHex + ")"; + }, + toString: function(format) { + var formatSet = !!format; + format = format || this.format; + + var formattedString = false; + var hasAlphaAndFormatNotSet = !formatSet && a < 1 && a > 0; + var formatWithAlpha = hasAlphaAndFormatNotSet && (format === "hex" || format === "hex6" || format === "hex3" || format === "name"); + + if (format === "rgb") { + formattedString = this.toRgbString(); + } + if (format === "prgb") { + formattedString = this.toPercentageRgbString(); + } + if (format === "hex" || format === "hex6") { + formattedString = this.toHexString(); + } + if (format === "hex3") { + formattedString = this.toHexString(true); + } + if (format === "name") { + formattedString = this.toName(); + } + if (format === "hsl") { + formattedString = this.toHslString(); + } + if (format === "hsv") { + formattedString = this.toHsvString(); + } + + if (formatWithAlpha) { + return this.toRgbString(); + } + + return formattedString || this.toHexString(); + } + }; +} + +// If input is an object, force 1 into "1.0" to handle ratios properly +// String input requires "1.0" as input, so 1 will be treated as 1 +tinycolor.fromRatio = function(color, opts) { + if (typeof color == "object") { + var newColor = {}; + for (var i in color) { + if (color.hasOwnProperty(i)) { + if (i === "a") { + newColor[i] = color[i]; + } + else { + newColor[i] = convertToPercentage(color[i]); + } + } + } + color = newColor; + } + + return tinycolor(color, opts); +}; + +// Given a string or object, convert that input to RGB +// Possible string inputs: +// +// "red" +// "#f00" or "f00" +// "#ff0000" or "ff0000" +// "rgb 255 0 0" or "rgb (255, 0, 0)" +// "rgb 1.0 0 0" or "rgb (1, 0, 0)" +// "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1" +// "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1" +// "hsl(0, 100%, 50%)" or "hsl 0 100% 50%" +// "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1" +// "hsv(0, 100%, 100%)" or "hsv 0 100% 100%" +// +function inputToRGB(color) { + + var rgb = { r: 0, g: 0, b: 0 }; + var a = 1; + var ok = false; + var format = false; + + if (typeof color == "string") { + color = stringInputToObject(color); + } + + if (typeof color == "object") { + if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) { + rgb = rgbToRgb(color.r, color.g, color.b); + ok = true; + format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb"; + } + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) { + color.s = convertToPercentage(color.s); + color.v = convertToPercentage(color.v); + rgb = hsvToRgb(color.h, color.s, color.v); + ok = true; + format = "hsv"; + } + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) { + color.s = convertToPercentage(color.s); + color.l = convertToPercentage(color.l); + rgb = hslToRgb(color.h, color.s, color.l); + ok = true; + format = "hsl"; + } + + if (color.hasOwnProperty("a")) { + a = color.a; + } + } + + a = boundAlpha(a); + + return { + ok: ok, + format: color.format || format, + r: mathMin(255, mathMax(rgb.r, 0)), + g: mathMin(255, mathMax(rgb.g, 0)), + b: mathMin(255, mathMax(rgb.b, 0)), + a: a + }; +} + + +// Conversion Functions +// -------------------- + +// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from: +// + +// `rgbToRgb` +// Handle bounds / percentage checking to conform to CSS color spec +// +// *Assumes:* r, g, b in [0, 255] or [0, 1] +// *Returns:* { r, g, b } in [0, 255] +function rgbToRgb(r, g, b){ + return { + r: bound01(r, 255) * 255, + g: bound01(g, 255) * 255, + b: bound01(b, 255) * 255 + }; +} + +// `rgbToHsl` +// Converts an RGB color value to HSL. +// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1] +// *Returns:* { h, s, l } in [0,1] +function rgbToHsl(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, l = (max + min) / 2; + + if(max == min) { + h = s = 0; // achromatic + } + else { + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + + h /= 6; + } + + return { h: h, s: s, l: l }; +} + +// `hslToRgb` +// Converts an HSL color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] +function hslToRgb(h, s, l) { + var r, g, b; + + h = bound01(h, 360); + s = bound01(s, 100); + l = bound01(l, 100); + + function hue2rgb(p, q, t) { + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + if(s === 0) { + r = g = b = l; // achromatic + } + else { + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// `rgbToHsv` +// Converts an RGB color value to HSV +// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1] +// *Returns:* { h, s, v } in [0,1] +function rgbToHsv(r, g, b) { + + r = bound01(r, 255); + g = bound01(g, 255); + b = bound01(b, 255); + + var max = mathMax(r, g, b), min = mathMin(r, g, b); + var h, s, v = max; + + var d = max - min; + s = max === 0 ? 0 : d / max; + + if(max == min) { + h = 0; // achromatic + } + else { + switch(max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return { h: h, s: s, v: v }; +} + +// `hsvToRgb` +// Converts an HSV color value to RGB. +// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100] +// *Returns:* { r, g, b } in the set [0, 255] + function hsvToRgb(h, s, v) { + + h = bound01(h, 360) * 6; + s = bound01(s, 100); + v = bound01(v, 100); + + var i = math.floor(h), + f = h - i, + p = v * (1 - s), + q = v * (1 - f * s), + t = v * (1 - (1 - f) * s), + mod = i % 6, + r = [v, q, p, p, t, v][mod], + g = [t, v, v, q, p, p][mod], + b = [p, p, t, v, v, q][mod]; + + return { r: r * 255, g: g * 255, b: b * 255 }; +} + +// `rgbToHex` +// Converts an RGB color to hex +// Assumes r, g, and b are contained in the set [0, 255] +// Returns a 3 or 6 character hex +function rgbToHex(r, g, b, allow3Char) { + + var hex = [ + pad2(mathRound(r).toString(16)), + pad2(mathRound(g).toString(16)), + pad2(mathRound(b).toString(16)) + ]; + + // Return a 3 character hex if possible + if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) { + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0); + } + + return hex.join(""); +} + +// `equals` +// Can be called with any tinycolor input +tinycolor.equals = function (color1, color2) { + if (!color1 || !color2) { return false; } + return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString(); +}; +tinycolor.random = function() { + return tinycolor.fromRatio({ + r: mathRandom(), + g: mathRandom(), + b: mathRandom() + }); +}; + + +// Modification Functions +// ---------------------- +// Thanks to less.js for some of the basics here +// + +tinycolor.desaturate = function (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s -= amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +}; +tinycolor.saturate = function (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.s += amount / 100; + hsl.s = clamp01(hsl.s); + return tinycolor(hsl); +}; +tinycolor.greyscale = function(color) { + return tinycolor.desaturate(color, 100); +}; +tinycolor.lighten = function(color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l += amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +}; +tinycolor.darken = function (color, amount) { + amount = (amount === 0) ? 0 : (amount || 10); + var hsl = tinycolor(color).toHsl(); + hsl.l -= amount / 100; + hsl.l = clamp01(hsl.l); + return tinycolor(hsl); +}; +tinycolor.complement = function(color) { + var hsl = tinycolor(color).toHsl(); + hsl.h = (hsl.h + 180) % 360; + return tinycolor(hsl); +}; + + +// Combination Functions +// --------------------- +// Thanks to jQuery xColor for some of the ideas behind these +// + +tinycolor.triad = function(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l }) + ]; +}; +tinycolor.tetrad = function(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }), + tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l }) + ]; +}; +tinycolor.splitcomplement = function(color) { + var hsl = tinycolor(color).toHsl(); + var h = hsl.h; + return [ + tinycolor(color), + tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}), + tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l}) + ]; +}; +tinycolor.analogous = function(color, results, slices) { + results = results || 6; + slices = slices || 30; + + var hsl = tinycolor(color).toHsl(); + var part = 360 / slices; + var ret = [tinycolor(color)]; + + for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) { + hsl.h = (hsl.h + part) % 360; + ret.push(tinycolor(hsl)); + } + return ret; +}; +tinycolor.monochromatic = function(color, results) { + results = results || 6; + var hsv = tinycolor(color).toHsv(); + var h = hsv.h, s = hsv.s, v = hsv.v; + var ret = []; + var modification = 1 / results; + + while (results--) { + ret.push(tinycolor({ h: h, s: s, v: v})); + v = (v + modification) % 1; + } + + return ret; +}; + + +// Readability Functions +// --------------------- +// + +// `readability` +// Analyze the 2 colors and returns an object with the following properties: +// `brightness`: difference in brightness between the two colors +// `color`: difference in color/hue between the two colors +tinycolor.readability = function(color1, color2) { + var a = tinycolor(color1).toRgb(); + var b = tinycolor(color2).toRgb(); + var brightnessA = (a.r * 299 + a.g * 587 + a.b * 114) / 1000; + var brightnessB = (b.r * 299 + b.g * 587 + b.b * 114) / 1000; + var colorDiff = ( + Math.max(a.r, b.r) - Math.min(a.r, b.r) + + Math.max(a.g, b.g) - Math.min(a.g, b.g) + + Math.max(a.b, b.b) - Math.min(a.b, b.b) + ); + + return { + brightness: Math.abs(brightnessA - brightnessB), + color: colorDiff + }; +}; + +// `readable` +// http://www.w3.org/TR/AERT#color-contrast +// Ensure that foreground and background color combinations provide sufficient contrast. +// *Example* +// tinycolor.readable("#000", "#111") => false +tinycolor.readable = function(color1, color2) { + var readability = tinycolor.readability(color1, color2); + return readability.brightness > 125 && readability.color > 500; +}; + +// `mostReadable` +// Given a base color and a list of possible foreground or background +// colors for that base, returns the most readable color. +// *Example* +// tinycolor.mostReadable("#123", ["#fff", "#000"]) => "#000" +tinycolor.mostReadable = function(baseColor, colorList) { + var bestColor = null; + var bestScore = 0; + var bestIsReadable = false; + for (var i=0; i < colorList.length; i++) { + + // We normalize both around the "acceptable" breaking point, + // but rank brightness constrast higher than hue. + + var readability = tinycolor.readability(baseColor, colorList[i]); + var readable = readability.brightness > 125 && readability.color > 500; + var score = 3 * (readability.brightness / 125) + (readability.color / 500); + + if ((readable && ! bestIsReadable) || + (readable && bestIsReadable && score > bestScore) || + ((! readable) && (! bestIsReadable) && score > bestScore)) { + bestIsReadable = readable; + bestScore = score; + bestColor = tinycolor(colorList[i]); + } + } + return bestColor; +}; + + +// Big List of Colors +// ------------------ +// +var names = tinycolor.names = { + aliceblue: "f0f8ff", + antiquewhite: "faebd7", + aqua: "0ff", + aquamarine: "7fffd4", + azure: "f0ffff", + beige: "f5f5dc", + bisque: "ffe4c4", + black: "000", + blanchedalmond: "ffebcd", + blue: "00f", + blueviolet: "8a2be2", + brown: "a52a2a", + burlywood: "deb887", + burntsienna: "ea7e5d", + cadetblue: "5f9ea0", + chartreuse: "7fff00", + chocolate: "d2691e", + coral: "ff7f50", + cornflowerblue: "6495ed", + cornsilk: "fff8dc", + crimson: "dc143c", + cyan: "0ff", + darkblue: "00008b", + darkcyan: "008b8b", + darkgoldenrod: "b8860b", + darkgray: "a9a9a9", + darkgreen: "006400", + darkgrey: "a9a9a9", + darkkhaki: "bdb76b", + darkmagenta: "8b008b", + darkolivegreen: "556b2f", + darkorange: "ff8c00", + darkorchid: "9932cc", + darkred: "8b0000", + darksalmon: "e9967a", + darkseagreen: "8fbc8f", + darkslateblue: "483d8b", + darkslategray: "2f4f4f", + darkslategrey: "2f4f4f", + darkturquoise: "00ced1", + darkviolet: "9400d3", + deeppink: "ff1493", + deepskyblue: "00bfff", + dimgray: "696969", + dimgrey: "696969", + dodgerblue: "1e90ff", + firebrick: "b22222", + floralwhite: "fffaf0", + forestgreen: "228b22", + fuchsia: "f0f", + gainsboro: "dcdcdc", + ghostwhite: "f8f8ff", + gold: "ffd700", + goldenrod: "daa520", + gray: "808080", + green: "008000", + greenyellow: "adff2f", + grey: "808080", + honeydew: "f0fff0", + hotpink: "ff69b4", + indianred: "cd5c5c", + indigo: "4b0082", + ivory: "fffff0", + khaki: "f0e68c", + lavender: "e6e6fa", + lavenderblush: "fff0f5", + lawngreen: "7cfc00", + lemonchiffon: "fffacd", + lightblue: "add8e6", + lightcoral: "f08080", + lightcyan: "e0ffff", + lightgoldenrodyellow: "fafad2", + lightgray: "d3d3d3", + lightgreen: "90ee90", + lightgrey: "d3d3d3", + lightpink: "ffb6c1", + lightsalmon: "ffa07a", + lightseagreen: "20b2aa", + lightskyblue: "87cefa", + lightslategray: "789", + lightslategrey: "789", + lightsteelblue: "b0c4de", + lightyellow: "ffffe0", + lime: "0f0", + limegreen: "32cd32", + linen: "faf0e6", + magenta: "f0f", + maroon: "800000", + mediumaquamarine: "66cdaa", + mediumblue: "0000cd", + mediumorchid: "ba55d3", + mediumpurple: "9370db", + mediumseagreen: "3cb371", + mediumslateblue: "7b68ee", + mediumspringgreen: "00fa9a", + mediumturquoise: "48d1cc", + mediumvioletred: "c71585", + midnightblue: "191970", + mintcream: "f5fffa", + mistyrose: "ffe4e1", + moccasin: "ffe4b5", + navajowhite: "ffdead", + navy: "000080", + oldlace: "fdf5e6", + olive: "808000", + olivedrab: "6b8e23", + orange: "ffa500", + orangered: "ff4500", + orchid: "da70d6", + palegoldenrod: "eee8aa", + palegreen: "98fb98", + paleturquoise: "afeeee", + palevioletred: "db7093", + papayawhip: "ffefd5", + peachpuff: "ffdab9", + peru: "cd853f", + pink: "ffc0cb", + plum: "dda0dd", + powderblue: "b0e0e6", + purple: "800080", + red: "f00", + rosybrown: "bc8f8f", + royalblue: "4169e1", + saddlebrown: "8b4513", + salmon: "fa8072", + sandybrown: "f4a460", + seagreen: "2e8b57", + seashell: "fff5ee", + sienna: "a0522d", + silver: "c0c0c0", + skyblue: "87ceeb", + slateblue: "6a5acd", + slategray: "708090", + slategrey: "708090", + snow: "fffafa", + springgreen: "00ff7f", + steelblue: "4682b4", + tan: "d2b48c", + teal: "008080", + thistle: "d8bfd8", + tomato: "ff6347", + turquoise: "40e0d0", + violet: "ee82ee", + wheat: "f5deb3", + white: "fff", + whitesmoke: "f5f5f5", + yellow: "ff0", + yellowgreen: "9acd32" +}; + +// Make it easy to access colors via `hexNames[hex]` +var hexNames = tinycolor.hexNames = flip(names); + + +// Utilities +// --------- + +// `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }` +function flip(o) { + var flipped = { }; + for (var i in o) { + if (o.hasOwnProperty(i)) { + flipped[o[i]] = i; + } + } + return flipped; +} + +// Return a valid alpha value [0,1] with all invalid values being set to 1 +function boundAlpha(a) { + a = parseFloat(a); + + if (isNaN(a) || a < 0 || a > 1) { + a = 1; + } + + return a; +} + +// Take input from [0, n] and return it as [0, 1] +function bound01(n, max) { + if (isOnePointZero(n)) { n = "100%"; } + + var processPercent = isPercentage(n); + n = mathMin(max, mathMax(0, parseFloat(n))); + + // Automatically convert percentage into number + if (processPercent) { + n = parseInt(n * max, 10) / 100; + } + + // Handle floating point rounding errors + if ((math.abs(n - max) < 0.000001)) { + return 1; + } + + // Convert into [0, 1] range if it isn't already + return (n % max) / parseFloat(max); +} + +// Force a number between 0 and 1 +function clamp01(val) { + return mathMin(1, mathMax(0, val)); +} + +// Parse an integer into hex +function parseHex(val) { + return parseInt(val, 16); +} + +// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1 +// +function isOnePointZero(n) { + return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1; +} + +// Check to see if string passed in is a percentage +function isPercentage(n) { + return typeof n === "string" && n.indexOf('%') != -1; +} + +// Force a hex value to have 2 characters +function pad2(c) { + return c.length == 1 ? '0' + c : '' + c; +} + +// Replace a decimal with it's percentage value +function convertToPercentage(n) { + if (n <= 1) { + n = (n * 100) + "%"; + } + + return n; +} + +var matchers = (function() { + + // + var CSS_INTEGER = "[-\\+]?\\d+%?"; + + // + var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?"; + + // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome. + var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")"; + + // Actual matching. + // Parentheses and commas are optional, but not required. + // Whitespace can take the place of commas or opening paren + var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?"; + + return { + rgb: new RegExp("rgb" + PERMISSIVE_MATCH3), + rgba: new RegExp("rgba" + PERMISSIVE_MATCH4), + hsl: new RegExp("hsl" + PERMISSIVE_MATCH3), + hsla: new RegExp("hsla" + PERMISSIVE_MATCH4), + hsv: new RegExp("hsv" + PERMISSIVE_MATCH3), + hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/, + hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/, + hex8: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/ + }; +})(); + +// `stringInputToObject` +// Permissive string parsing. Take in a number of formats, and output an object +// based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` +function stringInputToObject(color) { + + color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase(); + var named = false; + if (names[color]) { + color = names[color]; + named = true; + } + else if (color == 'transparent') { + return { r: 0, g: 0, b: 0, a: 0, format: "name" }; + } + + // Try to match string input using regular expressions. + // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360] + // Just return an object and let the conversion functions handle that. + // This way the result will be the same whether the tinycolor is initialized with string or object. + var match; + if ((match = matchers.rgb.exec(color))) { + return { r: match[1], g: match[2], b: match[3] }; + } + if ((match = matchers.rgba.exec(color))) { + return { r: match[1], g: match[2], b: match[3], a: match[4] }; + } + if ((match = matchers.hsl.exec(color))) { + return { h: match[1], s: match[2], l: match[3] }; + } + if ((match = matchers.hsla.exec(color))) { + return { h: match[1], s: match[2], l: match[3], a: match[4] }; + } + if ((match = matchers.hsv.exec(color))) { + return { h: match[1], s: match[2], v: match[3] }; + } + if ((match = matchers.hex6.exec(color))) { + return { + r: parseHex(match[1]), + g: parseHex(match[2]), + b: parseHex(match[3]), + format: named ? "name" : "hex" + }; + } + if ((match = matchers.hex8.exec(color))) { + return { + r: parseHex(match[1]), + g: parseHex(match[2]), + b: parseHex(match[3]), + a: parseHex(match[4])/255, + format: named ? "name" : "hex" + }; + } + if ((match = matchers.hex3.exec(color))) { + return { + r: parseHex(match[1] + '' + match[1]), + g: parseHex(match[2] + '' + match[2]), + b: parseHex(match[3] + '' + match[3]), + format: named ? "name" : "hex" + }; + } + + return false; +} + +// Node: Export function +if (typeof module !== "undefined" && module.exports) { + module.exports = tinycolor; +} +// AMD/requirejs: Define the module +else if (typeof define !== "undefined") { + define(function () {return tinycolor;}); +} +// Browser: Expose to window +else { + window.tinycolor = tinycolor; +} + +})(); diff --git a/ogn_python/static/files/url.js.sample b/ogn_python/static/files/url.js.sample new file mode 100644 index 0000000..6c171ac --- /dev/null +++ b/ogn_python/static/files/url.js.sample @@ -0,0 +1 @@ +var url = "http://yourserver.com/OGNRANGE/"; diff --git a/ogn_python/templates/ognrange.html b/ogn_python/templates/ognrange.html new file mode 100755 index 0000000..5f628eb --- /dev/null +++ b/ogn_python/templates/ognrange.html @@ -0,0 +1,189 @@ + + + + + + + + + + + + Open Glider Network Range Tool + + + + + + + + + + + + + + + + + + + + + + +
      + +
      + + + +
      + + + +
      + + + + +
      +
      + Data from the Open Glider Network
      + Copyright (c) 2014, Temeletry Ltd,Credits + + + +
      +
      + +
      +
      +
      + + + +
      + + + + + + + + + + +