You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2190 lines
408 KiB
2190 lines
408 KiB
12 months ago
|
/**
|
||
|
* Cesium Navigation - https://github.com/alberto-acevedo/cesium-navigation
|
||
|
*
|
||
|
* The plugin is 100% based on open source libraries. The same license that applies to Cesiumjs and terriajs applies also to this plugin. Feel free to use it, modify it, and improve it.
|
||
|
*/
|
||
|
|
||
|
/*!
|
||
|
* Knockout JavaScript library v3.4.2
|
||
|
* (c) The Knockout.js team - http://knockoutjs.com/
|
||
|
* License: MIT (http://www.opensource.org/licenses/mit-license.php)
|
||
|
*/
|
||
|
|
||
|
(function() {(function(n){var x=this||(0,eval)("this"),t=x.document,M=x.navigator,u=x.jQuery,H=x.JSON;(function(n){"function"===typeof define&&define.amd?define('knockout',["exports","require"],n):"object"===typeof exports&&"object"===typeof module?n(module.exports||exports):n(x.ko={})})(function(N,O){function J(a,c){return null===a||typeof a in R?a===c:!1}function S(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=n;b()},c))}}function T(b,c){var d;return function(){clearTimeout(d);d=a.a.setTimeout(b,c)}}function U(a,
|
||
|
c){c&&c!==E?"beforeChange"===c?this.Ob(a):this.Ja(a,c):this.Pb(a)}function V(a,c){null!==c&&c.k&&c.k()}function W(a,c){var d=this.Mc,e=d[s];e.T||(this.ob&&this.Oa[c]?(d.Sb(c,a,this.Oa[c]),this.Oa[c]=null,--this.ob):e.s[c]||d.Sb(c,a,e.t?{$:a}:d.yc(a)),a.Ha&&a.Hc())}function K(b,c,d,e){a.d[b]={init:function(b,g,h,l,m){var k,r;a.m(function(){var q=g(),p=a.a.c(q),p=!d!==!p,A=!r;if(A||c||p!==k)A&&a.xa.Ca()&&(r=a.a.wa(a.f.childNodes(b),!0)),p?(A||a.f.fa(b,a.a.wa(r)),a.hb(e?e(m,q):m,b)):a.f.za(b),k=p},null,
|
||
|
{i:b});return{controlsDescendantBindings:!0}}};a.h.va[b]=!1;a.f.aa[b]=!0}var a="undefined"!==typeof N?N:{};a.b=function(b,c){for(var d=b.split("."),e=a,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=c};a.H=function(a,c,d){a[c]=d};a.version="3.4.2";a.b("version",a.version);a.options={deferUpdates:!1,useOnlyNativeEvents:!1};a.a=function(){function b(a,b){for(var c in a)a.hasOwnProperty(c)&&b(c,a[c])}function c(a,b){if(b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function d(a,b){a.__proto__=
|
||
|
b;return a}function e(b,c,d,e){var m=b[c].match(r)||[];a.a.r(d.match(r),function(b){a.a.ra(m,b,e)});b[c]=m.join(" ")}var f={__proto__:[]}instanceof Array,g="function"===typeof Symbol,h={},l={};h[M&&/Firefox\/2/i.test(M.userAgent)?"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];h.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");b(h,function(a,b){if(b.length)for(var c=0,d=b.length;c<d;c++)l[b[c]]=a});var m={propertychange:!0},k=
|
||
|
t&&function(){for(var a=3,b=t.createElement("div"),c=b.getElementsByTagName("i");b.innerHTML="\x3c!--[if gt IE "+ ++a+"]><i></i><![endif]--\x3e",c[0];);return 4<a?a:n}(),r=/\S+/g;return{gc:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],r:function(a,b){for(var c=0,d=a.length;c<d;c++)b(a[c],c)},o:function(a,b){if("function"==typeof Array.prototype.indexOf)return Array.prototype.indexOf.call(a,b);for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},Vb:function(a,b,c){for(var d=
|
||
|
0,e=a.length;d<e;d++)if(b.call(c,a[d],d))return a[d];return null},Na:function(b,c){var d=a.a.o(b,c);0<d?b.splice(d,1):0===d&&b.shift()},Wb:function(b){b=b||[];for(var c=[],d=0,e=b.length;d<e;d++)0>a.a.o(c,b[d])&&c.push(b[d]);return c},ib:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)c.push(b(a[d],d));return c},Ma:function(a,b){a=a||[];for(var c=[],d=0,e=a.length;d<e;d++)b(a[d],d)&&c.push(a[d]);return c},ta:function(a,b){if(b instanceof Array)a.push.apply(a,b);else for(var c=0,d=b.length;c<
|
||
|
d;c++)a.push(b[c]);return a},ra:function(b,c,d){var e=a.a.o(a.a.Bb(b),c);0>e?d&&b.push(c):d||b.splice(e,1)},la:f,extend:c,$a:d,ab:f?d:c,D:b,Ea:function(a,b){if(!a)return a;var c={},d;for(d in a)a.hasOwnProperty(d)&&(c[d]=b(a[d],d,a));return c},rb:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},nc:function(b){b=a.a.W(b);for(var c=(b[0]&&b[0].ownerDocument||t).createElement("div"),d=0,e=b.length;d<e;d++)c.appendChild(a.ba(b[d]));return c},wa:function(b,c){for(var d=0,e=b.length,m=[];d<e;d++){var k=
|
||
|
b[d].cloneNode(!0);m.push(c?a.ba(k):k)}return m},fa:function(b,c){a.a.rb(b);if(c)for(var d=0,e=c.length;d<e;d++)b.appendChild(c[d])},uc:function(b,c){var d=b.nodeType?[b]:b;if(0<d.length){for(var e=d[0],m=e.parentNode,k=0,f=c.length;k<f;k++)m.insertBefore(c[k],e);k=0;for(f=d.length;k<f;k++)a.removeNode(d[k])}},Ba:function(a,b){if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==b;)a.length--;if(1<a.length){var c=
|
||
|
a[0],d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),c=c.nextSibling;a.push(d)}}return a},wc:function(a,b){7>k?a.setAttribute("selected",b):a.selected=b},cb:function(a){return null===a||a===n?"":a.trim?a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},sd:function(a,b){a=a||"";return b.length>a.length?!1:a.substring(0,b.length)===b},Rc:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(3===a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==
|
||
|
(b.compareDocumentPosition(a)&16);for(;a&&a!=b;)a=a.parentNode;return!!a},qb:function(b){return a.a.Rc(b,b.ownerDocument.documentElement)},Tb:function(b){return!!a.a.Vb(b,a.a.qb)},A:function(a){return a&&a.tagName&&a.tagName.toLowerCase()},Zb:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.Zb(b),c)},dc:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},q:function(b,
|
||
|
c,d){var e=a.a.Zb(d);d=k&&m[c];if(a.options.useOnlyNativeEvents||d||!u)if(d||"function"!=typeof b.addEventListener)if("undefined"!=typeof b.attachEvent){var f=function(a){e.call(b,a)},l="on"+c;b.attachEvent(l,f);a.a.G.qa(b,function(){b.detachEvent(l,f)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else b.addEventListener(c,e,!1);else u(b).bind(c,e)},Fa:function(b,c){if(!b||!b.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var d;"input"===
|
||
|
a.a.A(b)&&b.type&&"click"==c.toLowerCase()?(d=b.type,d="checkbox"==d||"radio"==d):d=!1;if(a.options.useOnlyNativeEvents||!u||d)if("function"==typeof t.createEvent)if("function"==typeof b.dispatchEvent)d=t.createEvent(l[c]||"HTMLEvents"),d.initEvent(c,!0,!0,x,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error("The supplied element doesn't support dispatchEvent");else if(d&&b.click)b.click();else if("undefined"!=typeof b.fireEvent)b.fireEvent("on"+c);else throw Error("Browser doesn't support triggering events");
|
||
|
else u(b).trigger(c)},c:function(b){return a.I(b)?b():b},Bb:function(b){return a.I(b)?b.p():b},fb:function(b,c,d){var k;c&&("object"===typeof b.classList?(k=b.classList[d?"add":"remove"],a.a.r(c.match(r),function(a){k.call(b.classList,a)})):"string"===typeof b.className.baseVal?e(b.className,"baseVal",c,d):e(b,"className",c,d))},bb:function(b,c){var d=a.a.c(c);if(null===d||d===n)d="";var e=a.f.firstChild(b);!e||3!=e.nodeType||a.f.nextSibling(e)?a.f.fa(b,[b.ownerDocument.createTextNode(d)]):e.data=
|
||
|
d;a.a.Wc(b)},vc:function(a,b){a.name=b;if(7>=k)try{a.mergeAttributes(t.createElement("<input name='"+a.name+"'/>"),!1)}catch(c){}},Wc:function(a){9<=k&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},Sc:function(a){if(k){var b=a.style.width;a.style.width=0;a.style.width=b}},nd:function(b,c){b=a.a.c(b);c=a.a.c(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},W:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c]);return b},bc:function(a){return g?Symbol(a):a},xd:6===k,
|
||
|
yd:7===k,C:k,ic:function(b,c){for(var d=a.a.W(b.getElementsByTagName("input")).concat(a.a.W(b.getElementsByTagName("textarea"))),e="string"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},k=[],m=d.length-1;0<=m;m--)e(d[m])&&k.push(d[m]);return k},kd:function(b){return"string"==typeof b&&(b=a.a.cb(b))?H&&H.parse?H.parse(b):(new Function("return "+b))():null},Gb:function(b,c,d){if(!H||!H.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
|
||
|
return H.stringify(a.a.c(b),c,d)},ld:function(c,d,e){e=e||{};var k=e.params||{},m=e.includeFields||this.gc,f=c;if("object"==typeof c&&"form"===a.a.A(c))for(var f=c.action,l=m.length-1;0<=l;l--)for(var g=a.a.ic(c,m[l]),h=g.length-1;0<=h;h--)k[g[h].name]=g[h].value;d=a.a.c(d);var r=t.createElement("form");r.style.display="none";r.action=f;r.method="post";for(var n in d)c=t.createElement("input"),c.type="hidden",c.name=n,c.value=a.a.Gb(a.a.c(d[n])),r.appendChild(c);b(k,function(a,b){var c=t.createElement("input");
|
||
|
c.type="hidden";c.name=a;c.value=b;r.appendChild(c)});t.body.appendChild(r);e.submitter?e.submitter(r):r.submit();setTimeout(function(){r.parentNode.removeChild(r)},0)}}}();a.b("utils",a.a);a.b("utils.arrayForEach",a.a.r);a.b("utils.arrayFirst",a.a.Vb);a.b("utils.arrayFilter",a.a.Ma);a.b("utils.arrayGetDistinctValues",a.a.Wb);a.b("utils.arrayIndexOf",a.a.o);a.b("utils.arrayMap",a.a.ib);a.b("utils.arrayPushAll",a.a.ta);a.b("utils.arrayRemoveItem",a.a.Na);a.b("utils.extend",a.a.extend);a.b("utils.fieldsIncludedWithJsonPost",
|
||
|
a.a.gc);a.b("utils.getFormFields",a.a.ic);a.b("utils.peekObservable",a.a.Bb);a.b("utils.postJson",a.a.ld);a.b("utils.parseJson",a.a.kd);a.b("utils.registerEventHandler",a.a.q);a.b("utils.stringifyJson",a.a.Gb);a.b("utils.range",a.a.nd);a.b("utils.toggleDomNodeCssClass",a.a.fb);a.b("utils.triggerEvent",a.a.Fa);a.b("utils.unwrapObservable",a.a.c);a.b("utils.objectForEach",a.a.D);a.b("utils.addOrRemoveItem",a.a.ra);a.b("utils.setTextContent",a.a.bb);a.b("unwrap",a.a.c);Function.prototype.bind||(Function.prototype.bind=
|
||
|
function(a){var c=this;if(1===arguments.length)return function(){return c.apply(a,arguments)};var d=Array.prototype.slice.call(arguments,1);return function(){var e=d.slice(0);e.push.apply(e,arguments);return c.apply(a,e)}});a.a.e=new function(){function a(b,g){var h=b[d];if(!h||"null"===h||!e[h]){if(!g)return n;h=b[d]="ko"+c++;e[h]={}}return e[h]}var c=0,d="__ko__"+(new Date).getTime(),e={};return{get:function(c,d){var e=a(c,!1);return e===n?n:e[d]},set:function(c,d,e){if(e!==n||a(c,!1)!==n)a(c,!0)[d]=
|
||
|
e},clear:function(a){var b=a[d];return b?(delete e[b],a[d]=null,!0):!1},J:function(){return c++ +d}}};a.b("utils.domData",a.a.e);a.b("utils.domData.clear",a.a.e.clear);a.a.G=new function(){function b(b,c){var e=a.a.e.get(b,d);e===n&&c&&(e=[],a.a.e.set(b,d,e));return e}function c(d){var e=b(d,!1);if(e)for(var e=e.slice(0),l=0;l<e.length;l++)e[l](d);a.a.e.clear(d);a.a.G.cleanExternalData(d);if(f[d.nodeType])for(e=d.firstChild;d=e;)e=d.nextSibling,8===d.nodeType&&c(d)}var d=a.a.e.J(),e={1:!0,8:!0,9:!0},
|
||
|
f={1:!0,9:!0};return{qa:function(a,c){if("function"!=typeof c)throw Error("Callback must be a function");b(a,!0).push(c)},tc:function(c,e){var f=b(c,!1);f&&(a.a.Na(f,e),0==f.length&&a.a.e.set(c,d,n))},ba:function(b){if(e[b.nodeType]&&(c(b),f[b.nodeType])){var d=[];a.a.ta(d,b.getElementsByTagName("*"));for(var l=0,m=d.length;l<m;l++)c(d[l])}return b},removeNode:function(b){a.ba(b);b.parentNode&&b.parentNode.removeChild(b)},cleanExternalData:function(a){u&&"function"==typeof u.cleanData&&u.cleanData([a])}}};
|
||
|
a.ba=a.a.G.ba;a.removeNode=a.a.G.removeNode;a.b("cleanNode",a.ba);a.b("removeNode",a.removeNode);a.b("utils.domNodeDisposal",a.a.G);a.b("utils.domNodeDisposal.addDisposeCallback",a.a.G.qa);a.b("utils.domNodeDisposal.removeDisposeCallback",a.a.G.tc);(function(){var b=[0,"",""],c=[1,"<table>","</table>"],d=[3,"<table><tbody><tr>","</tr></tbody></table>"],e=[1,"<select multiple='multiple'>","</select>"],f={thead:c,tbody:c,tfoot:c,tr:[2,"<table><tbody>","</tbody></table>"],td:d,th:d,option:e,optgroup:e},
|
||
|
g=8>=a.a.C;a.a.na=function(c,d){var e;if(u)if(u.parseHTML)e=u.parseHTML(c,d)||[];else{if((e=u.clean([c],d))&&e[0]){for(var k=e[0];k.parentNode&&11!==k.parentNode.nodeType;)k=k.parentNode;k.parentNode&&k.parentNode.removeChild(k)}}else{(e=d)||(e=t);var k=e.parentWindow||e.defaultView||x,r=a.a.cb(c).toLowerCase(),q=e.createElement("div"),p;p=(r=r.match(/^<([a-z]+)[ >]/))&&f[r[1]]||b;r=p[0];p="ignored<div>"+p[1]+c+p[2]+"</div>";"function"==typeof k.innerShiv?q.appendChild(k.innerShiv(p)):(g&&e.appendChild(q),
|
||
|
q.innerHTML=p,g&&q.parentNode.removeChild(q));for(;r--;)q=q.lastChild;e=a.a.W(q.lastChild.childNodes)}return e};a.a.Eb=function(b,c){a.a.rb(b);c=a.a.c(c);if(null!==c&&c!==n)if("string"!=typeof c&&(c=c.toString()),u)u(b).html(c);else for(var d=a.a.na(c,b.ownerDocument),e=0;e<d.length;e++)b.appendChild(d[e])}})();a.b("utils.parseHtmlFragment",a.a.na);a.b("utils.setHtml",a.a.Eb);a.N=function(){function b(c,e){if(c)if(8==c.nodeType){var f=a.N.pc(c.nodeValue);null!=f&&e.push({Qc:c,hd:f})}else if(1==c.nodeType)for(var f=
|
||
|
0,g=c.childNodes,h=g.length;f<h;f++)b(g[f],e)}var c={};return{yb:function(a){if("function"!=typeof a)throw Error("You can only pass a function to ko.memoization.memoize()");var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);c[b]=a;return"\x3c!--[ko_memo:"+b+"]--\x3e"},Bc:function(a,b){var f=c[a];if(f===n)throw Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized.");try{return f.apply(null,b||[]),
|
||
|
!0}finally{delete c[a]}},Cc:function(c,e){var f=[];b(c,f);for(var g=0,h=f.length;g<h;g++){var l=f[g].Qc,m=[l];e&&a.a.ta(m,e);a.N.Bc(f[g].hd,m);l.nodeValue="";l.parentNode&&l.parentNode.removeChild(l)}},pc:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:null}}}();a.b("memoization",a.N);a.b("memoization.memoize",a.N.yb);a.b("memoization.unmemoize",a.N.Bc);a.b("memoization.parseMemoText",a.N.pc);a.b("memoization.unmemoizeDomNodeAndDescendants",a.N.Cc);a.Z=function(){function b(){if(e)for(var b=
|
||
|
e,c=0,m;g<e;)if(m=d[g++]){if(g>b){if(5E3<=++c){g=e;a.a.dc(Error("'Too much recursion' after processing "+c+" task groups."));break}b=e}try{m()}catch(k){a.a.dc(k)}}}function c(){b();g=e=d.length=0}var d=[],e=0,f=1,g=0;return{scheduler:x.MutationObserver?function(a){var b=t.createElement("div");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle("foo")}}(c):t&&"onreadystatechange"in t.createElement("script")?function(a){var b=t.createElement("script");b.onreadystatechange=
|
||
|
function(){b.onreadystatechange=null;t.documentElement.removeChild(b);b=null;a()};t.documentElement.appendChild(b)}:function(a){setTimeout(a,0)},Za:function(b){e||a.Z.scheduler(c);d[e++]=b;return f++},cancel:function(a){a-=f-e;a>=g&&a<e&&(d[a]=null)},resetForTesting:function(){var a=e-g;g=e=d.length=0;return a},rd:b}}();a.b("tasks",a.Z);a.b("tasks.schedule",a.Z.Za);a.b("tasks.runEarly",a.Z.rd);a.Aa={throttle:function(b,c){b.throttleEvaluation=c;var d=null;return a.B({read:b,write:function(e){clearTimeout(d);
|
||
|
d=a.a.setTimeout(function(){b(e)},c)}})},rateLimit:function(a,c){var d,e,f;"number"==typeof c?d=c:(d=c.timeout,e=c.method);a.gb=!1;f="notifyWhenChangesStop"==e?T:S;a.Wa(function(a){return f(a,d)})},deferred:function(b,c){if(!0!==c)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");b.gb||(b.gb=!0,b.Wa(function(c){var e,f=!1;return function(){if(!f){a.Z.cancel(e);e=a.Z.Za(c);try{f=!0,b.notifySubscribers(n,"dirty")}finally{f=
|
||
|
!1}}}}))},notify:function(a,c){a.equalityComparer="always"==c?null:J}};var R={undefined:1,"boolean":1,number:1,string:1};a.b("extenders",a.Aa);a.zc=function(b,c,d){this.$=b;this.jb=c;this.Pc=d;this.T=!1;a.H(this,"dispose",this.k)};a.zc.prototype.k=function(){this.T=!0;this.Pc()};a.K=function(){a.a.ab(this,D);D.ub(this)};var E="change",D={ub:function(a){a.F={change:[]};a.Qb=1},Y:function(b,c,d){var e=this;d=d||E;var f=new a.zc(e,c?b.bind(c):b,function(){a.a.Na(e.F[d],f);e.Ka&&e.Ka(d)});e.ua&&e.ua(d);
|
||
|
e.F[d]||(e.F[d]=[]);e.F[d].push(f);return f},notifySubscribers:function(b,c){c=c||E;c===E&&this.Kb();if(this.Ra(c)){var d=c===E&&this.Fc||this.F[c].slice(0);try{a.l.Xb();for(var e=0,f;f=d[e];++e)f.T||f.jb(b)}finally{a.l.end()}}},Pa:function(){return this.Qb},Zc:function(a){return this.Pa()!==a},Kb:function(){++this.Qb},Wa:function(b){var c=this,d=a.I(c),e,f,g,h;c.Ja||(c.Ja=c.notifySubscribers,c.notifySubscribers=U);var l=b(function(){c.Ha=!1;d&&h===c&&(h=c.Mb?c.Mb():c());var a=f||c.Ua(g,h);f=e=!1;
|
||
|
a&&c.Ja(g=h)});c.Pb=function(a){c.Fc=c.F[E].slice(0);c.Ha=e=!0;h=a;l()};c.Ob=function(a){e||(g=a,c.Ja(a,"beforeChange"))};c.Hc=function(){c.Ua(g,c.p(!0))&&(f=!0)}},Ra:function(a){return this.F[a]&&this.F[a].length},Xc:function(b){if(b)return this.F[b]&&this.F[b].length||0;var c=0;a.a.D(this.F,function(a,b){"dirty"!==a&&(c+=b.length)});return c},Ua:function(a,c){return!this.equalityComparer||!this.equalityComparer(a,c)},extend:function(b){var c=this;b&&a.a.D(b,function(b,e){var f=a.Aa[b];"function"==
|
||
|
typeof f&&(c=f(c,e)||c)});return c}};a.H(D,"subscribe",D.Y);a.H(D,"extend",D.extend);a.H(D,"getSubscriptionsCount",D.Xc);a.a.la&&a.a.$a(D,Function.prototype);a.K.fn=D;a.lc=function(a){return null!=a&&"function"==typeof a.Y&&"function"==typeof a.notifySubscribers};a.b("subscribable",a.K);a.b("isSubscribable",a.lc);a.xa=a.l=function(){function b(a){d.push(e);e=a}function c(){e=d.pop()}var d=[],e,f=0;return{Xb:b,end:c,sc:function(b){if(e){if(!a.lc(b))throw Error("Only subscribable things can act as dependencies");
|
||
|
e.jb.call(e.Lc,b,b.Gc||(b.Gc=++f))}},w:function(a,d,e){try{return b(),a.apply(d,e||[])}finally{c()}},Ca:function(){if(e)return e.m.Ca()},Va:function(){if(e)return e.Va}}}();a.b("computedContext",a.xa);a.b("computedContext.getDependenciesCount",a.xa.Ca);a.b("computedContext.isInitial",a.xa.Va);a.b("ignoreDependencies",a.wd=a.l.w);var F=a.a.bc("_latestValue");a.O=function(b){function c(){if(0<arguments.length)return c.Ua(c[F],arguments[0])&&(c.ia(),c[F]=arguments[0],c.ha()),this;a.l.sc(c);return c[F]}
|
||
|
c[F]=b;a.a.la||a.a.extend(c,a.K.fn);a.K.fn.ub(c);a.a.ab(c,B);a.options.deferUpdates&&a.Aa.deferred(c,!0);return c};var B={equalityComparer:J,p:function(){return this[F]},ha:function(){this.notifySubscribers(this[F])},ia:function(){this.notifySubscribers(this[F],"beforeChange")}};a.a.la&&a.a.$a(B,a.K.fn);var I=a.O.md="__ko_proto__";B[I]=a.O;a.Qa=function(b,c){return null===b||b===n||b[I]===n?!1:b[I]===c?!0:a.Qa(b[I],c)};a.I=function(b){return a.Qa(b,a.O)};a.Da=function(b){return"function"==typeof b&&
|
||
|
b[I]===a.O||"function"==typeof b&&b[I]===a.B&&b.$c?!0:!1};a.b("observable",a.O);a.b("isObservable",a.I);a.b("isWriteableObservable",a.Da);a.b("isWritableObservable",a.Da);a.b("observable.fn",B);a.H(B,"peek",B.p);a.H(B,"valueHasMutated",B.ha);a.H(B,"valueWillMutate",B.ia);a.ma=function(b){b=b||[];if("object"!=typeof b||!("length"in b))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");b=a.O(b);a.a.ab(b,a.ma.fn);return b.extend({trackArrayChanges:!0})};
|
||
|
a.ma.fn={remove:function(b){for(var c=this.p(),d=[],e="function"!=typeof b||a.I(b)?function(a){return a===b}:b,f=0;f<c.length;f++){var g=c[f];e(g)&&(0===d.length&&this.ia(),d.push(g),c.splice(f,1),f--)}d.length&&this.ha();return d},removeAll:function(b){if(b===n){var c=this.p(),d=c.slice(0);this.ia();c.splice(0,c.length);this.ha();return d}return b?this.remove(function(c){return 0<=a.a.o(b,c)}):[]},destroy:function(b){var c=this.p(),d="function"!=typeof b||a.I(b)?function(a){return a===b}:b;this.ia();
|
||
|
for(var e=c.length-1;0<=e;e--)d(c[e])&&(c[e]._destroy=!0);this.ha()},destroyAll:function(b){return b===n?this.destroy(function(){return!0}):b?this.destroy(function(c){return 0<=a.a.o(b,c)}):[]},indexOf:function(b){var c=this();return a.a.o(c,b)},replace:function(a,c){var d=this.indexOf(a);0<=d&&(this.ia(),this.p()[d]=c,this.ha())}};a.a.la&&a.a.$a(a.ma.fn,a.O.fn);a.a.r("pop push reverse shift sort splice unshift".split(" "),function(b){a.ma.fn[b]=function(){var a=this.p();this.ia();this.Yb(a,b,arguments);
|
||
|
var d=a[b].apply(a,arguments);this.ha();return d===a?this:d}});a.a.r(["slice"],function(b){a.ma.fn[b]=function(){var a=this();return a[b].apply(a,arguments)}});a.b("observableArray",a.ma);a.Aa.trackArrayChanges=function(b,c){function d(){if(!e){e=!0;l=b.notifySubscribers;b.notifySubscribers=function(a,b){b&&b!==E||++h;return l.apply(this,arguments)};var c=[].concat(b.p()||[]);f=null;g=b.Y(function(d){d=[].concat(d||[]);if(b.Ra("arrayChange")){var e;if(!f||1<h)f=a.a.lb(c,d,b.kb);e=f}c=d;f=null;h=0;
|
||
|
e&&e.length&&b.notifySubscribers(e,"arrayChange")})}}b.kb={};c&&"object"==typeof c&&a.a.extend(b.kb,c);b.kb.sparse=!0;if(!b.Yb){var e=!1,f=null,g,h=0,l,m=b.ua,k=b.Ka;b.ua=function(a){m&&m.call(b,a);"arrayChange"===a&&d()};b.Ka=function(a){k&&k.call(b,a);"arrayChange"!==a||b.Ra("arrayChange")||(l&&(b.notifySubscribers=l,l=n),g.k(),e=!1)};b.Yb=function(b,c,d){function k(a,b,c){return m[m.length]={status:a,value:b,index:c}}if(e&&!h){var m=[],l=b.length,g=d.length,G=0;switch(c){case "push":G=l;case "unshift":for(c=
|
||
|
0;c<g;c++)k("added",d[c],G+c);break;case "pop":G=l-1;case "shift":l&&k("deleted",b[G],G);break;case "splice":c=Math.min(Math.max(0,0>d[0]?l+d[0]:d[0]),l);for(var l=1===g?l:Math.min(c+(d[1]||0),l),g=c+g-2,G=Math.max(l,g),n=[],s=[],w=2;c<G;++c,++w)c<l&&s.push(k("deleted",b[c],c)),c<g&&n.push(k("added",d[w],c));a.a.hc(s,n);break;default:return}f=m}}}};var s=a.a.bc("_state");a.m=a.B=function(b,c,d){function e(){if(0<arguments.length){if("function"===typeof f)f.apply(g.sb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");
|
||
|
return this}a.l.sc(e);(g.V||g.t&&e.Sa())&&e.U();return g.M}"object"===typeof b?d=b:(d=d||{},b&&(d.read=b));if("function"!=typeof d.read)throw Error("Pass a function that returns the value of the ko.computed");var f=d.write,g={M:n,da:!0,V:!0,Ta:!1,Hb:!1,T:!1,Ya:!1,t:!1,od:d.read,sb:c||d.owner,i:d.disposeWhenNodeIsRemoved||d.i||null,ya:d.disposeWhen||d.ya,pb:null,s:{},L:0,fc:null};e[s]=g;e.$c="function"===typeof f;a.a.la||a.a.extend(e,a.K.fn);a.K.fn.ub(e);a.a.ab(e,z);d.pure?(g.Ya=!0,g.t=!0,a.a.extend(e,
|
||
|
Y)):d.deferEvaluation&&a.a.extend(e,Z);a.options.deferUpdates&&a.Aa.deferred(e,!0);g.i&&(g.Hb=!0,g.i.nodeType||(g.i=null));g.t||d.deferEvaluation||e.U();g.i&&e.ca()&&a.a.G.qa(g.i,g.pb=function(){e.k()});return e};var z={equalityComparer:J,Ca:function(){return this[s].L},Sb:function(a,c,d){if(this[s].Ya&&c===this)throw Error("A 'pure' computed must not be called recursively");this[s].s[a]=d;d.Ia=this[s].L++;d.pa=c.Pa()},Sa:function(){var a,c,d=this[s].s;for(a in d)if(d.hasOwnProperty(a)&&(c=d[a],this.oa&&
|
||
|
c.$.Ha||c.$.Zc(c.pa)))return!0},gd:function(){this.oa&&!this[s].Ta&&this.oa(!1)},ca:function(){var a=this[s];return a.V||0<a.L},qd:function(){this.Ha?this[s].V&&(this[s].da=!0):this.ec()},yc:function(a){if(a.gb&&!this[s].i){var c=a.Y(this.gd,this,"dirty"),d=a.Y(this.qd,this);return{$:a,k:function(){c.k();d.k()}}}return a.Y(this.ec,this)},ec:function(){var b=this,c=b.throttleEvaluation;c&&0<=c?(clearTimeout(this[s].fc),this[s].fc=a.a.setTimeout(function(){b.U(!0)},c)):b.oa?b.oa(!0):b.U(!0)},U:function(b){var c=
|
||
|
this[s],d=c.ya,e=!1;if(!c.Ta&&!c.T){if(c.i&&!a.a.qb(c.i)||d&&d()){if(!c.Hb){this.k();return}}else c.Hb=!1;c.Ta=!0;try{e=this.Vc(b)}finally{c.Ta=!1}c.L||this.k();return e}},Vc:function(b){var c=this[s],d=!1,e=c.Ya?n:!c.L,f={Mc:this,Oa:c.s,ob:c.L};a.l.Xb({Lc:f,jb:W,m:this,Va:e});c.s={};c.L=0;f=this.Uc(c,f);this.Ua(c.M,f)&&(c.t||this.notifySubscribers(c.M,"beforeChange"),c.M=f,c.t?this.Kb():b&&this.notifySubscribers(c.M),d=!0);e&&this.notifySubscribers(c.M,"awake");return d},Uc:function(b,c){try{var d=
|
||
|
b.od;return b.sb?d.call(b.sb):d()}finally{a.l.end(),c.ob&&!b.t&&a.a.D(c.Oa,V),b.da=b.V=!1}},p:function(a){var c=this[s];(c.V&&(a||!c.L)||c.t&&this.Sa())&&this.U();return c.M},Wa:function(b){a.K.fn.Wa.call(this,b);this.Mb=function(){this[s].da?this.U():this[s].V=!1;return this[s].M};this.oa=function(a){this.Ob(this[s].M);this[s].V=!0;a&&(this[s].da=!0);this.Pb(this)}},k:function(){var b=this[s];!b.t&&b.s&&a.a.D(b.s,function(a,b){b.k&&b.k()});b.i&&b.pb&&a.a.G.tc(b.i,b.pb);b.s=null;b.L=0;b.T=!0;b.da=
|
||
|
!1;b.V=!1;b.t=!1;b.i=null}},Y={ua:function(b){var c=this,d=c[s];if(!d.T&&d.t&&"change"==b){d.t=!1;if(d.da||c.Sa())d.s=null,d.L=0,c.U()&&c.Kb();else{var e=[];a.a.D(d.s,function(a,b){e[b.Ia]=a});a.a.r(e,function(a,b){var e=d.s[a],l=c.yc(e.$);l.Ia=b;l.pa=e.pa;d.s[a]=l})}d.T||c.notifySubscribers(d.M,"awake")}},Ka:function(b){var c=this[s];c.T||"change"!=b||this.Ra("change")||(a.a.D(c.s,function(a,b){b.k&&(c.s[a]={$:b.$,Ia:b.Ia,pa:b.pa},b.k())}),c.t=!0,this.notifySubscribers(n,"asleep"))},Pa:function(){var b=
|
||
|
this[s];b.t&&(b.da||this.Sa())&&this.U();return a.K.fn.Pa.call(this)}},Z={ua:function(a){"change"!=a&&"beforeChange"!=a||this.p()}};a.a.la&&a.a.$a(z,a.K.fn);var P=a.O.md;a.m[P]=a.O;z[P]=a.m;a.bd=function(b){return a.Qa(b,a.m)};a.cd=function(b){return a.Qa(b,a.m)&&b[s]&&b[s].Ya};a.b("computed",a.m);a.b("dependentObservable",a.m);a.b("isComputed",a.bd);a.b("isPureComputed",a.cd);a.b("computed.fn",z);a.H(z,"peek",z.p);a.H(z,"dispose",z.k);a.H(z,"isActive",z.ca);a.H(z,"getDependenciesCount",z.Ca);a.rc=
|
||
|
function(b,c){if("function"===typeof b)return a.m(b,c,{pure:!0});b=a.a.extend({},b);b.pure=!0;return a.m(b,c)};a.b("pureComputed",a.rc);(function(){function b(a,f,g){g=g||new d;a=f(a);if("object"!=typeof a||null===a||a===n||a instanceof RegExp||a instanceof Date||a instanceof String||a instanceof Number||a instanceof Boolean)return a;var h=a instanceof Array?[]:{};g.save(a,h);c(a,function(c){var d=f(a[c]);switch(typeof d){case "boolean":case "number":case "string":case "function":h[c]=d;break;case "object":case "undefined":var k=
|
||
|
g.get(d);h[c]=k!==n?k:b(d,f,g)}});return h}function c(a,b){if(a instanceof Array){for(var c=0;c<a.length;c++)b(c);"function"==typeof a.toJSON&&b("toJSON")}else for(c in a)b(c)}function d(){this.keys=[];this.Lb=[]}a.Ac=function(c){if(0==arguments.length)throw Error("When calling ko.toJS, pass the object you want to convert.");return b(c,function(b){for(var c=0;a.I(b)&&10>c;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.Ac(b);return a.a.Gb(b,c,d)};d.prototype={save:function(b,c){var d=a.a.o(this.keys,
|
||
|
b);0<=d?this.Lb[d]=c:(this.keys.push(b),this.Lb.push(c))},get:function(b){b=a.a.o(this.keys,b);return 0<=b?this.Lb[b]:n}}})();a.b("toJS",a.Ac);a.b("toJSON",a.toJSON);(function(){a.j={u:function(b){switch(a.a.A(b)){case "option":return!0===b.__ko__hasDomDataOptionValue__?a.a.e.get(b,a.d.options.zb):7>=a.a.C?b.getAttributeNode("value")&&b.getAttributeNode("value").specified?b.value:b.text:b.value;case "select":return 0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex]):n;default:return b.value}},ja:function(b,
|
||
|
c,d){switch(a.a.A(b)){case "option":switch(typeof c){case "string":a.a.e.set(b,a.d.options.zb,n);"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__;b.value=c;break;default:a.a.e.set(b,a.d.options.zb,c),b.__ko__hasDomDataOptionValue__=!0,b.value="number"===typeof c?c:""}break;case "select":if(""===c||null===c)c=n;for(var e=-1,f=0,g=b.options.length,h;f<g;++f)if(h=a.j.u(b.options[f]),h==c||""==h&&c===n){e=f;break}if(d||0<=e||c===n&&1<b.size)b.selectedIndex=e;break;default:if(null===
|
||
|
c||c===n)c="";b.value=c}}}})();a.b("selectExtensions",a.j);a.b("selectExtensions.readValue",a.j.u);a.b("selectExtensions.writeValue",a.j.ja);a.h=function(){function b(b){b=a.a.cb(b);123===b.charCodeAt(0)&&(b=b.slice(1,-1));var c=[],d=b.match(e),r,h=[],p=0;if(d){d.push(",");for(var A=0,y;y=d[A];++A){var v=y.charCodeAt(0);if(44===v){if(0>=p){c.push(r&&h.length?{key:r,value:h.join("")}:{unknown:r||h.join("")});r=p=0;h=[];continue}}else if(58===v){if(!p&&!r&&1===h.length){r=h.pop();continue}}else 47===
|
||
|
v&&A&&1<y.length?(v=d[A-1].match(f))&&!g[v[0]]&&(b=b.substr(b.indexOf(y)+1),d=b.match(e),d.push(","),A=-1,y="/"):40===v||123===v||91===v?++p:41===v||125===v||93===v?--p:r||h.length||34!==v&&39!==v||(y=y.slice(1,-1));h.push(y)}}return c}var c=["true","false","null","undefined"],d=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,e=RegExp("\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|/(?:[^/\\\\]|\\\\.)*/w*|[^\\s:,/][^,\"'{}()/:[\\]]*[^\\s,\"'{}()/:[\\]]|[^\\s]","g"),f=/[\])"'A-Za-z0-9_$]+$/,
|
||
|
g={"in":1,"return":1,"typeof":1},h={};return{va:[],ga:h,Ab:b,Xa:function(e,m){function k(b,e){var m;if(!A){var l=a.getBindingHandler(b);if(l&&l.preprocess&&!(e=l.preprocess(e,b,k)))return;if(l=h[b])m=e,0<=a.a.o(c,m)?m=!1:(l=m.match(d),m=null===l?!1:l[1]?"Object("+l[1]+")"+l[2]:m),l=m;l&&g.push("'"+b+"':function(_z){"+m+"=_z}")}p&&(e="function(){return "+e+" }");f.push("'"+b+"':"+e)}m=m||{};var f=[],g=[],p=m.valueAccessors,A=m.bindingParams,y="string"===typeof e?b(e):e;a.a.r(y,function(a){k(a.key||
|
||
|
a.unknown,a.value)});g.length&&k("_ko_property_writers","{"+g.join(",")+" }");return f.join(",")},fd:function(a,b){for(var c=0;c<a.length;c++)if(a[c].key==b)return!0;return!1},Ga:function(b,c,d,e,f){if(b&&a.I(b))!a.Da(b)||f&&b.p()===e||b(e);else if((b=c.get("_ko_property_writers"))&&b[d])b[d](e)}}}();a.b("expressionRewriting",a.h);a.b("expressionRewriting.bindingRewriteValidators",a.h.va);a.b("expressionRewriting.parseObjectLiteral",a.h.Ab);a.b("expressionRewriting.preProcessBindings",a.h.Xa);a.b("expressionRewriting._twoWayBindings",
|
||
|
a.h.ga);a.b("jsonExpressionRewriting",a.h);a.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",a.h.Xa);(function(){function b(a){return 8==a.nodeType&&g.test(f?a.text:a.nodeValue)}function c(a){return 8==a.nodeType&&h.test(f?a.text:a.nodeValue)}function d(a,d){for(var e=a,f=1,l=[];e=e.nextSibling;){if(c(e)&&(f--,0===f))return l;l.push(e);b(e)&&f++}if(!d)throw Error("Cannot find closing comment tag to match: "+a.nodeValue);return null}function e(a,b){var c=d(a,b);return c?0<c.length?c[c.length-
|
||
|
1].nextSibling:a.nextSibling:null}var f=t&&"\x3c!--test--\x3e"===t.createComment("test").text,g=f?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,h=f?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,l={ul:!0,ol:!0};a.f={aa:{},childNodes:function(a){return b(a)?d(a):a.childNodes},za:function(c){if(b(c)){c=a.f.childNodes(c);for(var d=0,e=c.length;d<e;d++)a.removeNode(c[d])}else a.a.rb(c)},fa:function(c,d){if(b(c)){a.f.za(c);for(var e=c.nextSibling,f=0,l=d.length;f<l;f++)e.parentNode.insertBefore(d[f],
|
||
|
e)}else a.a.fa(c,d)},qc:function(a,c){b(a)?a.parentNode.insertBefore(c,a.nextSibling):a.firstChild?a.insertBefore(c,a.firstChild):a.appendChild(c)},kc:function(c,d,e){e?b(c)?c.parentNode.insertBefore(d,e.nextSibling):e.nextSibling?c.insertBefore(d,e.nextSibling):c.appendChild(d):a.f.qc(c,d)},firstChild:function(a){return b(a)?!a.nextSibling||c(a.nextSibling)?null:a.nextSibling:a.firstChild},nextSibling:function(a){b(a)&&(a=e(a));return a.nextSibling&&c(a.nextSibling)?null:a.nextSibling},Yc:b,vd:function(a){return(a=
|
||
|
(f?a.text:a.nodeValue).match(g))?a[1]:null},oc:function(d){if(l[a.a.A(d)]){var k=d.firstChild;if(k){do if(1===k.nodeType){var f;f=k.firstChild;var g=null;if(f){do if(g)g.push(f);else if(b(f)){var h=e(f,!0);h?f=h:g=[f]}else c(f)&&(g=[f]);while(f=f.nextSibling)}if(f=g)for(g=k.nextSibling,h=0;h<f.length;h++)g?d.insertBefore(f[h],g):d.appendChild(f[h])}while(k=k.nextSibling)}}}}})();a.b("virtualElements",a.f);a.b("virtualElements.allowedBindings",a.f.aa);a.b("virtualElements.emptyNode",a.f.za);a.b("virtualElements.insertAfter",
|
||
|
a.f.kc);a.b("virtualElements.prepend",a.f.qc);a.b("virtualElements.setDomNodeChildren",a.f.fa);(function(){a.S=function(){this.Kc={}};a.a.extend(a.S.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return null!=b.getAttribute("data-bind")||a.g.getComponentNameForNode(b);case 8:return a.f.Yc(b);default:return!1}},getBindings:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b):null;return a.g.Rb(d,b,c,!1)},getBindingAccessors:function(b,c){var d=this.getBindingsString(b,
|
||
|
c),d=d?this.parseBindingsString(d,c,b,{valueAccessors:!0}):null;return a.g.Rb(d,b,c,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind");case 8:return a.f.vd(b);default:return null}},parseBindingsString:function(b,c,d,e){try{var f=this.Kc,g=b+(e&&e.valueAccessors||""),h;if(!(h=f[g])){var l,m="with($context){with($data||{}){return{"+a.h.Xa(b,e)+"}}}";l=new Function("$context","$element",m);h=f[g]=l}return h(c,d)}catch(k){throw k.message="Unable to parse bindings.\nBindings value: "+
|
||
|
b+"\nMessage: "+k.message,k;}}});a.S.instance=new a.S})();a.b("bindingProvider",a.S);(function(){function b(a){return function(){return a}}function c(a){return a()}function d(b){return a.a.Ea(a.l.w(b),function(a,c){return function(){return b()[c]}})}function e(c,e,k){return"function"===typeof c?d(c.bind(null,e,k)):a.a.Ea(c,b)}function f(a,b){return d(this.getBindings.bind(this,a,b))}function g(b,c,d){var e,k=a.f.firstChild(c),f=a.S.instance,m=f.preprocessNode;if(m){for(;e=k;)k=a.f.nextSibling(e),
|
||
|
m.call(f,e);k=a.f.firstChild(c)}for(;e=k;)k=a.f.nextSibling(e),h(b,e,d)}function h(b,c,d){var e=!0,k=1===c.nodeType;k&&a.f.oc(c);if(k&&d||a.S.instance.nodeHasBindings(c))e=m(c,null,b,d).shouldBindDescendants;e&&!r[a.a.A(c)]&&g(b,c,!k)}function l(b){var c=[],d={},e=[];a.a.D(b,function X(k){if(!d[k]){var f=a.getBindingHandler(k);f&&(f.after&&(e.push(k),a.a.r(f.after,function(c){if(b[c]){if(-1!==a.a.o(e,c))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+e.join(", "));
|
||
|
X(c)}}),e.length--),c.push({key:k,jc:f}));d[k]=!0}});return c}function m(b,d,e,k){var m=a.a.e.get(b,q);if(!d){if(m)throw Error("You cannot apply bindings multiple times to the same element.");a.a.e.set(b,q,!0)}!m&&k&&a.xc(b,e);var g;if(d&&"function"!==typeof d)g=d;else{var h=a.S.instance,r=h.getBindingAccessors||f,p=a.B(function(){(g=d?d(e,b):r.call(h,b,e))&&e.Q&&e.Q();return g},null,{i:b});g&&p.ca()||(p=null)}var s;if(g){var t=p?function(a){return function(){return c(p()[a])}}:function(a){return g[a]},
|
||
|
u=function(){return a.a.Ea(p?p():g,c)};u.get=function(a){return g[a]&&c(t(a))};u.has=function(a){return a in g};k=l(g);a.a.r(k,function(c){var d=c.jc.init,k=c.jc.update,f=c.key;if(8===b.nodeType&&!a.f.aa[f])throw Error("The binding '"+f+"' cannot be used with virtual elements");try{"function"==typeof d&&a.l.w(function(){var a=d(b,t(f),u,e.$data,e);if(a&&a.controlsDescendantBindings){if(s!==n)throw Error("Multiple bindings ("+s+" and "+f+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");
|
||
|
s=f}}),"function"==typeof k&&a.B(function(){k(b,t(f),u,e.$data,e)},null,{i:b})}catch(m){throw m.message='Unable to process binding "'+f+": "+g[f]+'"\nMessage: '+m.message,m;}})}return{shouldBindDescendants:s===n}}function k(b){return b&&b instanceof a.R?b:new a.R(b)}a.d={};var r={script:!0,textarea:!0,template:!0};a.getBindingHandler=function(b){return a.d[b]};a.R=function(b,c,d,e,k){function f(){var k=g?b():b,m=a.a.c(k);c?(c.Q&&c.Q(),a.a.extend(l,c),l.Q=r):(l.$parents=[],l.$root=m,l.ko=a);l.$rawData=
|
||
|
k;l.$data=m;d&&(l[d]=m);e&&e(l,c,m);return l.$data}function m(){return h&&!a.a.Tb(h)}var l=this,g="function"==typeof b&&!a.I(b),h,r;k&&k.exportDependencies?f():(r=a.B(f,null,{ya:m,i:!0}),r.ca()&&(l.Q=r,r.equalityComparer=null,h=[],r.Dc=function(b){h.push(b);a.a.G.qa(b,function(b){a.a.Na(h,b);h.length||(r.k(),l.Q=r=n)})}))};a.R.prototype.createChildContext=function(b,c,d,e){return new a.R(b,this,c,function(a,b){a.$parentContext=b;a.$parent=b.$data;a.$parents=(b.$parents||[]).slice(0);a.$parents.unshift(a.$parent);
|
||
|
d&&d(a)},e)};a.R.prototype.extend=function(b){return new a.R(this.Q||this.$data,this,null,function(c,d){c.$rawData=d.$rawData;a.a.extend(c,"function"==typeof b?b():b)})};a.R.prototype.ac=function(a,b){return this.createChildContext(a,b,null,{exportDependencies:!0})};var q=a.a.e.J(),p=a.a.e.J();a.xc=function(b,c){if(2==arguments.length)a.a.e.set(b,p,c),c.Q&&c.Q.Dc(b);else return a.a.e.get(b,p)};a.La=function(b,c,d){1===b.nodeType&&a.f.oc(b);return m(b,c,k(d),!0)};a.Ic=function(b,c,d){d=k(d);return a.La(b,
|
||
|
e(c,d,b),d)};a.hb=function(a,b){1!==b.nodeType&&8!==b.nodeType||g(k(a),b,!0)};a.Ub=function(a,b){!u&&x.jQuery&&(u=x.jQuery);if(b&&1!==b.nodeType&&8!==b.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");b=b||x.document.body;h(k(a),b,!0)};a.nb=function(b){switch(b.nodeType){case 1:case 8:var c=a.xc(b);if(c)return c;if(b.parentNode)return a.nb(b.parentNode)}return n};a.Oc=function(b){return(b=a.nb(b))?b.$data:n};a.b("bindingHandlers",
|
||
|
a.d);a.b("applyBindings",a.Ub);a.b("applyBindingsToDescendants",a.hb);a.b("applyBindingAccessorsToNode",a.La);a.b("applyBindingsToNode",a.Ic);a.b("contextFor",a.nb);a.b("dataFor",a.Oc)})();(function(b){function c(c,e){var m=f.hasOwnProperty(c)?f[c]:b,k;m?m.Y(e):(m=f[c]=new a.K,m.Y(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,dd:e};delete f[c];k||e?m.notifySubscribers(b):a.Z.Za(function(){m.notifySubscribers(b)})}),k=!0)}function d(a,b){e("getConfig",[a],function(c){c?e("loadComponent",
|
||
|
[a,c],function(a){b(a,c)}):b(null,null)})}function e(c,d,f,k){k||(k=a.g.loaders.slice(0));var g=k.shift();if(g){var q=g[c];if(q){var p=!1;if(q.apply(g,d.concat(function(a){p?f(null):null!==a?f(a):e(c,d,f,k)}))!==b&&(p=!0,!g.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.");}else e(c,d,f,k)}else f(null)}var f={},g={};a.g={get:function(d,e){var f=g.hasOwnProperty(d)?g[d]:b;f?f.dd?a.l.w(function(){e(f.definition)}):
|
||
|
a.Z.Za(function(){e(f.definition)}):c(d,e)},$b:function(a){delete g[a]},Nb:e};a.g.loaders=[];a.b("components",a.g);a.b("components.get",a.g.get);a.b("components.clearCachedDefinition",a.g.$b)})();(function(){function b(b,c,d,e){function g(){0===--y&&e(h)}var h={},y=2,v=d.template;d=d.viewModel;v?f(c,v,function(c){a.g.Nb("loadTemplate",[b,c],function(a){h.template=a;g()})}):g();d?f(c,d,function(c){a.g.Nb("loadViewModel",[b,c],function(a){h[l]=a;g()})}):g()}function c(a,b,d){if("function"===typeof b)d(function(a){return new b(a)});
|
||
|
else if("function"===typeof b[l])d(b[l]);else if("instance"in b){var e=b.instance;d(function(){return e})}else"viewModel"in b?c(a,b.viewModel,d):a("Unknown viewModel value: "+b)}function d(b){switch(a.a.A(b)){case "script":return a.a.na(b.text);case "textarea":return a.a.na(b.value);case "template":if(e(b.content))return a.a.wa(b.content.childNodes)}return a.a.wa(b.childNodes)}function e(a){return x.DocumentFragment?a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){"string"===typeof b.require?
|
||
|
O||x.require?(O||x.require)([b.require],c):a("Uses require, but no AMD loader is present"):c(b)}function g(a){return function(b){throw Error("Component '"+a+"': "+b);}}var h={};a.g.register=function(b,c){if(!c)throw Error("Invalid configuration for "+b);if(a.g.wb(b))throw Error("Component "+b+" is already registered");h[b]=c};a.g.wb=function(a){return h.hasOwnProperty(a)};a.g.ud=function(b){delete h[b];a.g.$b(b)};a.g.cc={getConfig:function(a,b){b(h.hasOwnProperty(a)?h[a]:null)},loadComponent:function(a,
|
||
|
c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if("string"===typeof c)f(a.a.na(c));else if(c instanceof Array)f(c);else if(e(c))f(a.a.W(c.childNodes));else if(c.element)if(c=c.element,x.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if("string"===typeof c){var l=t.getElementById(c);l?f(d(l)):b("Cannot find element with ID "+c)}else b("Unknown element type: "+c);else b("Unknown template value: "+c)},loadViewModel:function(a,b,d){c(g(a),
|
||
|
b,d)}};var l="createViewModel";a.b("components.register",a.g.register);a.b("components.isRegistered",a.g.wb);a.b("components.unregister",a.g.ud);a.b("components.defaultLoader",a.g.cc);a.g.loaders.push(a.g.cc);a.g.Ec=h})();(function(){function b(b,e){var f=b.getAttribute("params");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ea(f,function(c){return a.m(c,null,{i:b})}),g=a.a.Ea(f,function(c){var e=c.p();return c.ca()?a.m({read:function(){return a.a.c(c())},write:a.Da(e)&&
|
||
|
function(a){c()(a)},i:b}):e});g.hasOwnProperty("$raw")||(g.$raw=f);return g}return{$raw:{}}}a.g.getComponentNameForNode=function(b){var c=a.a.A(b);if(a.g.wb(c)&&(-1!=c.indexOf("-")||"[object HTMLUnknownElement]"==""+b||8>=a.a.C&&b.tagName===c))return c};a.g.Rb=function(c,e,f,g){if(1===e.nodeType){var h=a.g.getComponentNameForNode(e);if(h){c=c||{};if(c.component)throw Error('Cannot use the "component" binding on a custom element matching a component');var l={name:h,params:b(e,f)};c.component=g?function(){return l}:
|
||
|
l}}return c};var c=new a.S;9>a.a.C&&(a.g.register=function(a){return function(b){t.createElement(b);return a.apply(this,arguments)}}(a.g.register),t.createDocumentFragment=function(b){return function(){var c=b(),f=a.g.Ec,g;for(g in f)f.hasOwnProperty(g)&&c.createElement(g);return c}}(t.createDocumentFragment))})();(function(b){function c(b,c,d){c=c.template;if(!c)throw Error("Component '"+b+"' has no template");b=a.a.wa(c);a.f.fa(d,b)}function d(a,b,c,d){var e=a.createViewModel;return e?e.call(a,
|
||
|
d,{element:b,templateNodes:c}):d}var e=0;a.d.component={init:function(f,g,h,l,m){function k(){var a=r&&r.dispose;"function"===typeof a&&a.call(r);q=r=null}var r,q,p=a.a.W(a.f.childNodes(f));a.a.G.qa(f,k);a.m(function(){var l=a.a.c(g()),h,v;"string"===typeof l?h=l:(h=a.a.c(l.name),v=a.a.c(l.params));if(!h)throw Error("No component name specified");var n=q=++e;a.g.get(h,function(e){if(q===n){k();if(!e)throw Error("Unknown component '"+h+"'");c(h,e,f);var l=d(e,f,p,v);e=m.createChildContext(l,b,function(a){a.$component=
|
||
|
l;a.$componentTemplateNodes=p});r=l;a.hb(e,f)}})},null,{i:f});return{controlsDescendantBindings:!0}}};a.f.aa.component=!0})();var Q={"class":"className","for":"htmlFor"};a.d.attr={update:function(b,c){var d=a.a.c(c())||{};a.a.D(d,function(c,d){d=a.a.c(d);var g=!1===d||null===d||d===n;g&&b.removeAttribute(c);8>=a.a.C&&c in Q?(c=Q[c],g?b.removeAttribute(c):b[c]=d):g||b.setAttribute(c,d.toString());"name"===c&&a.a.vc(b,g?"":d.toString())})}};(function(){a.d.checked={after:["value","attr"],init:function(b,
|
||
|
c,d){function e(){var e=b.checked,f=p?g():e;if(!a.xa.Va()&&(!l||e)){var h=a.l.w(c);if(k){var m=r?h.p():h;q!==f?(e&&(a.a.ra(m,f,!0),a.a.ra(m,q,!1)),q=f):a.a.ra(m,f,e);r&&a.Da(h)&&h(m)}else a.h.Ga(h,d,"checked",f,!0)}}function f(){var d=a.a.c(c());b.checked=k?0<=a.a.o(d,g()):h?d:g()===d}var g=a.rc(function(){return d.has("checkedValue")?a.a.c(d.get("checkedValue")):d.has("value")?a.a.c(d.get("value")):b.value}),h="checkbox"==b.type,l="radio"==b.type;if(h||l){var m=c(),k=h&&a.a.c(m)instanceof Array,
|
||
|
r=!(k&&m.push&&m.splice),q=k?g():n,p=l||k;l&&!b.name&&a.d.uniqueName.init(b,function(){return!0});a.m(e,null,{i:b});a.a.q(b,"click",e);a.m(f,null,{i:b});m=n}}};a.h.ga.checked=!0;a.d.checkedValue={update:function(b,c){b.value=a.a.c(c())}}})();a.d.css={update:function(b,c){var d=a.a.c(c());null!==d&&"object"==typeof d?a.a.D(d,function(c,d){d=a.a.c(d);a.a.fb(b,c,d)}):(d=a.a.cb(String(d||"")),a.a.fb(b,b.__ko__cssValue,!1),b.__ko__cssValue=d,a.a.fb(b,d,!0))}};a.d.enable={update:function(b,c){var d=a.a.c(c());
|
||
|
d&&b.disabled?b.removeAttribute("disabled"):d||b.disabled||(b.disabled=!0)}};a.d.disable={update:function(b,c){a.d.enable.update(b,function(){return!a.a.c(c())})}};a.d.event={init:function(b,c,d,e,f){var g=c()||{};a.a.D(g,function(g){"string"==typeof g&&a.a.q(b,g,function(b){var m,k=c()[g];if(k){try{var r=a.a.W(arguments);e=f.$data;r.unshift(e);m=k.apply(e,r)}finally{!0!==m&&(b.preventDefault?b.preventDefault():b.returnValue=!1)}!1===d.get(g+"Bubble")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};
|
||
|
a.d.foreach={mc:function(b){return function(){var c=b(),d=a.a.Bb(c);if(!d||"number"==typeof d.length)return{foreach:c,templateEngine:a.X.vb};a.a.c(c);return{foreach:d.data,as:d.as,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.X.vb}}},init:function(b,c){return a.d.template.init(b,a.d.foreach.mc(c))},update:function(b,c,d,e,f){return a.d.template.update(b,a.d.foreach.mc(c),
|
||
|
d,e,f)}};a.h.va.foreach=!1;a.f.aa.foreach=!0;a.d.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if("activeElement"in f){var g;try{g=f.activeElement}catch(k){g=f.body}e=g===b}f=c();a.h.Ga(f,d,"hasfocus",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.q(b,"focus",f);a.a.q(b,"focusin",f);a.a.q(b,"blur",g);a.a.q(b,"focusout",g)},update:function(b,c){var d=!!a.a.c(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===
|
||
|
d||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.l.w(a.a.Fa,null,[b,d?"focusin":"focusout"]))}};a.h.ga.hasfocus=!0;a.d.hasFocus=a.d.hasfocus;a.h.ga.hasFocus=!0;a.d.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Eb(b,c())}};K("if");K("ifnot",!1,!0);K("with",!0,!1,function(a,c){return a.ac(c)});var L={};a.d.options={init:function(b){if("select"!==a.a.A(b))throw Error("options binding applies only to SELECT elements");for(;0<
|
||
|
b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,c,d){function e(){return a.a.Ma(b.options,function(a){return a.selected})}function f(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c}function g(c,e){if(A&&k)a.j.ja(b,a.a.c(d.get("value")),!0);else if(p.length){var f=0<=a.a.o(p,a.j.u(e[0]));a.a.wc(e[0],f);A&&!f&&a.l.w(a.a.Fa,null,[b,"change"])}}var h=b.multiple,l=0!=b.length&&h?b.scrollTop:null,m=a.a.c(c()),k=d.get("valueAllowUnset")&&d.has("value"),r=
|
||
|
d.get("optionsIncludeDestroyed");c={};var q,p=[];k||(h?p=a.a.ib(e(),a.j.u):0<=b.selectedIndex&&p.push(a.j.u(b.options[b.selectedIndex])));m&&("undefined"==typeof m.length&&(m=[m]),q=a.a.Ma(m,function(b){return r||b===n||null===b||!a.a.c(b._destroy)}),d.has("optionsCaption")&&(m=a.a.c(d.get("optionsCaption")),null!==m&&m!==n&&q.unshift(L)));var A=!1;c.beforeRemove=function(a){b.removeChild(a)};m=g;d.has("optionsAfterRender")&&"function"==typeof d.get("optionsAfterRender")&&(m=function(b,c){g(0,c);
|
||
|
a.l.w(d.get("optionsAfterRender"),null,[c[0],b!==L?b:n])});a.a.Db(b,q,function(c,e,g){g.length&&(p=!k&&g[0].selected?[a.j.u(g[0])]:[],A=!0);e=b.ownerDocument.createElement("option");c===L?(a.a.bb(e,d.get("optionsCaption")),a.j.ja(e,n)):(g=f(c,d.get("optionsValue"),c),a.j.ja(e,a.a.c(g)),c=f(c,d.get("optionsText"),g),a.a.bb(e,c));return[e]},c,m);a.l.w(function(){k?a.j.ja(b,a.a.c(d.get("value")),!0):(h?p.length&&e().length<p.length:p.length&&0<=b.selectedIndex?a.j.u(b.options[b.selectedIndex])!==p[0]:
|
||
|
p.length||0<=b.selectedIndex)&&a.a.Fa(b,"change")});a.a.Sc(b);l&&20<Math.abs(l-b.scrollTop)&&(b.scrollTop=l)}};a.d.options.zb=a.a.e.J();a.d.selectedOptions={after:["options","foreach"],init:function(b,c,d){a.a.q(b,"change",function(){var e=c(),f=[];a.a.r(b.getElementsByTagName("option"),function(b){b.selected&&f.push(a.j.u(b))});a.h.Ga(e,d,"selectedOptions",f)})},update:function(b,c){if("select"!=a.a.A(b))throw Error("values binding applies only to SELECT elements");var d=a.a.c(c()),e=b.scrollTop;
|
||
|
d&&"number"==typeof d.length&&a.a.r(b.getElementsByTagName("option"),function(b){var c=0<=a.a.o(d,a.j.u(b));b.selected!=c&&a.a.wc(b,c)});b.scrollTop=e}};a.h.ga.selectedOptions=!0;a.d.style={update:function(b,c){var d=a.a.c(c()||{});a.a.D(d,function(c,d){d=a.a.c(d);if(null===d||d===n||!1===d)d="";b.style[c]=d})}};a.d.submit={init:function(b,c,d,e,f){if("function"!=typeof c())throw Error("The value for a submit binding must be a function");a.a.q(b,"submit",function(a){var d,e=c();try{d=e.call(f.$data,
|
||
|
b)}finally{!0!==d&&(a.preventDefault?a.preventDefault():a.returnValue=!1)}})}};a.d.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.bb(b,c())}};a.f.aa.text=!0;(function(){if(x&&x.navigator)var b=function(a){if(a)return parseFloat(a[1])},c=x.opera&&x.opera.version&&parseInt(x.opera.version()),d=x.navigator.userAgent,e=b(d.match(/^(?:(?!chrome).)*version\/([^ ]*) safari/i)),f=b(d.match(/Firefox\/([^ ]*)/));if(10>a.a.C)var g=a.a.e.J(),h=a.a.e.J(),l=function(b){var c=
|
||
|
this.activeElement;(c=c&&a.a.e.get(c,h))&&c(b)},m=function(b,c){var d=b.ownerDocument;a.a.e.get(d,g)||(a.a.e.set(d,g,!0),a.a.q(d,"selectionchange",l));a.a.e.set(b,h,c)};a.d.textInput={init:function(b,d,g){function l(c,d){a.a.q(b,c,d)}function h(){var c=a.a.c(d());if(null===c||c===n)c="";u!==n&&c===u?a.a.setTimeout(h,4):b.value!==c&&(s=c,b.value=c)}function y(){t||(u=b.value,t=a.a.setTimeout(v,4))}function v(){clearTimeout(t);u=t=n;var c=b.value;s!==c&&(s=c,a.h.Ga(d(),g,"textInput",c))}var s=b.value,
|
||
|
t,u,x=9==a.a.C?y:v;10>a.a.C?(l("propertychange",function(a){"value"===a.propertyName&&x(a)}),8==a.a.C&&(l("keyup",v),l("keydown",v)),8<=a.a.C&&(m(b,x),l("dragend",y))):(l("input",v),5>e&&"textarea"===a.a.A(b)?(l("keydown",y),l("paste",y),l("cut",y)):11>c?l("keydown",y):4>f&&(l("DOMAutoComplete",v),l("dragdrop",v),l("drop",v)));l("change",v);a.m(h,null,{i:b})}};a.h.ga.textInput=!0;a.d.textinput={preprocess:function(a,b,c){c("textInput",a)}}})();a.d.uniqueName={init:function(b,c){if(c()){var d="ko_unique_"+
|
||
|
++a.d.uniqueName.Nc;a.a.vc(b,d)}}};a.d.uniqueName.Nc=0;a.d.value={after:["options","foreach"],init:function(b,c,d){if("input"!=b.tagName.toLowerCase()||"checkbox"!=b.type&&"radio"!=b.type){var e=["change"],f=d.get("valueUpdate"),g=!1,h=null;f&&("string"==typeof f&&(f=[f]),a.a.ta(e,f),e=a.a.Wb(e));var l=function(){h=null;g=!1;var e=c(),f=a.j.u(b);a.h.Ga(e,d,"value",f)};!a.a.C||"input"!=b.tagName.toLowerCase()||"text"!=b.type||"off"==b.autocomplete||b.form&&"off"==b.form.autocomplete||-1!=a.a.o(e,"propertychange")||
|
||
|
(a.a.q(b,"propertychange",function(){g=!0}),a.a.q(b,"focus",function(){g=!1}),a.a.q(b,"blur",function(){g&&l()}));a.a.r(e,function(c){var d=l;a.a.sd(c,"after")&&(d=function(){h=a.j.u(b);a.a.setTimeout(l,0)},c=c.substring(5));a.a.q(b,c,d)});var m=function(){var e=a.a.c(c()),f=a.j.u(b);if(null!==h&&e===h)a.a.setTimeout(m,0);else if(e!==f)if("select"===a.a.A(b)){var g=d.get("valueAllowUnset"),f=function(){a.j.ja(b,e,g)};f();g||e===a.j.u(b)?a.a.setTimeout(f,0):a.l.w(a.a.Fa,null,[b,"change"])}else a.j.ja(b,
|
||
|
e)};a.m(m,null,{i:b})}else a.La(b,{checkedValue:c})},update:function(){}};a.h.ga.value=!0;a.d.visible={update:function(b,c){var d=a.a.c(c()),e="none"!=b.style.display;d&&!e?b.style.display="":!d&&e&&(b.style.display="none")}};(function(b){a.d[b]={init:function(c,d,e,f,g){return a.d.event.init.call(this,c,function(){var a={};a[b]=d();return a},e,f,g)}}})("click");a.P=function(){};a.P.prototype.renderTemplateSource=function(){throw Error("Override renderTemplateSource");};a.P.prototype.createJavaScriptEvaluatorBlock=
|
||
|
function(){throw Error("Override createJavaScriptEvaluatorBlock");};a.P.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){c=c||t;var d=c.getElementById(b);if(!d)throw Error("Cannot find template with ID "+b);return new a.v.n(d)}if(1==b.nodeType||8==b.nodeType)return new a.v.sa(b);throw Error("Unknown template type: "+b);};a.P.prototype.renderTemplate=function(a,c,d,e){a=this.makeTemplateSource(a,e);return this.renderTemplateSource(a,c,d,e)};a.P.prototype.isTemplateRewritten=function(a,
|
||
|
c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data("isRewritten")};a.P.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data("isRewritten",!0)};a.b("templateEngine",a.P);a.Ib=function(){function b(b,c,d,h){b=a.h.Ab(b);for(var l=a.h.va,m=0;m<b.length;m++){var k=b[m].key;if(l.hasOwnProperty(k)){var r=l[k];if("function"===typeof r){if(k=r(b[m].value))throw Error(k);}else if(!r)throw Error("This template engine does not support the '"+
|
||
|
k+"' binding within its templates");}}d="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+a.h.Xa(b,{valueAccessors:!0})+" } })()},'"+d.toLowerCase()+"')";return h.createJavaScriptEvaluatorBlock(d)+c}var c=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,d=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{Tc:function(b,c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.Ib.jd(b,
|
||
|
c)},d)},jd:function(a,f){return a.replace(c,function(a,c,d,e,k){return b(k,c,d,f)}).replace(d,function(a,c){return b(c,"\x3c!-- ko --\x3e","#comment",f)})},Jc:function(b,c){return a.N.yb(function(d,h){var l=d.nextSibling;l&&l.nodeName.toLowerCase()===c&&a.La(l,b,h)})}}}();a.b("__tr_ambtns",a.Ib.Jc);(function(){a.v={};a.v.n=function(b){if(this.n=b){var c=a.a.A(b);this.eb="script"===c?1:"textarea"===c?2:"template"==c&&b.content&&11===b.content.nodeType?3:4}};a.v.n.prototype.text=function(){var b=1===
|
||
|
this.eb?"text":2===this.eb?"value":"innerHTML";if(0==arguments.length)return this.n[b];var c=arguments[0];"innerHTML"===b?a.a.Eb(this.n,c):this.n[b]=c};var b=a.a.e.J()+"_";a.v.n.prototype.data=function(c){if(1===arguments.length)return a.a.e.get(this.n,b+c);a.a.e.set(this.n,b+c,arguments[1])};var c=a.a.e.J();a.v.n.prototype.nodes=function(){var b=this.n;if(0==arguments.length)return(a.a.e.get(b,c)||{}).mb||(3===this.eb?b.content:4===this.eb?b:n);a.a.e.set(b,c,{mb:arguments[0]})};a.v.sa=function(a){this.n=
|
||
|
a};a.v.sa.prototype=new a.v.n;a.v.sa.prototype.text=function(){if(0==arguments.length){var b=a.a.e.get(this.n,c)||{};b.Jb===n&&b.mb&&(b.Jb=b.mb.innerHTML);return b.Jb}a.a.e.set(this.n,c,{Jb:arguments[0]})};a.b("templateSources",a.v);a.b("templateSources.domElement",a.v.n);a.b("templateSources.anonymousTemplate",a.v.sa)})();(function(){function b(b,c,d){var e;for(c=a.f.nextSibling(c);b&&(e=b)!==c;)b=a.f.nextSibling(e),d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,h=
|
||
|
a.S.instance,n=h.preprocessNode;if(n){b(e,f,function(a,b){var c=a.previousSibling,d=n.call(h,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e):(c.push(e,f),a.a.Ba(c,g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.Ub(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.N.Cc(b,[d])});a.a.Ba(c,g)}}function d(a){return a.nodeType?a:0<a.length?a[0]:null}function e(b,e,f,h,q){q=q||{};var p=(b&&d(b)||f||{}).ownerDocument,n=q.templateEngine||g;
|
||
|
a.Ib.Tc(f,n,p);f=n.renderTemplate(f,h,q,p);if("number"!=typeof f.length||0<f.length&&"number"!=typeof f[0].nodeType)throw Error("Template engine must return an array of DOM nodes");p=!1;switch(e){case "replaceChildren":a.f.fa(b,f);p=!0;break;case "replaceNode":a.a.uc(b,f);p=!0;break;case "ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+e);}p&&(c(f,h),q.afterRender&&a.l.w(q.afterRender,null,[f,h.$data]));return f}function f(b,c,d){return a.I(b)?b():"function"===typeof b?b(c,d):b}
|
||
|
var g;a.Fb=function(b){if(b!=n&&!(b instanceof a.P))throw Error("templateEngine must inherit from ko.templateEngine");g=b};a.Cb=function(b,c,k,h,q){k=k||{};if((k.templateEngine||g)==n)throw Error("Set a template engine before calling renderTemplate");q=q||"replaceChildren";if(h){var p=d(h);return a.B(function(){var g=c&&c instanceof a.R?c:new a.R(c,null,null,null,{exportDependencies:!0}),n=f(b,g.$data,g),g=e(h,q,n,g,k);"replaceNode"==q&&(h=g,p=d(h))},null,{ya:function(){return!p||!a.a.qb(p)},i:p&&
|
||
|
"replaceNode"==q?p.parentNode:p})}return a.N.yb(function(d){a.Cb(b,c,k,d,"replaceNode")})};a.pd=function(b,d,g,h,q){function p(a,b){c(b,t);g.afterRender&&g.afterRender(b,a);t=null}function s(a,c){t=q.createChildContext(a,g.as,function(a){a.$index=c});var d=f(b,a,t);return e(null,"ignoreTargetNode",d,t,g)}var t;return a.B(function(){var b=a.a.c(d)||[];"undefined"==typeof b.length&&(b=[b]);b=a.a.Ma(b,function(b){return g.includeDestroyed||b===n||null===b||!a.a.c(b._destroy)});a.l.w(a.a.Db,null,[h,b,
|
||
|
s,g,p])},null,{i:h})};var h=a.a.e.J();a.d.template={init:function(b,c){var d=a.a.c(c());if("string"==typeof d||d.name)a.f.za(b);else{if("nodes"in d){if(d=d.nodes||[],a.I(d))throw Error('The "nodes" option must be a plain, non-observable array.');}else d=a.f.childNodes(b);d=a.a.nc(d);(new a.v.sa(b)).nodes(d)}return{controlsDescendantBindings:!0}},update:function(b,c,d,e,f){var g=c();c=a.a.c(g);d=!0;e=null;"string"==typeof c?c={}:(g=c.name,"if"in c&&(d=a.a.c(c["if"])),d&&"ifnot"in c&&(d=!a.a.c(c.ifnot)));
|
||
|
"foreach"in c?e=a.pd(g||b,d&&c.foreach||[],c,b,f):d?(f="data"in c?f.ac(c.data,c.as):f,e=a.Cb(g||b,f,c,b)):a.f.za(b);f=e;(c=a.a.e.get(b,h))&&"function"==typeof c.k&&c.k();a.a.e.set(b,h,f&&f.ca()?f:n)}};a.h.va.template=function(b){b=a.h.Ab(b);return 1==b.length&&b[0].unknown||a.h.fd(b,"name")?null:"This template engine does not support anonymous templates nested within its templates"};a.f.aa.template=!0})();a.b("setTemplateEngine",a.Fb);a.b("renderTemplate",a.Cb);a.a.hc=function(a,c,d){if(a.length&&
|
||
|
c.length){var e,f,g,h,l;for(e=f=0;(!d||e<d)&&(h=a[f]);++f){for(g=0;l=c[g];++g)if(h.value===l.value){h.moved=l.index;l.moved=h.index;c.splice(g,1);e=g=0;break}e+=g}}};a.a.lb=function(){function b(b,d,e,f,g){var h=Math.min,l=Math.max,m=[],k,n=b.length,q,p=d.length,s=p-n||1,t=n+p+1,v,u,x;for(k=0;k<=n;k++)for(u=v,m.push(v=[]),x=h(p,k+s),q=l(0,k-1);q<=x;q++)v[q]=q?k?b[k-1]===d[q-1]?u[q-1]:h(u[q]||t,v[q-1]||t)+1:q+1:k+1;h=[];l=[];s=[];k=n;for(q=p;k||q;)p=m[k][q]-1,q&&p===m[k][q-1]?l.push(h[h.length]={status:e,
|
||
|
value:d[--q],index:q}):k&&p===m[k-1][q]?s.push(h[h.length]={status:f,value:b[--k],index:k}):(--q,--k,g.sparse||h.push({status:"retained",value:d[q]}));a.a.hc(s,l,!g.dontLimitMoves&&10*n);return h.reverse()}return function(a,d,e){e="boolean"===typeof e?{dontLimitMoves:e}:e||{};a=a||[];d=d||[];return a.length<d.length?b(a,d,"added","deleted",e):b(d,a,"deleted","added",e)}}();a.b("utils.compareArrays",a.a.lb);(function(){function b(b,c,d,h,l){var m=[],k=a.B(function(){var k=c(d,l,a.a.Ba(m,b))||[];0<
|
||
|
m.length&&(a.a.uc(m,k),h&&a.l.w(h,null,[d,k,l]));m.length=0;a.a.ta(m,k)},null,{i:b,ya:function(){return!a.a.Tb(m)}});return{ea:m,B:k.ca()?k:n}}var c=a.a.e.J(),d=a.a.e.J();a.a.Db=function(e,f,g,h,l){function m(b,c){w=q[c];u!==c&&(D[b]=w);w.tb(u++);a.a.Ba(w.ea,e);t.push(w);z.push(w)}function k(b,c){if(b)for(var d=0,e=c.length;d<e;d++)c[d]&&a.a.r(c[d].ea,function(a){b(a,d,c[d].ka)})}f=f||[];h=h||{};var r=a.a.e.get(e,c)===n,q=a.a.e.get(e,c)||[],p=a.a.ib(q,function(a){return a.ka}),s=a.a.lb(p,f,h.dontLimitMoves),
|
||
|
t=[],v=0,u=0,x=[],z=[];f=[];for(var D=[],p=[],w,C=0,B,E;B=s[C];C++)switch(E=B.moved,B.status){case "deleted":E===n&&(w=q[v],w.B&&(w.B.k(),w.B=n),a.a.Ba(w.ea,e).length&&(h.beforeRemove&&(t.push(w),z.push(w),w.ka===d?w=null:f[C]=w),w&&x.push.apply(x,w.ea)));v++;break;case "retained":m(C,v++);break;case "added":E!==n?m(C,E):(w={ka:B.value,tb:a.O(u++)},t.push(w),z.push(w),r||(p[C]=w))}a.a.e.set(e,c,t);k(h.beforeMove,D);a.a.r(x,h.beforeRemove?a.ba:a.removeNode);for(var C=0,r=a.f.firstChild(e),F;w=z[C];C++){w.ea||
|
||
|
a.a.extend(w,b(e,g,w.ka,l,w.tb));for(v=0;s=w.ea[v];r=s.nextSibling,F=s,v++)s!==r&&a.f.kc(e,s,F);!w.ad&&l&&(l(w.ka,w.ea,w.tb),w.ad=!0)}k(h.beforeRemove,f);for(C=0;C<f.length;++C)f[C]&&(f[C].ka=d);k(h.afterMove,D);k(h.afterAdd,p)}})();a.b("utils.setDomNodeChildrenFromArrayMapping",a.a.Db);a.X=function(){this.allowTemplateRewriting=!1};a.X.prototype=new a.P;a.X.prototype.renderTemplateSource=function(b,c,d,e){if(c=(9>a.a.C?0:b.nodes)?b.nodes():null)return a.a.W(c.cloneNode(!0).childNodes);b=b.text();
|
||
|
return a.a.na(b,e)};a.X.vb=new a.X;a.Fb(a.X.vb);a.b("nativeTemplateEngine",a.X);(function(){a.xb=function(){var a=this.ed=function(){if(!u||!u.tmpl)return 0;try{if(0<=u.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,e,f,g){g=g||t;f=f||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var h=b.data("precompiled");h||(h=b.text()||"",h=u.template(null,"{{ko_with $item.koBindingContext}}"+
|
||
|
h+"{{/ko_with}}"),b.data("precompiled",h));b=[e.$data];e=u.extend({koBindingContext:e},f.templateOptions);e=u.tmpl(h,b,e);e.appendTo(g.createElement("div"));u.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){t.write("<script type='text/html' id='"+a+"'>"+b+"\x3c/script>")};0<a&&(u.tmpl.tag.ko_code={open:"__.push($1 || '');"},u.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};a.xb.prototype=
|
||
|
new a.P;var b=new a.xb;0<b.ed&&a.Fb(b);a.b("jqueryTmplTemplateEngine",a.xb)})()})})();})();
|
||
|
|
||
|
/*! WeakMap shim
|
||
|
* (The MIT License)
|
||
|
*
|
||
|
* Copyright (c) 2012 Brandon Benvie <http://bbenvie.com>
|
||
|
*
|
||
|
* 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 with 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.
|
||
|
*/
|
||
|
// Original WeakMap implementation by Gozala @ https://gist.github.com/1269991
|
||
|
// Updated and bugfixed by Raynos @ https://gist.github.com/1638059
|
||
|
// Expanded by Benvie @ https://github.com/Benvie/harmony-collections
|
||
|
// This is the version used by knockout-es5. Modified by Steve Sanderson as follows:
|
||
|
// [1] Deleted weakmap.min.js (it's not useful as it would be out of sync with weakmap.js now I'm editing it)
|
||
|
// [2] Since UglifyJS strips inline function names (and you can't disable that without disabling name mangling
|
||
|
// entirely), insert code that re-adds function names
|
||
|
void function(a,b,c){function d(a,b,c){return"function"==typeof b&&(c=b,b=e(c).replace(/_$/,"")),j(a,b,{configurable:!0,writable:!0,value:c})}function e(a){return"function"!=typeof a?"":"_name"in a?a._name:"name"in a?a.name:k.call(a).match(n)[1]}function f(a,b){
|
||
|
// Undo the name-stripping that UglifyJS does
|
||
|
return b._name=a,b}function g(a){function b(b,e){return e||2===arguments.length?d.set(b,e):(e=d.get(b),e===c&&(e=a(b),d.set(b,e))),e}var d=new p;return a||(a=q),b}var h=Object.getOwnPropertyNames,i="object"==typeof window?Object.getOwnPropertyNames(window):[],j=Object.defineProperty,k=Function.prototype.toString,l=Object.create,m=Object.prototype.hasOwnProperty,n=/^\n?function\s?(\w*)?_?\(/,o=function(){function a(){var a=g(),c={};this.unlock=function(d){var e=n(d);if(m.call(e,a))return e[a](c);var f=l(null,b);return j(e,a,{value:function(a){if(a===c)return f}}),f}}var b={value:{writable:!0,value:c}},e=l(null),g=function(){var a=Math.random().toString(36).slice(2);return a in e?g():e[a]=a},k=g(),n=function(a){if(m.call(a,k))return a[k];if(!Object.isExtensible(a))throw new TypeError("Object must be extensible");var b=l(null);return j(a,k,{value:b}),b};
|
||
|
// common per-object storage area made visible by patching getOwnPropertyNames'
|
||
|
return d(Object,f("getOwnPropertyNames",function(a){
|
||
|
// gh-43
|
||
|
var b,c=Object(a);
|
||
|
// Fixes for debuggers:
|
||
|
// 1) Some objects lack .toString(), calling it on them make Chrome
|
||
|
// debugger fail when inspecting variables.
|
||
|
// 2) Window.prototype methods and properties are private in IE11 and
|
||
|
// throw 'Invalid calling object'.
|
||
|
if(c!==Window.prototype&&"toString"in c&&"[object Window]"===c.toString())try{b=h(a)}catch(a){b=i}else b=h(a);return m.call(a,k)&&b.splice(b.indexOf(k),1),b})),d(a.prototype,f("get",function(a){return this.unlock(a).value})),d(a.prototype,f("set",function(a,b){this.unlock(a).value=b})),a}(),p=function(g){function h(b){return this===a||null==this||this===h.prototype?new h(b):(p(this,new o),void r(this,b))}function i(a){n(a);var d=q(this).get(a);return d===b?c:d}function j(a,d){n(a),
|
||
|
// store a token for explicit undefined so that "has" works correctly
|
||
|
q(this).set(a,d===c?b:d)}function k(a){return n(a),q(this).get(a)!==c}function l(a){n(a);var b=q(this),d=b.get(a)!==c;return b.set(a,c),d}function m(){return q(this),"[object WeakMap]"}var n=function(a){if(null==a||"object"!=typeof a&&"function"!=typeof a)throw new TypeError("Invalid WeakMap key")},p=function(a,b){var c=g.unlock(a);if(c.value)throw new TypeError("Object is already a WeakMap");c.value=b},q=function(a){var b=g.unlock(a).value;if(!b)throw new TypeError("WeakMap is not generic");return b},r=function(a,b){null!==b&&"object"==typeof b&&"function"==typeof b.forEach&&b.forEach(function(c,d){c instanceof Array&&2===c.length&&j.call(a,b[d][0],b[d][1])})};
|
||
|
// Undo the function-name stripping that UglifyJS does
|
||
|
i._name="get",j._name="set",k._name="has",m._name="toString";var s=(""+Object).split("Object"),t=f("toString",function(){return s[0]+e(this)+s[1]});d(t,t);var u={__proto__:[]}instanceof Array?function(a){a.__proto__=t}:function(a){d(a,t)};return u(h),[m,i,j,k,l].forEach(function(a){d(h.prototype,a),u(a)}),h}(new o),q=Object.create?function(){return Object.create(null)}:function(){return{}};"undefined"!=typeof module?module.exports=p:"undefined"!=typeof exports?exports.WeakMap=p:"WeakMap"in a||(a.WeakMap=p),p.createStorage=g,a.WeakMap&&(a.WeakMap.createStorage=g)}(function(){return this}()),/*!
|
||
|
* Knockout ES5 plugin - https://github.com/SteveSanderson/knockout-es5
|
||
|
* Copyright (c) Steve Sanderson
|
||
|
* MIT license
|
||
|
*/
|
||
|
function(a,b){"use strict";
|
||
|
// Model tracking
|
||
|
// --------------
|
||
|
//
|
||
|
// This is the central feature of Knockout-ES5. We augment model objects by converting properties
|
||
|
// into ES5 getter/setter pairs that read/write an underlying Knockout observable. This means you can
|
||
|
// use plain JavaScript syntax to read/write the property while still getting the full benefits of
|
||
|
// Knockout's automatic dependency detection and notification triggering.
|
||
|
//
|
||
|
// For comparison, here's Knockout ES3-compatible syntax:
|
||
|
//
|
||
|
// var firstNameLength = myModel.user().firstName().length; // Read
|
||
|
// myModel.user().firstName('Bert'); // Write
|
||
|
//
|
||
|
// ... versus Knockout-ES5 syntax:
|
||
|
//
|
||
|
// var firstNameLength = myModel.user.firstName.length; // Read
|
||
|
// myModel.user.firstName = 'Bert'; // Write
|
||
|
// `ko.track(model)` converts each property on the given model object into a getter/setter pair that
|
||
|
// wraps a Knockout observable. Optionally specify an array of property names to wrap; otherwise we
|
||
|
// wrap all properties. If any of the properties are already observables, we replace them with
|
||
|
// ES5 getter/setter pairs that wrap your original observable instances. In the case of readonly
|
||
|
// ko.computed properties, we simply do not define a setter (so attempted writes will be ignored,
|
||
|
// which is how ES5 readonly properties normally behave).
|
||
|
//
|
||
|
// By design, this does *not* recursively walk child object properties, because making literally
|
||
|
// everything everywhere independently observable is usually unhelpful. When you do want to track
|
||
|
// child object properties independently, define your own class for those child objects and put
|
||
|
// a separate ko.track call into its constructor --- this gives you far more control.
|
||
|
/**
|
||
|
* @param {object} obj
|
||
|
* @param {object|array.<string>} propertyNamesOrSettings
|
||
|
* @param {boolean} propertyNamesOrSettings.deep Use deep track.
|
||
|
* @param {array.<string>} propertyNamesOrSettings.fields Array of property names to wrap.
|
||
|
* todo: @param {array.<string>} propertyNamesOrSettings.exclude Array of exclude property names to wrap.
|
||
|
* todo: @param {function(string, *):boolean} propertyNamesOrSettings.filter Function to filter property
|
||
|
* names to wrap. A function that takes ... params
|
||
|
* @return {object}
|
||
|
*/
|
||
|
function c(a,b){if(!a||"object"!=typeof a)throw new Error("When calling ko.track, you must pass an object as the first parameter.");var c;
|
||
|
// defaults
|
||
|
return i(b)?(b.deep=b.deep||!1,b.fields=b.fields||Object.getOwnPropertyNames(a),b.lazy=b.lazy||!1,h(a,b.fields,b)):(c=b||Object.getOwnPropertyNames(a),h(a,c,{})),a}function d(a){return a.name?a.name:(a.toString().trim().match(A)||[])[1]}function e(a){return a&&"object"==typeof a&&"Object"===d(a.constructor)}function f(a,c,d){var e=w.isObservable(a),f=!e&&Array.isArray(a),g=e?a:f?w.observableArray(a):w.observable(a);
|
||
|
// add check in case the object is already an observable array
|
||
|
return d[c]=function(){return g},(f||e&&"push"in g)&&m(w,g),{configurable:!0,enumerable:!0,get:g,set:w.isWriteableObservable(g)?g:b}}function g(a,b,c){function d(a,b){return e?b?e(a):e:Array.isArray(a)?(e=w.observableArray(a),m(w,e),e):e=w.observable(a)}if(w.isObservable(a))
|
||
|
// no need to be lazy if we already have an observable
|
||
|
return f(a,b,c);var e;return c[b]=function(){return d(a)},{configurable:!0,enumerable:!0,get:function(){return d(a)()},set:function(a){d(a,!0)}}}function h(a,b,c){if(b.length){var d=j(a,!0),i={};b.forEach(function(b){
|
||
|
// Skip properties that are already tracked
|
||
|
if(!(b in d)&&Object.getOwnPropertyDescriptor(a,b).configurable!==!1)
|
||
|
// Skip properties where descriptor can't be redefined
|
||
|
{var j=a[b];i[b]=(c.lazy?g:f)(j,b,d),c.deep&&e(j)&&h(j,Object.keys(j),c)}}),Object.defineProperties(a,i)}}function i(a){return!!a&&"object"==typeof a&&a.constructor===Object}
|
||
|
// Gets or creates the hidden internal key-value collection of observables corresponding to
|
||
|
// properties on the model object.
|
||
|
function j(a,b){y||(y=x());var c=y.get(a);return!c&&b&&(c={},y.set(a,c)),c}
|
||
|
// Removes the internal references to observables mapped to the specified properties
|
||
|
// or the entire object reference if no properties are passed in. This allows the
|
||
|
// observables to be replaced and tracked again.
|
||
|
function k(a,b){if(y)if(1===arguments.length)y.delete(a);else{var c=j(a,!1);c&&b.forEach(function(a){delete c[a]})}}
|
||
|
// Computed properties
|
||
|
// -------------------
|
||
|
//
|
||
|
// The preceding code is already sufficient to upgrade ko.computed model properties to ES5
|
||
|
// getter/setter pairs (or in the case of readonly ko.computed properties, just a getter).
|
||
|
// These then behave like a regular property with a getter function, except they are smarter:
|
||
|
// your evaluator is only invoked when one of its dependencies changes. The result is cached
|
||
|
// and used for all evaluations until the next time a dependency changes).
|
||
|
//
|
||
|
// However, instead of forcing developers to declare a ko.computed property explicitly, it's
|
||
|
// nice to offer a utility function that declares a computed getter directly.
|
||
|
// Implements `ko.defineProperty`
|
||
|
function l(a,b,d){var e=this,f={owner:a,deferEvaluation:!0};if("function"==typeof d)f.read=d;else{if("value"in d)throw new Error('For ko.defineProperty, you must not specify a "value" for the property. You must provide a "get" function.');if("function"!=typeof d.get)throw new Error('For ko.defineProperty, the third parameter must be either an evaluator function, or an options object containing a function called "get".');f.read=d.get,f.write=d.set}return a[b]=e.computed(f),c.call(e,a,[b]),a}
|
||
|
// Array handling
|
||
|
// --------------
|
||
|
//
|
||
|
// Arrays are special, because unlike other property types, they have standard mutator functions
|
||
|
// (`push`/`pop`/`splice`/etc.) and it's desirable to trigger a change notification whenever one of
|
||
|
// those mutator functions is invoked.
|
||
|
//
|
||
|
// Traditionally, Knockout handles this by putting special versions of `push`/`pop`/etc. on observable
|
||
|
// arrays that mutate the underlying array and then trigger a notification. That approach doesn't
|
||
|
// work for Knockout-ES5 because properties now return the underlying arrays, so the mutator runs
|
||
|
// in the context of the underlying array, not any particular observable:
|
||
|
//
|
||
|
// // Operates on the underlying array value
|
||
|
// myModel.someCollection.push('New value');
|
||
|
//
|
||
|
// To solve this, Knockout-ES5 detects array values, and modifies them as follows:
|
||
|
// 1. Associates a hidden subscribable with each array instance that it encounters
|
||
|
// 2. Intercepts standard mutators (`push`/`pop`/etc.) and makes them trigger the subscribable
|
||
|
// Then, for model properties whose values are arrays, the property's underlying observable
|
||
|
// subscribes to the array subscribable, so it can trigger a change notification after mutation.
|
||
|
// Given an observable that underlies a model property, watch for any array value that might
|
||
|
// be assigned as the property value, and hook into its change events
|
||
|
function m(a,b){var c=null;a.computed(function(){
|
||
|
// Unsubscribe to any earlier array instance
|
||
|
c&&(c.dispose(),c=null);
|
||
|
// Subscribe to the new array instance
|
||
|
var d=b();d instanceof Array&&(c=n(a,b,d))})}
|
||
|
// Listens for array mutations, and when they happen, cause the observable to fire notifications.
|
||
|
// This is used to make model properties of type array fire notifications when the array changes.
|
||
|
// Returns a subscribable that can later be disposed.
|
||
|
function n(a,b,c){var d=o(a,c);return d.subscribe(b)}
|
||
|
// Gets or creates a subscribable that fires after each array mutation
|
||
|
function o(a,b){z||(z=x());var c=z.get(b);if(!c){c=new a.subscribable,z.set(b,c);var d={};p(b,c,d),q(a,b,c,d)}return c}
|
||
|
// After each array mutation, fires a notification on the given subscribable
|
||
|
function p(a,b,c){["pop","push","reverse","shift","sort","splice","unshift"].forEach(function(d){var e=a[d];a[d]=function(){var a=e.apply(this,arguments);return c.pause!==!0&&b.notifySubscribers(this),a}})}
|
||
|
// Adds Knockout's additional array mutation functions to the array
|
||
|
function q(a,b,c,d){["remove","removeAll","destroy","destroyAll","replace"].forEach(function(e){
|
||
|
// Make it a non-enumerable property for consistency with standard Array functions
|
||
|
Object.defineProperty(b,e,{enumerable:!1,value:function(){var f;
|
||
|
// These additional array mutators are built using the underlying push/pop/etc.
|
||
|
// mutators, which are wrapped to trigger notifications. But we don't want to
|
||
|
// trigger multiple notifications, so pause the push/pop/etc. wrappers and
|
||
|
// delivery only one notification at the end of the process.
|
||
|
d.pause=!0;try{
|
||
|
// Creates a temporary observableArray that can perform the operation.
|
||
|
f=a.observableArray.fn[e].apply(a.observableArray(b),arguments)}finally{d.pause=!1}return c.notifySubscribers(b),f}})})}
|
||
|
// Static utility functions
|
||
|
// ------------------------
|
||
|
//
|
||
|
// Since Knockout-ES5 sets up properties that return values, not observables, you can't
|
||
|
// trivially subscribe to the underlying observables (e.g., `someProperty.subscribe(...)`),
|
||
|
// or tell them that object values have mutated, etc. To handle this, we set up some
|
||
|
// extra utility functions that can return or work with the underlying observables.
|
||
|
// Returns the underlying observable associated with a model property (or `null` if the
|
||
|
// model or property doesn't exist, or isn't associated with an observable). This means
|
||
|
// you can subscribe to the property, e.g.:
|
||
|
//
|
||
|
// ko.getObservable(model, 'propertyName')
|
||
|
// .subscribe(function(newValue) { ... });
|
||
|
function r(a,b){if(!a||"object"!=typeof a)return null;var c=j(a,!1);if(c&&b in c)return c[b]();var d=a[b];return w.isObservable(d)?d:null}
|
||
|
// Returns a boolean indicating whether the property on the object has an underlying
|
||
|
// observables. This does the check in a way not to create an observable if the
|
||
|
// object was created with lazily created observables
|
||
|
function s(a,b){if(!a||"object"!=typeof a)return!1;var c=j(a,!1);return!!c&&b in c}
|
||
|
// Causes a property's associated observable to fire a change notification. Useful when
|
||
|
// the property value is a complex object and you've modified a child property.
|
||
|
function t(a,b){var c=r(a,b);c&&c.valueHasMutated()}
|
||
|
// Module initialisation
|
||
|
// ---------------------
|
||
|
//
|
||
|
// When this script is first evaluated, it works out what kind of module loading scenario
|
||
|
// it is in (Node.js or a browser `<script>` tag), stashes a reference to its dependencies
|
||
|
// (currently that's just the WeakMap shim), and then finally attaches itself to whichever
|
||
|
// instance of Knockout.js it can find.
|
||
|
// Extends a Knockout instance with Knockout-ES5 functionality
|
||
|
function u(a){a.track=c,a.untrack=k,a.getObservable=r,a.valueHasMutated=t,a.defineProperty=l,
|
||
|
// todo: test it, maybe added it to ko. directly
|
||
|
a.es5={getAllObservablesForObject:j,notifyWhenPresentOrFutureArrayValuesMutate:m,isTracked:s}}
|
||
|
// Determines which module loading scenario we're in, grabs dependencies, and attaches to KO
|
||
|
function v(){if("object"==typeof exports&&"object"==typeof module){
|
||
|
// Node.js case - load KO and WeakMap modules synchronously
|
||
|
w=require("knockout");var b=a.WeakMap||require("../lib/weakmap");u(w),x=function(){return new b},module.exports=w}else"function"==typeof define&&define.amd?define('KnockoutES5',["knockout"],function(b){return w=b,u(b),x=function(){return new a.WeakMap},b}):"ko"in a&&(
|
||
|
// Non-module case - attach to the global instance, and assume a global WeakMap constructor
|
||
|
w=a.ko,u(a.ko),x=function(){return new a.WeakMap})}var w,x,y,z,A=/^function\s*([^\s(]+)/;v()}("undefined"!=typeof window?window:"undefined"!=typeof global?global:this);
|
||
|
/*! markdown-it-sanitizer 0.4.3 https://github.com/svbergerem/markdown-it-sanitizer @license MIT */
|
||
|
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define('markdown-it-sanitizer',[],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.markdownitSanitizer=e()}}(function(){return function e(t,n,r){function o(l,f){if(!n[l]){if(!t[l]){var a="function"==typeof require&&require;if(!f&&a)return a(l,!0);if(i)return i(l,!0);var s=new Error("Cannot find module '"+l+"'");throw s.code="MODULE_NOT_FOUND",s}var c=n[l]={exports:{}};t[l][0].call(c.exports,function(e){var n=t[l][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[l].exports}for(var i="function"==typeof require&&require,l=0;l<r.length;l++)o(r[l]);return o}({1:[function(e,t,n){"use strict";t.exports=function(e,t){function n(e){var t=l.match(e);return t&&1===t.length&&0===t[0].index&&t[0].lastIndex===e.length?t[0].url:null}function r(e){return e=e.replace(/<[^<>]*>?/gi,function(e){var t,r,o,i,l,a;return/(^<->|^<-\s|^<3\s)/.test(e)?e:(t=e.match(u),t&&(r=t[1],o=n(r.match(/src="([^"<>]*)"/i)[1]),i=r.match(/alt="([^"<>]*)"/i),i=i&&"undefined"!=typeof i[1]?i[1]:"",l=r.match(/title="([^"<>]*)"/i),l=l&&"undefined"!=typeof l[1]?l[1]:"",o&&p.test(o))?""!==y?'<img src="'+o+'" alt="'+i+'" title="'+l+'" class="'+y+'">':'<img src="'+o+'" alt="'+i+'" title="'+l+'">':(a=v.indexOf("a"),t=e.match(s),t&&(r=t[1],o=n(r.match(/href="([^"<>]*)"/i)[1]),l=r.match(/title="([^"<>]*)"/i),l=l&&"undefined"!=typeof l[1]?l[1]:"",o&&h.test(o))?(k=!0,b[a]+=1,'<a href="'+o+'" title="'+l+'" target="_blank">'):(t=/<\/a>/i.test(e))?(k=!0,b[a]-=1,b[a]<0&&(x[a]=!0),"</a>"):(t=e.match(/<(br|hr)\s?\/?>/i))?"<"+t[1].toLowerCase()+">":(t=e.match(/<(\/?)(b|blockquote|code|em|h[1-6]|li|ol(?: start="\d+")?|p|pre|s|sub|sup|strong|ul)>/i),t&&!/<\/ol start="\d+"/i.test(e)?(k=!0,a=v.indexOf(t[2].toLowerCase().split(" ")[0]),"/"===t[1]?b[a]-=1:b[a]+=1,b[a]<0&&(x[a]=!0),"<"+t[1]+t[2].toLowerCase()+">"):g===!0?"":f(e))))})}function o(e){var t,n,o;for(d=0;d<v.length;d++)b[d]=0;for(d=0;d<v.length;d++)x[d]=!1;for(k=!1,n=0;n<e.tokens.length;n++)if("html_block"===e.tokens[n].type&&(e.tokens[n].content=r(e.tokens[n].content)),"inline"===e.tokens[n].type)for(o=e.tokens[n].children,t=0;t<o.length;t++)"html_inline"===o[t].type&&(o[t].content=r(o[t].content))}function i(e){function t(e,t){var n,r;return n="a"===t?RegExp('<a href="[^"<>]*" title="[^"<>]*" target="_blank">',"g"):"ol"===t?/<ol(?: start="\d+")?>/g:RegExp("<"+t+">","g"),r=RegExp("</"+t+">","g"),m===!0?(e=e.replace(n,""),e=e.replace(r,"")):(e=e.replace(n,function(e){return f(e)}),e=e.replace(r,function(e){return f(e)})),e}function n(e){var n;for(n=0;n<v.length;n++)x[n]===!0&&(e=t(e,v[n]));return e}if(k!==!1){var r,o;for(d=0;d<v.length;d++)0!==b[d]&&(x[d]=!0);for(r=0;r<e.tokens.length;r++)if("html_block"!==e.tokens[r].type){if("inline"===e.tokens[r].type)for(o=e.tokens[r].children,d=0;d<o.length;d++)"html_inline"===o[d].type&&(o[d].content=n(o[d].content))}else e.tokens[r].content=n(e.tokens[r].content)}}var l=e.linkify,f=e.utils.escapeHtml,a='<a\\s([^<>]*href="[^"<>]*"[^<>]*)\\s?>',s=RegExp(a,"i"),c='<img\\s([^<>]*src="[^"<>]*"[^<>]*)\\s?\\/?>',u=RegExp(c,"i"),p=/^(?:https?:)?\/\//i,h=/^(?:https?:\/\/|ftp:\/\/|\/\/|mailto:|xmpp:)/i;t=t?t:{};var d,g="undefined"!=typeof t.removeUnknown&&t.removeUnknown,m="undefined"!=typeof t.removeUnbalanced&&t.removeUnbalanced,y="undefined"!=typeof t.imageClass?t.imageClass:"",k=!1,v=["a","b","blockquote","code","em","h1","h2","h3","h4","h5","h6","li","ol","p","pre","s","sub","sup","strong","ul"],b=new Array(v.length),x=new Array(v.length);for(d=0;d<v.length;d++)b[d]=0;for(d=0;d<v.length;d++)x[d]=!1;e.core.ruler.after("linkify","sanitize_inline",o),e.core.ruler.after("sanitize_inline","sanitize_balance",i)}},{}]},{},[1])(1)});
|
||
|
|
||
|
/*! markdown-it 7.0.1 https://github.com//markdown-it/markdown-it @license MIT */
|
||
|
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define('markdown-it',[],e);else{var r;r="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,r.markdownit=e()}}(function(){var e;return function e(r,t,n){function s(i,a){if(!t[i]){if(!r[i]){var c="function"==typeof require&&require;if(!a&&c)return c(i,!0);if(o)return o(i,!0);var l=new Error("Cannot find module '"+i+"'");throw l.code="MODULE_NOT_FOUND",l}var u=t[i]={exports:{}};r[i][0].call(u.exports,function(e){var t=r[i][1][e];return s(t?t:e)},u,u.exports,e,r,t,n)}return t[i].exports}for(var o="function"==typeof require&&require,i=0;i<n.length;i++)s(n[i]);return s}({1:[function(e,r,t){"use strict";r.exports=e("entities/maps/entities.json")},{"entities/maps/entities.json":52}],2:[function(e,r,t){"use strict";r.exports=["address","article","aside","base","basefont","blockquote","body","caption","center","col","colgroup","dd","details","dialog","dir","div","dl","dt","fieldset","figcaption","figure","footer","form","frame","frameset","h1","head","header","hr","html","iframe","legend","li","link","main","menu","menuitem","meta","nav","noframes","ol","optgroup","option","p","param","pre","section","source","title","summary","table","tbody","td","tfoot","th","thead","title","tr","track","ul"]},{}],3:[function(e,r,t){"use strict";var n="[a-zA-Z_:][a-zA-Z0-9:._-]*",s="[^\"'=<>`\\x00-\\x20]+",o="'[^']*'",i='"[^"]*"',a="(?:"+s+"|"+o+"|"+i+")",c="(?:\\s+"+n+"(?:\\s*=\\s*"+a+")?)",l="<[A-Za-z][A-Za-z0-9\\-]*"+c+"*\\s*\\/?>",u="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",p="<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->",h="<[?].*?[?]>",f="<![A-Z]+\\s+[^>]*>",d="<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",m=new RegExp("^(?:"+l+"|"+u+"|"+p+"|"+h+"|"+f+"|"+d+")"),_=new RegExp("^(?:"+l+"|"+u+")");r.exports.HTML_TAG_RE=m,r.exports.HTML_OPEN_CLOSE_TAG_RE=_},{}],4:[function(e,r,t){"use strict";function n(e){return Object.prototype.toString.call(e)}function s(e){return"[object String]"===n(e)}function o(e,r){return y.call(e,r)}function i(e){var r=Array.prototype.slice.call(arguments,1);return r.forEach(function(r){if(r){if("object"!=typeof r)throw new TypeError(r+"must be object");Object.keys(r).forEach(function(t){e[t]=r[t]})}}),e}function a(e,r,t){return[].concat(e.slice(0,r),t,e.slice(r+1))}function c(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!==(65535&e)&&65534!==(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function l(e){if(e>65535){e-=65536;var r=55296+(e>>10),t=56320+(1023&e);return String.fromCharCode(r,t)}return String.fromCharCode(e)}function u(e,r){var t=0;return o(D,r)?D[r]:35===r.charCodeAt(0)&&w.test(r)&&(t="x"===r[1].toLowerCase()?parseInt(r.slice(2),16):parseInt(r.slice(1),10),c(t))?l(t):e}function p(e){return e.indexOf("\\")<0?e:e.replace(x,"$1")}function h(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(A,function(e,r,t){return r?r:u(e,t)})}function f(e){return S[e]}function d(e){return q.test(e)?e.replace(E,f):e}function m(e){return e.replace(F,"\\$&")}function _(e){switch(e){case 9:case 32:return!0}return!1}function g(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1}function k(e){return z.test(e)}function b(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}}function v(e){return e.trim().replace(/\s+/g," ").toUpperCase()}var y=Object.prototype.hasOwnProperty,x=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,C=/&([a-z#][a-z0-9]{1,31});/gi,A=new RegExp(x.source+"|"+C.source,"gi"),w=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,D=e("./entities"),q=/[&<>"]/,E=/[&<>"]/g,S={"&":"&","<":"<",">":">",'"':"""},F=/[.?*+^$[\]\\(){}|-]/g,z=e("uc.micro/ca
|
||
|
}if(!/^:?-+:?$/.test(m))return!1;58===m.charCodeAt(m.length-1)?d.push(58===m.charCodeAt(0)?"center":"right"):58===m.charCodeAt(0)?d.push("left"):d.push("")}if(a=n(e,r).trim(),a.indexOf("|")===-1)return!1;if(p=s(a.replace(/^\||\|$/g,"")),h=p.length,h>d.length)return!1;if(o)return!0;for(f=e.push("table_open","table",1),f.map=_=[r,0],f=e.push("thead_open","thead",1),f.map=[r,r+1],f=e.push("tr_open","tr",1),f.map=[r,r+1],l=0;l<p.length;l++)f=e.push("th_open","th",1),f.map=[r,r+1],d[l]&&(f.attrs=[["style","text-align:"+d[l]]]),f=e.push("inline","",0),f.content=p[l].trim(),f.map=[r,r+1],f.children=[],f=e.push("th_close","th",-1);for(f=e.push("tr_close","tr",-1),f=e.push("thead_close","thead",-1),f=e.push("tbody_open","tbody",1),f.map=g=[r+2,0],u=r+2;u<t&&!(e.sCount[u]<e.blkIndent)&&(a=n(e,u),a.indexOf("|")!==-1);u++){for(p=s(a.replace(/^\||\|\s*$/g,"")),f=e.push("tr_open","tr",1),l=0;l<h;l++)f=e.push("td_open","td",1),d[l]&&(f.attrs=[["style","text-align:"+d[l]]]),f=e.push("inline","",0),f.content=p[l]?p[l].trim():"",f.children=[],f=e.push("td_close","td",-1);f=e.push("tr_close","tr",-1)}return f=e.push("tbody_close","tbody",-1),f=e.push("table_close","table",-1),_[1]=g[1]=u,e.line=u,!0}},{}],30:[function(e,r,t){"use strict";r.exports=function(e){var r;e.inlineMode?(r=new e.Token("inline","",0),r.content=e.src,r.map=[0,1],r.children=[],e.tokens.push(r)):e.md.block.parse(e.src,e.md,e.env,e.tokens)}},{}],31:[function(e,r,t){"use strict";r.exports=function(e){var r,t,n,s=e.tokens;for(t=0,n=s.length;t<n;t++)r=s[t],"inline"===r.type&&e.md.inline.parse(r.content,e.md,e.env,r.children)}},{}],32:[function(e,r,t){"use strict";function n(e){return/^<a[>\s]/i.test(e)}function s(e){return/^<\/a\s*>/i.test(e)}var o=e("../common/utils").arrayReplaceAt;r.exports=function(e){var r,t,i,a,c,l,u,p,h,f,d,m,_,g,k,b,v,y=e.tokens;if(e.md.options.linkify)for(t=0,i=y.length;t<i;t++)if("inline"===y[t].type&&e.md.linkify.pretest(y[t].content))for(a=y[t].children,_=0,r=a.length-1;r>=0;r--)if(l=a[r],"link_close"!==l.type){if("html_inline"===l.type&&(n(l.content)&&_>0&&_--,s(l.content)&&_++),!(_>0)&&"text"===l.type&&e.md.linkify.test(l.content)){for(h=l.content,v=e.md.linkify.match(h),u=[],m=l.level,d=0,p=0;p<v.length;p++)g=v[p].url,k=e.md.normalizeLink(g),e.md.validateLink(k)&&(b=v[p].text,b=v[p].schema?"mailto:"!==v[p].schema||/^mailto:/i.test(b)?e.md.normalizeLinkText(b):e.md.normalizeLinkText("mailto:"+b).replace(/^mailto:/,""):e.md.normalizeLinkText("http://"+b).replace(/^http:\/\//,""),f=v[p].index,f>d&&(c=new e.Token("text","",0),c.content=h.slice(d,f),c.level=m,u.push(c)),c=new e.Token("link_open","a",1),c.attrs=[["href",k]],c.level=m++,c.markup="linkify",c.info="auto",u.push(c),c=new e.Token("text","",0),c.content=b,c.level=m,u.push(c),c=new e.Token("link_close","a",-1),c.level=--m,c.markup="linkify",c.info="auto",u.push(c),d=v[p].lastIndex);d<h.length&&(c=new e.Token("text","",0),c.content=h.slice(d),c.level=m,u.push(c)),y[t].children=a=o(a,r,u)}}else for(r--;a[r].level!==l.level&&"link_open"!==a[r].type;)r--}},{"../common/utils":4}],33:[function(e,r,t){"use strict";var n=/\r[\n\u0085]?|[\u2424\u2028\u0085]/g,s=/\u0000/g;r.exports=function(e){var r;r=e.src.replace(n,"\n"),r=r.replace(s,"\ufffd"),e.src=r}},{}],34:[function(e,r,t){"use strict";function n(e,r){return l[r.toLowerCase()]}function s(e){var r,t,s=0;for(r=e.length-1;r>=0;r--)t=e[r],"text"!==t.type||s||(t.content=t.content.replace(c,n)),"link_open"===t.type&&"auto"===t.info&&s--,"link_close"===t.type&&"auto"===t.info&&s++}function o(e){var r,t,n=0;for(r=e.length-1;r>=0;r--)t=e[r],"text"!==t.type||n||i.test(t.content)&&(t.content=t.content.replace(/\+-/g,"\xb1").replace(/\.{2,}/g,"\u2026").replace(/([?!])\u2026/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1\u2014$2").replace(/(^|\s)--(\s|$)/gm,"$1\u2013$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1\u2013$2")),"link_open"===t.type&&"auto"===t.info&&n--,"link_close"===t.type&&"auto"===t.info&&n++}var i=/\+-|\.\.|\?\?\?\?|!!!!|,,|--/,a=/\((c|tm|r|p)\)/i,c=/\((c|tm|r|p)\)/gi,l={c:"\xa9",r:"\xa
|
||
|
LeftArrowBar:"\u21e4",leftarrow:"\u2190",LeftArrow:"\u2190",Leftarrow:"\u21d0",LeftArrowRightArrow:"\u21c6",leftarrowtail:"\u21a2",LeftCeiling:"\u2308",LeftDoubleBracket:"\u27e6",LeftDownTeeVector:"\u2961",LeftDownVectorBar:"\u2959",LeftDownVector:"\u21c3",LeftFloor:"\u230a",leftharpoondown:"\u21bd",leftharpoonup:"\u21bc",leftleftarrows:"\u21c7",leftrightarrow:"\u2194",LeftRightArrow:"\u2194",Leftrightarrow:"\u21d4",leftrightarrows:"\u21c6",leftrightharpoons:"\u21cb",leftrightsquigarrow:"\u21ad",LeftRightVector:"\u294e",LeftTeeArrow:"\u21a4",LeftTee:"\u22a3",LeftTeeVector:"\u295a",leftthreetimes:"\u22cb",LeftTriangleBar:"\u29cf",LeftTriangle:"\u22b2",LeftTriangleEqual:"\u22b4",LeftUpDownVector:"\u2951",LeftUpTeeVector:"\u2960",LeftUpVectorBar:"\u2958",LeftUpVector:"\u21bf",LeftVectorBar:"\u2952",LeftVector:"\u21bc",lEg:"\u2a8b",leg:"\u22da",leq:"\u2264",leqq:"\u2266",leqslant:"\u2a7d",lescc:"\u2aa8",les:"\u2a7d",lesdot:"\u2a7f",lesdoto:"\u2a81",lesdotor:"\u2a83",lesg:"\u22da\ufe00",lesges:"\u2a93",lessapprox:"\u2a85",lessdot:"\u22d6",lesseqgtr:"\u22da",lesseqqgtr:"\u2a8b",LessEqualGreater:"\u22da",LessFullEqual:"\u2266",LessGreater:"\u2276",lessgtr:"\u2276",LessLess:"\u2aa1",lesssim:"\u2272",LessSlantEqual:"\u2a7d",LessTilde:"\u2272",lfisht:"\u297c",lfloor:"\u230a",Lfr:"\ud835\udd0f",lfr:"\ud835\udd29",lg:"\u2276",lgE:"\u2a91",lHar:"\u2962",lhard:"\u21bd",lharu:"\u21bc",lharul:"\u296a",lhblk:"\u2584",LJcy:"\u0409",ljcy:"\u0459",llarr:"\u21c7",ll:"\u226a",Ll:"\u22d8",llcorner:"\u231e",Lleftarrow:"\u21da",llhard:"\u296b",lltri:"\u25fa",Lmidot:"\u013f",lmidot:"\u0140",lmoustache:"\u23b0",lmoust:"\u23b0",lnap:"\u2a89",lnapprox:"\u2a89",lne:"\u2a87",lnE:"\u2268",lneq:"\u2a87",lneqq:"\u2268",lnsim:"\u22e6",loang:"\u27ec",loarr:"\u21fd",lobrk:"\u27e6",longleftarrow:"\u27f5",LongLeftArrow:"\u27f5",Longleftarrow:"\u27f8",longleftrightarrow:"\u27f7",LongLeftRightArrow:"\u27f7",Longleftrightarrow:"\u27fa",longmapsto:"\u27fc",longrightarrow:"\u27f6",LongRightArrow:"\u27f6",Longrightarrow:"\u27f9",looparrowleft:"\u21ab",looparrowright:"\u21ac",lopar:"\u2985",Lopf:"\ud835\udd43",lopf:"\ud835\udd5d",loplus:"\u2a2d",lotimes:"\u2a34",lowast:"\u2217",lowbar:"_",LowerLeftArrow:"\u2199",LowerRightArrow:"\u2198",loz:"\u25ca",lozenge:"\u25ca",lozf:"\u29eb",lpar:"(",lparlt:"\u2993",lrarr:"\u21c6",lrcorner:"\u231f",lrhar:"\u21cb",lrhard:"\u296d",lrm:"\u200e",lrtri:"\u22bf",lsaquo:"\u2039",lscr:"\ud835\udcc1",Lscr:"\u2112",lsh:"\u21b0",Lsh:"\u21b0",lsim:"\u2272",lsime:"\u2a8d",lsimg:"\u2a8f",lsqb:"[",lsquo:"\u2018",lsquor:"\u201a",Lstrok:"\u0141",lstrok:"\u0142",ltcc:"\u2aa6",ltcir:"\u2a79",lt:"<",LT:"<",Lt:"\u226a",ltdot:"\u22d6",lthree:"\u22cb",ltimes:"\u22c9",ltlarr:"\u2976",ltquest:"\u2a7b",ltri:"\u25c3",ltrie:"\u22b4",ltrif:"\u25c2",ltrPar:"\u2996",lurdshar:"\u294a",luruhar:"\u2966",lvertneqq:"\u2268\ufe00",lvnE:"\u2268\ufe00",macr:"\xaf",male:"\u2642",malt:"\u2720",maltese:"\u2720",Map:"\u2905",map:"\u21a6",mapsto:"\u21a6",mapstodown:"\u21a7",mapstoleft:"\u21a4",mapstoup:"\u21a5",marker:"\u25ae",mcomma:"\u2a29",Mcy:"\u041c",mcy:"\u043c",mdash:"\u2014",mDDot:"\u223a",measuredangle:"\u2221",MediumSpace:"\u205f",Mellintrf:"\u2133",Mfr:"\ud835\udd10",mfr:"\ud835\udd2a",mho:"\u2127",micro:"\xb5",midast:"*",midcir:"\u2af0",mid:"\u2223",middot:"\xb7",minusb:"\u229f",minus:"\u2212",minusd:"\u2238",minusdu:"\u2a2a",MinusPlus:"\u2213",mlcp:"\u2adb",mldr:"\u2026",mnplus:"\u2213",models:"\u22a7",Mopf:"\ud835\udd44",mopf:"\ud835\udd5e",mp:"\u2213",mscr:"\ud835\udcc2",Mscr:"\u2133",mstpos:"\u223e",Mu:"\u039c",mu:"\u03bc",multimap:"\u22b8",mumap:"\u22b8",nabla:"\u2207",Nacute:"\u0143",nacute:"\u0144",nang:"\u2220\u20d2",nap:"\u2249",napE:"\u2a70\u0338",napid:"\u224b\u0338",napos:"\u0149",napprox:"\u2249",natural:"\u266e",naturals:"\u2115",natur:"\u266e",nbsp:"\xa0",nbump:"\u224e\u0338",nbumpe:"\u224f\u0338",ncap:"\u2a43",Ncaron:"\u0147",ncaron:"\u0148",Ncedil:"\u0145",ncedil:"\u0146",ncong:"\u2247",ncongdot:"\u2a6d\u0338",ncup:"\u2a42",Ncy:"\u041d",ncy:"\u043d",ndash:"\u2013",nearhk:"\u2924",nearr:"\u2197",neArr:"\u21d7",nearrow:"\u2197",ne:"\u2260",ned
|
||
|
s.defaultChars=";/?:@&=+$,#",s.componentChars="",r.exports=s},{}],56:[function(e,r,t){"use strict";function n(e){var r,t,n=o[e];if(n)return n;for(n=o[e]=[],r=0;r<128;r++)t=String.fromCharCode(r),/^[0-9a-z]$/i.test(t)?n.push(t):n.push("%"+("0"+r.toString(16).toUpperCase()).slice(-2));for(r=0;r<e.length;r++)n[e.charCodeAt(r)]=e[r];return n}function s(e,r,t){var o,i,a,c,l,u="";for("string"!=typeof r&&(t=r,r=s.defaultChars),"undefined"==typeof t&&(t=!0),l=n(r),o=0,i=e.length;o<i;o++)if(a=e.charCodeAt(o),t&&37===a&&o+2<i&&/^[0-9a-f]{2}$/i.test(e.slice(o+1,o+3)))u+=e.slice(o,o+3),o+=2;else if(a<128)u+=l[a];else if(a>=55296&&a<=57343){if(a>=55296&&a<=56319&&o+1<i&&(c=e.charCodeAt(o+1),c>=56320&&c<=57343)){u+=encodeURIComponent(e[o]+e[o+1]),o++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(e[o]);return u}var o={};s.defaultChars=";/?:@&=+$,-_.!~*'()#",s.componentChars="-_.!~*'()",r.exports=s},{}],57:[function(e,r,t){"use strict";r.exports=function(e){var r="";return r+=e.protocol||"",r+=e.slashes?"//":"",r+=e.auth?e.auth+"@":"",r+=e.hostname&&e.hostname.indexOf(":")!==-1?"["+e.hostname+"]":e.hostname||"",r+=e.port?":"+e.port:"",r+=e.pathname||"",r+=e.search||"",r+=e.hash||""}},{}],58:[function(e,r,t){"use strict";r.exports.encode=e("./encode"),r.exports.decode=e("./decode"),r.exports.format=e("./format"),r.exports.parse=e("./parse")},{"./decode":55,"./encode":56,"./format":57,"./parse":59}],59:[function(e,r,t){"use strict";function n(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}function s(e,r){if(e&&e instanceof n)return e;var t=new n;return t.parse(e,r),t}var o=/^([a-z0-9.+-]+:)/i,i=/:[0-9]*$/,a=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,c=["<",">",'"',"`"," ","\r","\n","\t"],l=["{","}","|","\\","^","`"].concat(c),u=["'"].concat(l),p=["%","/","?",";","#"].concat(u),h=["/","?","#"],f=255,d=/^[+a-z0-9A-Z_-]{0,63}$/,m=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,_={javascript:!0,"javascript:":!0},g={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};n.prototype.parse=function(e,r){var t,n,s,i,c,l=e;if(l=l.trim(),!r&&1===e.split("#").length){var u=a.exec(l);if(u)return this.pathname=u[1],u[2]&&(this.search=u[2]),this}var k=o.exec(l);if(k&&(k=k[0],s=k.toLowerCase(),this.protocol=k,l=l.substr(k.length)),(r||k||l.match(/^\/\/[^@\/]+@[^@\/]+/))&&(c="//"===l.substr(0,2),!c||k&&_[k]||(l=l.substr(2),this.slashes=!0)),!_[k]&&(c||k&&!g[k])){var b=-1;for(t=0;t<h.length;t++)i=l.indexOf(h[t]),i!==-1&&(b===-1||i<b)&&(b=i);var v,y;for(y=b===-1?l.lastIndexOf("@"):l.lastIndexOf("@",b),y!==-1&&(v=l.slice(0,y),l=l.slice(y+1),this.auth=v),b=-1,t=0;t<p.length;t++)i=l.indexOf(p[t]),i!==-1&&(b===-1||i<b)&&(b=i);b===-1&&(b=l.length),":"===l[b-1]&&b--;var x=l.slice(0,b);l=l.slice(b),this.parseHost(x),this.hostname=this.hostname||"";var C="["===this.hostname[0]&&"]"===this.hostname[this.hostname.length-1];if(!C){var A=this.hostname.split(/\./);for(t=0,n=A.length;t<n;t++){var w=A[t];if(w&&!w.match(d)){for(var D="",q=0,E=w.length;q<E;q++)D+=w.charCodeAt(q)>127?"x":w[q];if(!D.match(d)){var S=A.slice(0,t),F=A.slice(t+1),z=w.match(m);z&&(S.push(z[1]),F.unshift(z[2])),F.length&&(l=F.join(".")+l),this.hostname=S.join(".");break}}}}this.hostname.length>f&&(this.hostname=""),C&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var L=l.indexOf("#");L!==-1&&(this.hash=l.substr(L),l=l.slice(0,L));var T=l.indexOf("?");return T!==-1&&(this.search=l.substr(T),l=l.slice(0,T)),l&&(this.pathname=l),g[s]&&this.hostname&&!this.pathname&&(this.pathname=""),this},n.prototype.parseHost=function(e){var r=i.exec(e);r&&(r=r[0],":"!==r&&(this.port=r.substr(1)),e=e.substr(0,e.length-r.length)),e&&(this.hostname=e)},r.exports=s},{}],60:[function(r,t,n){(function(r){!function(s){function o(e){throw new RangeError(R[e])}function i(e,r){for(var t=e.length,n=[];t--;)n[t]=r(e[t]);return n}function a(e,r){var t=e.split("@"),n="";t.length>1&&(n=t[0]+"@",e=t[1]),e=e.replace(T,".");var s=e.split("."),o=i(s,r).join(".");return n+o}function c(e){for(var r,t
|
||
|
|
||
|
/*global require*/
|
||
|
define('Core/KnockoutMarkdownBinding',[
|
||
|
'markdown-it-sanitizer',
|
||
|
'markdown-it'
|
||
|
], function (
|
||
|
MarkdownItSanitizer,
|
||
|
MarkdownIt) {
|
||
|
'use strict';
|
||
|
|
||
|
var htmlTagRegex = /<html(.|\s)*>(.|\s)*<\/html>/im;
|
||
|
|
||
|
var md = new MarkdownIt({
|
||
|
html: true,
|
||
|
linkify: true
|
||
|
});
|
||
|
|
||
|
md.use(MarkdownItSanitizer, {
|
||
|
imageClass: '',
|
||
|
removeUnbalanced: false,
|
||
|
removeUnknown: false
|
||
|
});
|
||
|
|
||
|
var KnockoutMarkdownBinding = {
|
||
|
register: function (Knockout) {
|
||
|
Knockout.bindingHandlers.markdown = {
|
||
|
'init': function () {
|
||
|
// Prevent binding on the dynamically-injected HTML (as developers are unlikely to expect that, and it has security implications)
|
||
|
return { 'controlsDescendantBindings': true };
|
||
|
},
|
||
|
'update': function (element, valueAccessor) {
|
||
|
// Remove existing children of this element.
|
||
|
while (element.firstChild) {
|
||
|
Knockout.removeNode(element.firstChild);
|
||
|
}
|
||
|
|
||
|
var rawText = Knockout.unwrap(valueAccessor());
|
||
|
|
||
|
// If the text contains an <html> tag, don't try to interpret it as Markdown because
|
||
|
// we'll probably break it in the process.
|
||
|
var html;
|
||
|
if (htmlTagRegex.test(rawText)) {
|
||
|
html = rawText;
|
||
|
} else {
|
||
|
html = md.render(rawText);
|
||
|
}
|
||
|
|
||
|
var nodes = Knockout.utils.parseHtmlFragment(html, element);
|
||
|
element.className = element.className + ' markdown';
|
||
|
|
||
|
for (var i = 0; i < nodes.length; ++i) {
|
||
|
var node = nodes[i];
|
||
|
setAnchorTargets(node);
|
||
|
element.appendChild(node);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function setAnchorTargets(element) {
|
||
|
if (element instanceof HTMLAnchorElement) {
|
||
|
element.target = '_blank';
|
||
|
}
|
||
|
|
||
|
if (element.childNodes && element.childNodes.length > 0) {
|
||
|
for (var i = 0; i < element.childNodes.length; ++i) {
|
||
|
setAnchorTargets(element.childNodes[i]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return KnockoutMarkdownBinding;
|
||
|
});
|
||
|
|
||
|
|
||
|
/*! Hammer.JS - v2.0.7 - 2016-04-22
|
||
|
* http://hammerjs.github.io/
|
||
|
*
|
||
|
* Copyright (c) 2016 Jorik Tangelder;
|
||
|
* Licensed under the MIT license */
|
||
|
!function(a,b,c,d){"use strict";function e(a,b,c){return setTimeout(j(a,c),b)}function f(a,b,c){return Array.isArray(a)?(g(a,c[b],c),!0):!1}function g(a,b,c){var e;if(a)if(a.forEach)a.forEach(b,c);else if(a.length!==d)for(e=0;e<a.length;)b.call(c,a[e],e,a),e++;else for(e in a)a.hasOwnProperty(e)&&b.call(c,a[e],e,a)}function h(b,c,d){var e="DEPRECATED METHOD: "+c+"\n"+d+" AT \n";return function(){var c=new Error("get-stack-trace"),d=c&&c.stack?c.stack.replace(/^[^\(]+?[\n$]/gm,"").replace(/^\s+at\s+/gm,"").replace(/^Object.<anonymous>\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",f=a.console&&(a.console.warn||a.console.log);return f&&f.call(a.console,e,d),b.apply(this,arguments)}}function i(a,b,c){var d,e=b.prototype;d=a.prototype=Object.create(e),d.constructor=a,d._super=e,c&&la(d,c)}function j(a,b){return function(){return a.apply(b,arguments)}}function k(a,b){return typeof a==oa?a.apply(b?b[0]||d:d,b):a}function l(a,b){return a===d?b:a}function m(a,b,c){g(q(b),function(b){a.addEventListener(b,c,!1)})}function n(a,b,c){g(q(b),function(b){a.removeEventListener(b,c,!1)})}function o(a,b){for(;a;){if(a==b)return!0;a=a.parentNode}return!1}function p(a,b){return a.indexOf(b)>-1}function q(a){return a.trim().split(/\s+/g)}function r(a,b,c){if(a.indexOf&&!c)return a.indexOf(b);for(var d=0;d<a.length;){if(c&&a[d][c]==b||!c&&a[d]===b)return d;d++}return-1}function s(a){return Array.prototype.slice.call(a,0)}function t(a,b,c){for(var d=[],e=[],f=0;f<a.length;){var g=b?a[f][b]:a[f];r(e,g)<0&&d.push(a[f]),e[f]=g,f++}return c&&(d=b?d.sort(function(a,c){return a[b]>c[b]}):d.sort()),d}function u(a,b){for(var c,e,f=b[0].toUpperCase()+b.slice(1),g=0;g<ma.length;){if(c=ma[g],e=c?c+f:b,e in a)return e;g++}return d}function v(){return ua++}function w(b){var c=b.ownerDocument||b;return c.defaultView||c.parentWindow||a}function x(a,b){var c=this;this.manager=a,this.callback=b,this.element=a.element,this.target=a.options.inputTarget,this.domHandler=function(b){k(a.options.enable,[a])&&c.handler(b)},this.init()}function y(a){var b,c=a.options.inputClass;return new(b=c?c:xa?M:ya?P:wa?R:L)(a,z)}function z(a,b,c){var d=c.pointers.length,e=c.changedPointers.length,f=b&Ea&&d-e===0,g=b&(Ga|Ha)&&d-e===0;c.isFirst=!!f,c.isFinal=!!g,f&&(a.session={}),c.eventType=b,A(a,c),a.emit("hammer.input",c),a.recognize(c),a.session.prevInput=c}function A(a,b){var c=a.session,d=b.pointers,e=d.length;c.firstInput||(c.firstInput=D(b)),e>1&&!c.firstMultiple?c.firstMultiple=D(b):1===e&&(c.firstMultiple=!1);var f=c.firstInput,g=c.firstMultiple,h=g?g.center:f.center,i=b.center=E(d);b.timeStamp=ra(),b.deltaTime=b.timeStamp-f.timeStamp,b.angle=I(h,i),b.distance=H(h,i),B(c,b),b.offsetDirection=G(b.deltaX,b.deltaY);var j=F(b.deltaTime,b.deltaX,b.deltaY);b.overallVelocityX=j.x,b.overallVelocityY=j.y,b.overallVelocity=qa(j.x)>qa(j.y)?j.x:j.y,b.scale=g?K(g.pointers,d):1,b.rotation=g?J(g.pointers,d):0,b.maxPointers=c.prevInput?b.pointers.length>c.prevInput.maxPointers?b.pointers.length:c.prevInput.maxPointers:b.pointers.length,C(c,b);var k=a.element;o(b.srcEvent.target,k)&&(k=b.srcEvent.target),b.target=k}function B(a,b){var c=b.center,d=a.offsetDelta||{},e=a.prevDelta||{},f=a.prevInput||{};b.eventType!==Ea&&f.eventType!==Ga||(e=a.prevDelta={x:f.deltaX||0,y:f.deltaY||0},d=a.offsetDelta={x:c.x,y:c.y}),b.deltaX=e.x+(c.x-d.x),b.deltaY=e.y+(c.y-d.y)}function C(a,b){var c,e,f,g,h=a.lastInterval||b,i=b.timeStamp-h.timeStamp;if(b.eventType!=Ha&&(i>Da||h.velocity===d)){var j=b.deltaX-h.deltaX,k=b.deltaY-h.deltaY,l=F(i,j,k);e=l.x,f=l.y,c=qa(l.x)>qa(l.y)?l.x:l.y,g=G(j,k),a.lastInterval=b}else c=h.velocity,e=h.velocityX,f=h.velocityY,g=h.direction;b.velocity=c,b.velocityX=e,b.velocityY=f,b.direction=g}function D(a){for(var b=[],c=0;c<a.pointers.length;)b[c]={clientX:pa(a.pointers[c].clientX),clientY:pa(a.pointers[c].clientY)},c++;return{timeStamp:ra(),pointers:b,center:E(b),deltaX:a.deltaX,deltaY:a.deltaY}}function E(a){var b=a.length;if(1===b)return{x:pa(a[0].clientX),y:pa(a[0].clientY)};for(var c=0,d=0,e=0;b>e;)c+=a[e].clientX,d+=a[e].clientY,e++;return{x:pa(c/b),y:pa(d/b)}}function F(
|
||
|
//# sourceMappingURL=hammer.min.js.map;
|
||
|
/*global require*/
|
||
|
define('Core/KnockoutHammerBinding',[
|
||
|
'KnockoutES5',
|
||
|
'Hammer'
|
||
|
], function (Knockout, Hammer) {
|
||
|
'use strict';
|
||
|
|
||
|
var KnockoutHammerBinding = {
|
||
|
register: function (Knockout) {
|
||
|
Knockout.bindingHandlers.swipeLeft = {
|
||
|
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||
|
var f = Knockout.unwrap(valueAccessor());
|
||
|
new Hammer(element).on('swipeleft', function (e) {
|
||
|
var viewModel = bindingContext.$data;
|
||
|
f.apply(viewModel, arguments);
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
Knockout.bindingHandlers.swipeRight = {
|
||
|
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||
|
var f = Knockout.unwrap(valueAccessor());
|
||
|
new Hammer(element).on('swiperight', function (e) {
|
||
|
var viewModel = bindingContext.$data;
|
||
|
f.apply(viewModel, arguments);
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
};
|
||
|
|
||
|
return KnockoutHammerBinding;
|
||
|
});
|
||
|
|
||
|
/*global require*/
|
||
|
define('Core/registerKnockoutBindings',[
|
||
|
'Cesium/Widgets/SvgPathBindingHandler',
|
||
|
'KnockoutES5',
|
||
|
'Core/KnockoutMarkdownBinding',
|
||
|
'Core/KnockoutHammerBinding'
|
||
|
], function (
|
||
|
SvgPathBindingHandler,
|
||
|
Knockout,
|
||
|
KnockoutMarkdownBinding,
|
||
|
KnockoutHammerBinding) {
|
||
|
'use strict';
|
||
|
|
||
|
var registerKnockoutBindings = function () {
|
||
|
SvgPathBindingHandler.register(Knockout);
|
||
|
KnockoutMarkdownBinding.register(Knockout);
|
||
|
KnockoutHammerBinding.register(Knockout);
|
||
|
|
||
|
Knockout.bindingHandlers.embeddedComponent = {
|
||
|
init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||
|
var component = Knockout.unwrap(valueAccessor());
|
||
|
component.show(element);
|
||
|
return { controlsDescendantBindings: true };
|
||
|
},
|
||
|
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
|
||
|
}
|
||
|
};
|
||
|
};
|
||
|
|
||
|
return registerKnockoutBindings;
|
||
|
});
|
||
|
|
||
|
|
||
|
/*global define*/
|
||
|
define('Core/createFragmentFromTemplate',[
|
||
|
], function () {
|
||
|
'use strict';
|
||
|
|
||
|
var createFragmentFromTemplate = function (htmlString) {
|
||
|
var holder = document.createElement('div');
|
||
|
holder.innerHTML = htmlString;
|
||
|
|
||
|
var fragment = document.createDocumentFragment();
|
||
|
while (holder.firstChild) {
|
||
|
fragment.appendChild(holder.firstChild);
|
||
|
}
|
||
|
|
||
|
return fragment;
|
||
|
};
|
||
|
|
||
|
return createFragmentFromTemplate;
|
||
|
});
|
||
|
|
||
|
|
||
|
/*global require*/
|
||
|
define('Core/loadView',[
|
||
|
'Cesium/Widgets/getElement',
|
||
|
'KnockoutES5',
|
||
|
'Core/createFragmentFromTemplate'
|
||
|
], function (
|
||
|
getElement,
|
||
|
Knockout,
|
||
|
createFragmentFromTemplate) {
|
||
|
'use strict';
|
||
|
|
||
|
var loadView = function (htmlString, container, viewModel) {
|
||
|
container = getElement(container);
|
||
|
|
||
|
var fragment = createFragmentFromTemplate(htmlString);
|
||
|
|
||
|
// Sadly, fragment.childNodes doesn't have a slice function.
|
||
|
// This code could be replaced with Array.prototype.slice.call(fragment.childNodes)
|
||
|
// but that seems slightly error prone.
|
||
|
var nodes = [];
|
||
|
|
||
|
var i;
|
||
|
for (i = 0; i < fragment.childNodes.length; ++i) {
|
||
|
nodes.push(fragment.childNodes[i]);
|
||
|
}
|
||
|
|
||
|
container.appendChild(fragment);
|
||
|
|
||
|
for (i = 0; i < nodes.length; ++i) {
|
||
|
var node = nodes[i];
|
||
|
if (node.nodeType === 1 || node.nodeType === 8) {
|
||
|
Knockout.applyBindings(viewModel, node);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nodes;
|
||
|
};
|
||
|
|
||
|
return loadView;
|
||
|
});
|
||
|
/*
|
||
|
Leaflet, a JavaScript library for mobile-friendly interactive maps. http://leafletjs.com
|
||
|
(c) 2010-2013, Vladimir Agafonkin
|
||
|
(c) 2010-2011, CloudMade
|
||
|
*/
|
||
|
!function(t,e,i){var n=t.L,o={};o.version="0.7.7","object"==typeof module&&"object"==typeof module.exports?module.exports=o:"function"==typeof define&&define.amd&&define('leaflet',o),o.noConflict=function(){return t.L=n,this},t.L=o,o.Util={extend:function(t){var e,i,n,o,s=Array.prototype.slice.call(arguments,1);for(i=0,n=s.length;n>i;i++){o=s[i]||{};for(e in o)o.hasOwnProperty(e)&&(t[e]=o[e])}return t},bind:function(t,e){var i=arguments.length>2?Array.prototype.slice.call(arguments,2):null;return function(){return t.apply(e,i||arguments)}},stamp:function(){var t=0,e="_leaflet_id";return function(i){return i[e]=i[e]||++t,i[e]}}(),invokeEach:function(t,e,i){var n,o;if("object"==typeof t){o=Array.prototype.slice.call(arguments,3);for(n in t)e.apply(i,[n,t[n]].concat(o));return!0}return!1},limitExecByInterval:function(t,e,i){var n,o;return function s(){var a=arguments;return n?void(o=!0):(n=!0,setTimeout(function(){n=!1,o&&(s.apply(i,a),o=!1)},e),void t.apply(i,a))}},falseFn:function(){return!1},formatNum:function(t,e){var i=Math.pow(10,e||5);return Math.round(t*i)/i},trim:function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")},splitWords:function(t){return o.Util.trim(t).split(/\s+/)},setOptions:function(t,e){return t.options=o.extend({},t.options,e),t.options},getParamString:function(t,e,i){var n=[];for(var o in t)n.push(encodeURIComponent(i?o.toUpperCase():o)+"="+encodeURIComponent(t[o]));return(e&&-1!==e.indexOf("?")?"&":"?")+n.join("&")},template:function(t,e){return t.replace(/\{ *([\w_]+) *\}/g,function(t,n){var o=e[n];if(o===i)throw new Error("No value provided for variable "+t);return"function"==typeof o&&(o=o(e)),o})},isArray:Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)},emptyImageUrl:"data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="},function(){function e(e){var i,n,o=["webkit","moz","o","ms"];for(i=0;i<o.length&&!n;i++)n=t[o[i]+e];return n}function i(e){var i=+new Date,o=Math.max(0,16-(i-n));return n=i+o,t.setTimeout(e,o)}var n=0,s=t.requestAnimationFrame||e("RequestAnimationFrame")||i,a=t.cancelAnimationFrame||e("CancelAnimationFrame")||e("CancelRequestAnimationFrame")||function(e){t.clearTimeout(e)};o.Util.requestAnimFrame=function(e,n,a,r){return e=o.bind(e,n),a&&s===i?void e():s.call(t,e,r)},o.Util.cancelAnimFrame=function(e){e&&a.call(t,e)}}(),o.extend=o.Util.extend,o.bind=o.Util.bind,o.stamp=o.Util.stamp,o.setOptions=o.Util.setOptions,o.Class=function(){},o.Class.extend=function(t){var e=function(){this.initialize&&this.initialize.apply(this,arguments),this._initHooks&&this.callInitHooks()},i=function(){};i.prototype=this.prototype;var n=new i;n.constructor=e,e.prototype=n;for(var s in this)this.hasOwnProperty(s)&&"prototype"!==s&&(e[s]=this[s]);t.statics&&(o.extend(e,t.statics),delete t.statics),t.includes&&(o.Util.extend.apply(null,[n].concat(t.includes)),delete t.includes),t.options&&n.options&&(t.options=o.extend({},n.options,t.options)),o.extend(n,t),n._initHooks=[];var a=this;return e.__super__=a.prototype,n.callInitHooks=function(){if(!this._initHooksCalled){a.prototype.callInitHooks&&a.prototype.callInitHooks.call(this),this._initHooksCalled=!0;for(var t=0,e=n._initHooks.length;e>t;t++)n._initHooks[t].call(this)}},e},o.Class.include=function(t){o.extend(this.prototype,t)},o.Class.mergeOptions=function(t){o.extend(this.prototype.options,t)},o.Class.addInitHook=function(t){var e=Array.prototype.slice.call(arguments,1),i="function"==typeof t?t:function(){this[t].apply(this,e)};this.prototype._initHooks=this.prototype._initHooks||[],this.prototype._initHooks.push(i)};var s="_leaflet_events";o.Mixin={},o.Mixin.Events={addEventListener:function(t,e,i){if(o.Util.invokeEach(t,this.addEventListener,this,e,i))return this;var n,a,r,h,l,u,c,d=this[s]=this[s]||{},p=i&&i!==this&&o.stamp(i);for(t=o.Util.splitWords(t),n=0,a=t.length;a>n;n++)r={action:e,context:i||this},h=t[n],p?(l=h+"_idx",u=l+"_len",c=d[l]=d[l]||{},c[p]||(c[p]=[],d[u]=(d[u]||0)+1),c[p].push(r)):(d[h]=d[h]||[],d[h].push(r));return this},hasEventListeners:function(t){var e=this[s];return!!e
|
||
|
transformation:function(){var t=o.Projection.Mercator,e=t.R_MAJOR,i=.5/(Math.PI*e);return new o.Transformation(i,.5,-i,.5)}()}),o.TileLayer=o.Class.extend({includes:o.Mixin.Events,options:{minZoom:0,maxZoom:18,tileSize:256,subdomains:"abc",errorTileUrl:"",attribution:"",zoomOffset:0,opacity:1,unloadInvisibleTiles:o.Browser.mobile,updateWhenIdle:o.Browser.mobile},initialize:function(t,e){e=o.setOptions(this,e),e.detectRetina&&o.Browser.retina&&e.maxZoom>0&&(e.tileSize=Math.floor(e.tileSize/2),e.zoomOffset++,e.minZoom>0&&e.minZoom--,this.options.maxZoom--),e.bounds&&(e.bounds=o.latLngBounds(e.bounds)),this._url=t;var i=this.options.subdomains;"string"==typeof i&&(this.options.subdomains=i.split(""))},onAdd:function(t){this._map=t,this._animated=t._zoomAnimated,this._initContainer(),t.on({viewreset:this._reset,moveend:this._update},this),this._animated&&t.on({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||(this._limitedUpdate=o.Util.limitExecByInterval(this._update,150,this),t.on("move",this._limitedUpdate,this)),this._reset(),this._update()},addTo:function(t){return t.addLayer(this),this},onRemove:function(t){this._container.parentNode.removeChild(this._container),t.off({viewreset:this._reset,moveend:this._update},this),this._animated&&t.off({zoomanim:this._animateZoom,zoomend:this._endZoomAnim},this),this.options.updateWhenIdle||t.off("move",this._limitedUpdate,this),this._container=null,this._map=null},bringToFront:function(){var t=this._map._panes.tilePane;return this._container&&(t.appendChild(this._container),this._setAutoZIndex(t,Math.max)),this},bringToBack:function(){var t=this._map._panes.tilePane;return this._container&&(t.insertBefore(this._container,t.firstChild),this._setAutoZIndex(t,Math.min)),this},getAttribution:function(){return this.options.attribution},getContainer:function(){return this._container},setOpacity:function(t){return this.options.opacity=t,this._map&&this._updateOpacity(),this},setZIndex:function(t){return this.options.zIndex=t,this._updateZIndex(),this},setUrl:function(t,e){return this._url=t,e||this.redraw(),this},redraw:function(){return this._map&&(this._reset({hard:!0}),this._update()),this},_updateZIndex:function(){this._container&&this.options.zIndex!==i&&(this._container.style.zIndex=this.options.zIndex)},_setAutoZIndex:function(t,e){var i,n,o,s=t.children,a=-e(1/0,-(1/0));for(n=0,o=s.length;o>n;n++)s[n]!==this._container&&(i=parseInt(s[n].style.zIndex,10),isNaN(i)||(a=e(a,i)));this.options.zIndex=this._container.style.zIndex=(isFinite(a)?a:0)+e(1,-1)},_updateOpacity:function(){var t,e=this._tiles;if(o.Browser.ielt9)for(t in e)o.DomUtil.setOpacity(e[t],this.options.opacity);else o.DomUtil.setOpacity(this._container,this.options.opacity)},_initContainer:function(){var t=this._map._panes.tilePane;if(!this._container){if(this._container=o.DomUtil.create("div","leaflet-layer"),this._updateZIndex(),this._animated){var e="leaflet-tile-container";this._bgBuffer=o.DomUtil.create("div",e,this._container),this._tileContainer=o.DomUtil.create("div",e,this._container)}else this._tileContainer=this._container;t.appendChild(this._container),this.options.opacity<1&&this._updateOpacity()}},_reset:function(t){for(var e in this._tiles)this.fire("tileunload",{tile:this._tiles[e]});this._tiles={},this._tilesToLoad=0,this.options.reuseTiles&&(this._unusedTiles=[]),this._tileContainer.innerHTML="",this._animated&&t&&t.hard&&this._clearBgBuffer(),this._initContainer()},_getTileSize:function(){var t=this._map,e=t.getZoom()+this.options.zoomOffset,i=this.options.maxNativeZoom,n=this.options.tileSize;return i&&e>i&&(n=Math.round(t.getZoomScale(e)/t.getZoomScale(i)*n)),n},_update:function(){if(this._map){var t=this._map,e=t.getPixelBounds(),i=t.getZoom(),n=this._getTileSize();if(!(i>this.options.maxZoom||i<this.options.minZoom)){var s=o.bounds(e.min.divideBy(n)._floor(),e.max.divideBy(n)._floor());this._addTilesFromCenterOut(s),(this.options.unloadInvisibleTiles||this.options.reuseTiles)&&this._removeOtherTiles(s)}}},_addTilesFromCenterOut:function(t){var i,n,s,a=[],r=
|
||
|
this.on({zoomanim:this._animatePathZoom,zoomend:this._endPathZoom})):o.DomUtil.addClass(this._pathRoot,"leaflet-zoom-hide"),this.on("moveend",this._updateSvgViewport),this._updateSvgViewport())},_animatePathZoom:function(t){var e=this.getZoomScale(t.zoom),i=this._getCenterOffset(t.center)._multiplyBy(-e)._add(this._pathViewport.min);this._pathRoot.style[o.DomUtil.TRANSFORM]=o.DomUtil.getTranslateString(i)+" scale("+e+") ",this._pathZooming=!0},_endPathZoom:function(){this._pathZooming=!1},_updateSvgViewport:function(){if(!this._pathZooming){this._updatePathViewport();var t=this._pathViewport,e=t.min,i=t.max,n=i.x-e.x,s=i.y-e.y,a=this._pathRoot,r=this._panes.overlayPane;o.Browser.mobileWebkit&&r.removeChild(a),o.DomUtil.setPosition(a,e),a.setAttribute("width",n),a.setAttribute("height",s),a.setAttribute("viewBox",[e.x,e.y,n,s].join(" ")),o.Browser.mobileWebkit&&r.appendChild(a)}}}),o.Path.include({bindPopup:function(t,e){return t instanceof o.Popup?this._popup=t:((!this._popup||e)&&(this._popup=new o.Popup(e,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on("click",this._openPopup,this).on("remove",this.closePopup,this),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this._popup=null,this.off("click",this._openPopup).off("remove",this.closePopup),this._popupHandlersAdded=!1),this},openPopup:function(t){return this._popup&&(t=t||this._latlng||this._latlngs[Math.floor(this._latlngs.length/2)],this._openPopup({latlng:t})),this},closePopup:function(){return this._popup&&this._popup._close(),this},_openPopup:function(t){this._popup.setLatLng(t.latlng),this._map.openPopup(this._popup)}}),o.Browser.vml=!o.Browser.svg&&function(){try{var t=e.createElement("div");t.innerHTML='<v:shape adj="1"/>';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(n){return!1}}(),o.Path=o.Browser.svg||!o.Browser.vml?o.Path:o.Path.extend({statics:{VML:!0,CLIP_PADDING:.02},_createElement:function(){try{return e.namespaces.add("lvml","urn:schemas-microsoft-com:vml"),function(t){return e.createElement("<lvml:"+t+' class="lvml">')}}catch(t){return function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_initPath:function(){var t=this._container=this._createElement("shape");o.DomUtil.addClass(t,"leaflet-vml-shape"+(this.options.className?" "+this.options.className:"")),this.options.clickable&&o.DomUtil.addClass(t,"leaflet-clickable"),t.coordsize="1 1",this._path=this._createElement("path"),t.appendChild(this._path),this._map._pathRoot.appendChild(t)},_initStyle:function(){this._updateStyle()},_updateStyle:function(){var t=this._stroke,e=this._fill,i=this.options,n=this._container;n.stroked=i.stroke,n.filled=i.fill,i.stroke?(t||(t=this._stroke=this._createElement("stroke"),t.endcap="round",n.appendChild(t)),t.weight=i.weight+"px",t.color=i.color,t.opacity=i.opacity,i.dashArray?t.dashStyle=o.Util.isArray(i.dashArray)?i.dashArray.join(" "):i.dashArray.replace(/( *, *)/g," "):t.dashStyle="",i.lineCap&&(t.endcap=i.lineCap.replace("butt","flat")),i.lineJoin&&(t.joinstyle=i.lineJoin)):t&&(n.removeChild(t),this._stroke=null),i.fill?(e||(e=this._fill=this._createElement("fill"),n.appendChild(e)),e.color=i.fillColor||i.color,e.opacity=i.fillOpacity):e&&(n.removeChild(e),this._fill=null)},_updatePath:function(){var t=this._container.style;t.display="none",this._path.v=this.getPathString()+" ",t.display=""}}),o.Map.include(o.Browser.svg||!o.Browser.vml?{}:{_initPathRoot:function(){if(!this._pathRoot){var t=this._pathRoot=e.createElement("div");t.className="leaflet-vml-container",this._panes.overlayPane.appendChild(t),this.on("moveend",this._updatePathViewport),this._updatePathViewport()}}}),o.Browser.canvas=function(){return!!e.createElement("canvas").getContext}(),o.Path=o.Path.SVG&&!t.L_PREFER_CANVAS||!o.Browser.canvas?o.Path:o.Path.extend({statics:{CANVAS:!0,SVG:!1},redraw:function(){return this._map&&(this.projectLatlngs(),this._requestUpdate()),this},setStyle:function(t){return o.setOptions(this,t),this._map&&(this._updateS
|
||
|
case"touchend":return this.addPointerListenerEnd(t,e,i,n);case"touchmove":return this.addPointerListenerMove(t,e,i,n);default:throw"Unknown touch event type"}},addPointerListenerStart:function(t,i,n,s){var a="_leaflet_",r=this._pointers,h=function(t){"mouse"!==t.pointerType&&t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&o.DomEvent.preventDefault(t);for(var e=!1,i=0;i<r.length;i++)if(r[i].pointerId===t.pointerId){e=!0;break}e||r.push(t),t.touches=r.slice(),t.changedTouches=[t],n(t)};if(t[a+"touchstart"+s]=h,t.addEventListener(this.POINTER_DOWN,h,!1),!this._pointerDocumentListener){var l=function(t){for(var e=0;e<r.length;e++)if(r[e].pointerId===t.pointerId){r.splice(e,1);break}};e.documentElement.addEventListener(this.POINTER_UP,l,!1),e.documentElement.addEventListener(this.POINTER_CANCEL,l,!1),this._pointerDocumentListener=!0}return this},addPointerListenerMove:function(t,e,i,n){function o(t){if(t.pointerType!==t.MSPOINTER_TYPE_MOUSE&&"mouse"!==t.pointerType||0!==t.buttons){for(var e=0;e<a.length;e++)if(a[e].pointerId===t.pointerId){a[e]=t;break}t.touches=a.slice(),t.changedTouches=[t],i(t)}}var s="_leaflet_",a=this._pointers;return t[s+"touchmove"+n]=o,t.addEventListener(this.POINTER_MOVE,o,!1),this},addPointerListenerEnd:function(t,e,i,n){var o="_leaflet_",s=this._pointers,a=function(t){for(var e=0;e<s.length;e++)if(s[e].pointerId===t.pointerId){s.splice(e,1);break}t.touches=s.slice(),t.changedTouches=[t],i(t)};return t[o+"touchend"+n]=a,t.addEventListener(this.POINTER_UP,a,!1),t.addEventListener(this.POINTER_CANCEL,a,!1),this},removePointerListener:function(t,e,i){var n="_leaflet_",o=t[n+e+i];switch(e){case"touchstart":t.removeEventListener(this.POINTER_DOWN,o,!1);break;case"touchmove":t.removeEventListener(this.POINTER_MOVE,o,!1);break;case"touchend":t.removeEventListener(this.POINTER_UP,o,!1),t.removeEventListener(this.POINTER_CANCEL,o,!1)}return this}}),o.Map.mergeOptions({touchZoom:o.Browser.touch&&!o.Browser.android23,bounceAtZoomLimits:!0}),o.Map.TouchZoom=o.Handler.extend({addHooks:function(){o.DomEvent.on(this._map._container,"touchstart",this._onTouchStart,this)},removeHooks:function(){o.DomEvent.off(this._map._container,"touchstart",this._onTouchStart,this)},_onTouchStart:function(t){var i=this._map;if(t.touches&&2===t.touches.length&&!i._animatingZoom&&!this._zooming){var n=i.mouseEventToLayerPoint(t.touches[0]),s=i.mouseEventToLayerPoint(t.touches[1]),a=i._getCenterLayerPoint();this._startCenter=n.add(s)._divideBy(2),this._startDist=n.distanceTo(s),this._moved=!1,this._zooming=!0,this._centerOffset=a.subtract(this._startCenter),i._panAnim&&i._panAnim.stop(),o.DomEvent.on(e,"touchmove",this._onTouchMove,this).on(e,"touchend",this._onTouchEnd,this),o.DomEvent.preventDefault(t)}},_onTouchMove:function(t){var e=this._map;if(t.touches&&2===t.touches.length&&this._zooming){var i=e.mouseEventToLayerPoint(t.touches[0]),n=e.mouseEventToLayerPoint(t.touches[1]);this._scale=i.distanceTo(n)/this._startDist,this._delta=i._add(n)._divideBy(2)._subtract(this._startCenter),1!==this._scale&&(e.options.bounceAtZoomLimits||!(e.getZoom()===e.getMinZoom()&&this._scale<1||e.getZoom()===e.getMaxZoom()&&this._scale>1))&&(this._moved||(o.DomUtil.addClass(e._mapPane,"leaflet-touching"),e.fire("movestart").fire("zoomstart"),this._moved=!0),o.Util.cancelAnimFrame(this._animRequest),this._animRequest=o.Util.requestAnimFrame(this._updateOnMove,this,!0,this._map._container),o.DomEvent.preventDefault(t))}},_updateOnMove:function(){var t=this._map,e=this._getScaleOrigin(),i=t.layerPointToLatLng(e),n=t.getScaleZoom(this._scale);t._animateZoom(i,n,this._startCenter,this._scale,this._delta,!1,!0)},_onTouchEnd:function(){if(!this._moved||!this._zooming)return void(this._zooming=!1);var t=this._map;this._zooming=!1,o.DomUtil.removeClass(t._mapPane,"leaflet-touching"),o.Util.cancelAnimFrame(this._animRequest),o.DomEvent.off(e,"touchmove",this._onTouchMove).off(e,"touchend",this._onTouchEnd);var i=this._getScaleOrigin(),n=t.layerPointToLatLng(i),s=t.getZoom(),a=t.getScaleZoom(this._scale)-s,r=a>0?Math.ceil(a):Math.floor(a),h=t._limitZoom(s+r),l=t.get
|
||
|
/*global define*/
|
||
|
define('ViewModels/DistanceLegendViewModel',[
|
||
|
'Cesium/Core/defined',
|
||
|
'Cesium/Core/DeveloperError',
|
||
|
'Cesium/Core/EllipsoidGeodesic',
|
||
|
'Cesium/Core/Cartesian2',
|
||
|
'Cesium/Core/getTimestamp',
|
||
|
'Cesium/Core/EventHelper',
|
||
|
'KnockoutES5',
|
||
|
'Core/loadView',
|
||
|
'leaflet'
|
||
|
], function (
|
||
|
defined,
|
||
|
DeveloperError,
|
||
|
EllipsoidGeodesic,
|
||
|
Cartesian2,
|
||
|
getTimestamp,
|
||
|
EventHelper,
|
||
|
Knockout,
|
||
|
loadView,
|
||
|
leaflet) {
|
||
|
'use strict';
|
||
|
|
||
|
var DistanceLegendViewModel = function (options) {
|
||
|
if (!defined(options) || !defined(options.terria)) {
|
||
|
throw new DeveloperError('options.terria is required.');
|
||
|
}
|
||
|
|
||
|
this.terria = options.terria;
|
||
|
this._removeSubscription = undefined;
|
||
|
this._lastLegendUpdate = undefined;
|
||
|
this.eventHelper = new EventHelper();
|
||
|
|
||
|
this.distanceLabel = undefined;
|
||
|
this.barWidth = undefined;
|
||
|
|
||
|
this.enableDistanceLegend = (defined(options.enableDistanceLegend))?options.enableDistanceLegend:true;
|
||
|
|
||
|
Knockout.track(this, ['distanceLabel', 'barWidth']);
|
||
|
|
||
|
this.eventHelper.add(this.terria.afterWidgetChanged, function () {
|
||
|
if (defined(this._removeSubscription)) {
|
||
|
this._removeSubscription();
|
||
|
this._removeSubscription = undefined;
|
||
|
}
|
||
|
}, this);
|
||
|
// this.terria.beforeWidgetChanged.addEventListener(function () {
|
||
|
// if (defined(this._removeSubscription)) {
|
||
|
// this._removeSubscription();
|
||
|
// this._removeSubscription = undefined;
|
||
|
// }
|
||
|
// }, this);
|
||
|
|
||
|
var that = this;
|
||
|
|
||
|
function addUpdateSubscription() {
|
||
|
if (defined(that.terria)) {
|
||
|
var scene = that.terria.scene;
|
||
|
that._removeSubscription = scene.postRender.addEventListener(function () {
|
||
|
updateDistanceLegendCesium(this, scene);
|
||
|
}, that);
|
||
|
} else if (defined(that.terria.leaflet)) {
|
||
|
var map = that.terria.leaflet.map;
|
||
|
|
||
|
var potentialChangeCallback = function potentialChangeCallback() {
|
||
|
updateDistanceLegendLeaflet(that, map);
|
||
|
};
|
||
|
|
||
|
that._removeSubscription = function () {
|
||
|
map.off('zoomend', potentialChangeCallback);
|
||
|
map.off('moveend', potentialChangeCallback);
|
||
|
};
|
||
|
|
||
|
map.on('zoomend', potentialChangeCallback);
|
||
|
map.on('moveend', potentialChangeCallback);
|
||
|
|
||
|
updateDistanceLegendLeaflet(that, map);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
addUpdateSubscription();
|
||
|
this.eventHelper.add(this.terria.afterWidgetChanged, function () {
|
||
|
addUpdateSubscription();
|
||
|
}, this);
|
||
|
//this.terria.afterWidgetChanged.addEventListener(function() {
|
||
|
// addUpdateSubscription();
|
||
|
// }, this);
|
||
|
};
|
||
|
|
||
|
|
||
|
DistanceLegendViewModel.prototype.destroy = function () {
|
||
|
|
||
|
this.eventHelper.removeAll();
|
||
|
};
|
||
|
|
||
|
DistanceLegendViewModel.prototype.show = function (container) {
|
||
|
var testing ;
|
||
|
if ( this.enableDistanceLegend)
|
||
|
{
|
||
|
testing = '<div class="distance-legend" data-bind="visible: distanceLabel && barWidth">' +
|
||
|
'<div class="distance-legend-label" data-bind="text: distanceLabel"></div>' +
|
||
|
'<div class="distance-legend-scale-bar" data-bind="style: { width: barWidth + \'px\', left: (5 + (125 - barWidth) / 2) + \'px\' }"></div>' +
|
||
|
'</div>';
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
testing = '<div class="distance-legend" style="display: none;" data-bind="visible: distanceLabel && barWidth">' +
|
||
|
'<div class="distance-legend-label" data-bind="text: distanceLabel"></div>' +
|
||
|
'<div class="distance-legend-scale-bar" data-bind="style: { width: barWidth + \'px\', left: (5 + (125 - barWidth) / 2) + \'px\' }"></div>' +
|
||
|
'</div>';
|
||
|
}
|
||
|
loadView(testing, container, this);
|
||
|
// loadView(distanceLegendTemplate, container, this);
|
||
|
//loadView(require('fs').readFileSync(__dirname + '/../Views/DistanceLegend.html', 'utf8'), container, this);
|
||
|
};
|
||
|
|
||
|
DistanceLegendViewModel.create = function (options) {
|
||
|
var result = new DistanceLegendViewModel(options);
|
||
|
result.show(options.container);
|
||
|
return result;
|
||
|
};
|
||
|
|
||
|
var geodesic = new EllipsoidGeodesic();
|
||
|
|
||
|
var distances = [
|
||
|
1, 2, 3, 5,
|
||
|
10, 20, 30, 50,
|
||
|
100, 200, 300, 500,
|
||
|
1000, 2000, 3000, 5000,
|
||
|
10000, 20000, 30000, 50000,
|
||
|
100000, 200000, 300000, 500000,
|
||
|
1000000, 2000000, 3000000, 5000000,
|
||
|
10000000, 20000000, 30000000, 50000000];
|
||
|
|
||
|
function updateDistanceLegendCesium(viewModel, scene) {
|
||
|
if (!viewModel.enableDistanceLegend)
|
||
|
{
|
||
|
viewModel.barWidth = undefined;
|
||
|
viewModel.distanceLabel = undefined;
|
||
|
return;
|
||
|
}
|
||
|
var now = getTimestamp();
|
||
|
if (now < viewModel._lastLegendUpdate + 250) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
viewModel._lastLegendUpdate = now;
|
||
|
|
||
|
// Find the distance between two pixels at the bottom center of the screen.
|
||
|
var width = scene.canvas.clientWidth;
|
||
|
var height = scene.canvas.clientHeight;
|
||
|
|
||
|
var left = scene.camera.getPickRay(new Cartesian2((width / 2) | 0, height - 1));
|
||
|
var right = scene.camera.getPickRay(new Cartesian2(1 + (width / 2) | 0, height - 1));
|
||
|
|
||
|
var globe = scene.globe;
|
||
|
var leftPosition = globe.pick(left, scene);
|
||
|
var rightPosition = globe.pick(right, scene);
|
||
|
|
||
|
if (!defined(leftPosition) || !defined(rightPosition)) {
|
||
|
viewModel.barWidth = undefined;
|
||
|
viewModel.distanceLabel = undefined;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var leftCartographic = globe.ellipsoid.cartesianToCartographic(leftPosition);
|
||
|
var rightCartographic = globe.ellipsoid.cartesianToCartographic(rightPosition);
|
||
|
|
||
|
geodesic.setEndPoints(leftCartographic, rightCartographic);
|
||
|
var pixelDistance = geodesic.surfaceDistance;
|
||
|
|
||
|
// Find the first distance that makes the scale bar less than 100 pixels.
|
||
|
var maxBarWidth = 100;
|
||
|
var distance;
|
||
|
for (var i = distances.length - 1; !defined(distance) && i >= 0; --i) {
|
||
|
if (distances[i] / pixelDistance < maxBarWidth) {
|
||
|
distance = distances[i];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (defined(distance)) {
|
||
|
var label;
|
||
|
if (distance >= 1000) {
|
||
|
label = (distance / 1000).toString() + ' km';
|
||
|
} else {
|
||
|
label = distance.toString() + ' m';
|
||
|
}
|
||
|
|
||
|
viewModel.barWidth = (distance / pixelDistance) | 0;
|
||
|
viewModel.distanceLabel = label;
|
||
|
} else {
|
||
|
viewModel.barWidth = undefined;
|
||
|
viewModel.distanceLabel = undefined;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function updateDistanceLegendLeaflet(viewModel, map) {
|
||
|
var halfHeight = map.getSize().y / 2;
|
||
|
var maxPixelWidth = 100;
|
||
|
var maxMeters = map.containerPointToLatLng([0, halfHeight]).distanceTo(
|
||
|
map.containerPointToLatLng([maxPixelWidth, halfHeight]));
|
||
|
|
||
|
var meters = leaflet.control.scale()._getRoundNum(maxMeters);
|
||
|
var label = meters < 1000 ? meters + ' m' : (meters / 1000) + ' km';
|
||
|
|
||
|
viewModel.barWidth = (meters / maxMeters) * maxPixelWidth;
|
||
|
viewModel.distanceLabel = label;
|
||
|
}
|
||
|
|
||
|
return DistanceLegendViewModel;
|
||
|
});
|
||
|
|
||
|
/*global require*/
|
||
|
define('ViewModels/UserInterfaceControl',[
|
||
|
'Cesium/Core/defined',
|
||
|
'Cesium/Core/defineProperties',
|
||
|
'Cesium/Core/DeveloperError',
|
||
|
'KnockoutES5'
|
||
|
], function (
|
||
|
defined,
|
||
|
defineProperties,
|
||
|
DeveloperError,
|
||
|
Knockout) {
|
||
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* The view-model for a control in the user interface
|
||
|
*
|
||
|
* @alias UserInterfaceControl
|
||
|
* @constructor
|
||
|
* @abstract
|
||
|
*
|
||
|
* @param {Terria} terria The Terria instance.
|
||
|
*/
|
||
|
var UserInterfaceControl = function (terria) {
|
||
|
|
||
|
if (!defined(terria)) {
|
||
|
throw new DeveloperError('terria is required');
|
||
|
}
|
||
|
|
||
|
this._terria = terria;
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the name of the control which is set as the controls title.
|
||
|
* This property is observable.
|
||
|
* @type {String}
|
||
|
*/
|
||
|
this.name = 'Unnamed Control';
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the text to be displayed in the UI control.
|
||
|
* This property is observable.
|
||
|
* @type {String}
|
||
|
*/
|
||
|
this.text = undefined;
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the svg icon of the control. This property is observable.
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
this.svgIcon = undefined;
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the height of the svg icon. This property is observable.
|
||
|
* @type {Integer}
|
||
|
*/
|
||
|
this.svgHeight = undefined;
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the width of the svg icon. This property is observable.
|
||
|
* @type {Integer}
|
||
|
*/
|
||
|
this.svgWidth = undefined;
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the CSS class of the control. This property is observable.
|
||
|
* @type {String}
|
||
|
*/
|
||
|
this.cssClass = undefined;
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the property describing whether or not the control is in the active state.
|
||
|
* This property is observable.
|
||
|
* @type {Boolean}
|
||
|
*/
|
||
|
this.isActive = false;
|
||
|
|
||
|
Knockout.track(this, ['name', 'svgIcon', 'svgHeight', 'svgWidth', 'cssClass', 'isActive']);
|
||
|
};
|
||
|
|
||
|
defineProperties(UserInterfaceControl.prototype, {
|
||
|
/**
|
||
|
* Gets the Terria instance.
|
||
|
* @memberOf UserInterfaceControl.prototype
|
||
|
* @type {Terria}
|
||
|
*/
|
||
|
terria: {
|
||
|
get: function () {
|
||
|
return this._terria;
|
||
|
}
|
||
|
},
|
||
|
/**
|
||
|
* Gets a value indicating whether this button has text associated with it.
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
hasText: {
|
||
|
get: function () {
|
||
|
return defined(this.text) && typeof this.text === 'string';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
});
|
||
|
|
||
|
/**
|
||
|
* When implemented in a derived class, performs an action when the user clicks
|
||
|
* on this control.
|
||
|
* @abstract
|
||
|
* @protected
|
||
|
*/
|
||
|
UserInterfaceControl.prototype.activate = function () {
|
||
|
throw new DeveloperError('activate must be implemented in the derived class.');
|
||
|
};
|
||
|
|
||
|
return UserInterfaceControl;
|
||
|
});
|
||
|
|
||
|
/*global require*/
|
||
|
define('ViewModels/NavigationControl',[
|
||
|
'ViewModels/UserInterfaceControl'
|
||
|
], function (
|
||
|
UserInterfaceControl) {
|
||
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* The view-model for a control in the navigation control tool bar
|
||
|
*
|
||
|
* @alias NavigationControl
|
||
|
* @constructor
|
||
|
* @abstract
|
||
|
*
|
||
|
* @param {Terria} terria The Terria instance.
|
||
|
*/
|
||
|
var NavigationControl = function (terria) {
|
||
|
UserInterfaceControl.apply(this, arguments);
|
||
|
};
|
||
|
|
||
|
NavigationControl.prototype = Object.create(UserInterfaceControl.prototype);
|
||
|
|
||
|
return NavigationControl;
|
||
|
});
|
||
|
|
||
|
/*global define*/
|
||
|
define('SvgPaths/svgReset',[
|
||
|
], function () {
|
||
|
'use strict';
|
||
|
|
||
|
return 'M 7.5,0 C 3.375,0 0,3.375 0,7.5 0,11.625 3.375,15 7.5,15 c 3.46875,0 6.375,-2.4375 7.21875,-5.625 l -1.96875,0 C 12,11.53125 9.9375,13.125 7.5,13.125 4.40625,13.125 1.875,10.59375 1.875,7.5 1.875,4.40625 4.40625,1.875 7.5,1.875 c 1.59375,0 2.90625,0.65625 3.9375,1.6875 l -3,3 6.5625,0 L 15,0 12.75,2.25 C 11.4375,0.84375 9.5625,0 7.5,0 z';
|
||
|
});
|
||
|
/*global require*/
|
||
|
define('ViewModels/ResetViewNavigationControl',[
|
||
|
'Cesium/Core/defined',
|
||
|
'Cesium/Scene/Camera',
|
||
|
'Cesium/Core/Rectangle',
|
||
|
'Cesium/Core/Cartographic',
|
||
|
'ViewModels/NavigationControl',
|
||
|
'SvgPaths/svgReset'
|
||
|
], function (
|
||
|
defined,
|
||
|
Camera,
|
||
|
Rectangle,
|
||
|
Cartographic,
|
||
|
NavigationControl,
|
||
|
svgReset) {
|
||
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* The model for a zoom in control in the navigation control tool bar
|
||
|
*
|
||
|
* @alias ResetViewNavigationControl
|
||
|
* @constructor
|
||
|
* @abstract
|
||
|
*
|
||
|
* @param {Terria} terria The Terria instance.
|
||
|
*/
|
||
|
var ResetViewNavigationControl = function (terria) {
|
||
|
NavigationControl.apply(this, arguments);
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the name of the control which is set as the control's title.
|
||
|
* This property is observable.
|
||
|
* @type {String}
|
||
|
*/
|
||
|
this.name = 'Reset View';
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the svg icon of the control. This property is observable.
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
this.svgIcon = svgReset;
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the height of the svg icon. This property is observable.
|
||
|
* @type {Integer}
|
||
|
*/
|
||
|
this.svgHeight = 15;
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the width of the svg icon. This property is observable.
|
||
|
* @type {Integer}
|
||
|
*/
|
||
|
this.svgWidth = 15;
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the CSS class of the control. This property is observable.
|
||
|
* @type {String}
|
||
|
*/
|
||
|
this.cssClass = "navigation-control-icon-reset";
|
||
|
|
||
|
};
|
||
|
|
||
|
ResetViewNavigationControl.prototype = Object.create(NavigationControl.prototype);
|
||
|
|
||
|
ResetViewNavigationControl.prototype.resetView = function () {
|
||
|
//this.terria.analytics.logEvent('navigation', 'click', 'reset');
|
||
|
|
||
|
var scene = this.terria.scene;
|
||
|
|
||
|
var sscc = scene.screenSpaceCameraController;
|
||
|
if (!sscc.enableInputs) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.isActive = true;
|
||
|
|
||
|
var camera = scene.camera;
|
||
|
|
||
|
if (defined(this.terria.trackedEntity)) {
|
||
|
// when tracking do not reset to default view but to default view of tracked entity
|
||
|
var trackedEntity = this.terria.trackedEntity;
|
||
|
this.terria.trackedEntity = undefined;
|
||
|
this.terria.trackedEntity = trackedEntity;
|
||
|
} else {
|
||
|
// reset to a default position or view defined in the options
|
||
|
if (this.terria.options.defaultResetView) {
|
||
|
if (this.terria.options.defaultResetView && this.terria.options.defaultResetView instanceof Cartographic) {
|
||
|
camera.flyTo({
|
||
|
destination: scene.globe.ellipsoid.cartographicToCartesian(this.terria.options.defaultResetView)
|
||
|
});
|
||
|
} else if (this.terria.options.defaultResetView && this.terria.options.defaultResetView instanceof Rectangle) {
|
||
|
try {
|
||
|
Rectangle.validate(this.terria.options.defaultResetView);
|
||
|
camera.flyTo({
|
||
|
destination: this.terria.options.defaultResetView
|
||
|
});
|
||
|
} catch (e) {
|
||
|
console.log("Cesium-navigation/ResetViewNavigationControl: options.defaultResetView Cesium rectangle is invalid!");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else if (typeof camera.flyHome === "function") {
|
||
|
camera.flyHome(1);
|
||
|
} else {
|
||
|
camera.flyTo({'destination': Camera.DEFAULT_VIEW_RECTANGLE, 'duration': 1});
|
||
|
}
|
||
|
}
|
||
|
this.isActive = false;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* When implemented in a derived class, performs an action when the user clicks
|
||
|
* on this control
|
||
|
* @abstract
|
||
|
* @protected
|
||
|
*/
|
||
|
ResetViewNavigationControl.prototype.activate = function () {
|
||
|
this.resetView();
|
||
|
};
|
||
|
|
||
|
return ResetViewNavigationControl;
|
||
|
});
|
||
|
|
||
|
/*global require*/
|
||
|
define('Core/Utils',[
|
||
|
'Cesium/Core/defined',
|
||
|
'Cesium/Core/Ray',
|
||
|
'Cesium/Core/Cartesian3',
|
||
|
'Cesium/Core/Cartographic',
|
||
|
'Cesium/Core/ReferenceFrame',
|
||
|
'Cesium/Scene/SceneMode'
|
||
|
], function (
|
||
|
defined,
|
||
|
Ray,
|
||
|
Cartesian3,
|
||
|
Cartographic,
|
||
|
ReferenceFrame,
|
||
|
SceneMode) {
|
||
|
'use strict';
|
||
|
|
||
|
var Utils = {};
|
||
|
|
||
|
var unprojectedScratch = new Cartographic();
|
||
|
var rayScratch = new Ray();
|
||
|
|
||
|
/**
|
||
|
* gets the focus point of the camera
|
||
|
* @param {Viewer|Widget} terria The terria
|
||
|
* @param {boolean} inWorldCoordinates true to get the focus in world coordinates, otherwise get it in projection-specific map coordinates, in meters.
|
||
|
* @param {Cartesian3} [result] The object in which the result will be stored.
|
||
|
* @return {Cartesian3} The modified result parameter, a new instance if none was provided or undefined if there is no focus point.
|
||
|
*/
|
||
|
Utils.getCameraFocus = function (terria, inWorldCoordinates, result) {
|
||
|
var scene = terria.scene;
|
||
|
var camera = scene.camera;
|
||
|
|
||
|
if(scene.mode == SceneMode.MORPHING) {
|
||
|
return undefined;
|
||
|
}
|
||
|
|
||
|
if(!defined(result)) {
|
||
|
result = new Cartesian3();
|
||
|
}
|
||
|
|
||
|
// TODO bug when tracking: if entity moves the current position should be used and not only the one when starting orbiting/rotating
|
||
|
// TODO bug when tracking: reset should reset to default view of tracked entity
|
||
|
|
||
|
if(defined(terria.trackedEntity)) {
|
||
|
result = terria.trackedEntity.position.getValue(terria.clock.currentTime, result);
|
||
|
} else {
|
||
|
rayScratch.origin = camera.positionWC;
|
||
|
rayScratch.direction = camera.directionWC;
|
||
|
result = scene.globe.pick(rayScratch, scene, result);
|
||
|
}
|
||
|
|
||
|
if (!defined(result)) {
|
||
|
return undefined;
|
||
|
}
|
||
|
|
||
|
if(scene.mode == SceneMode.SCENE2D || scene.mode == SceneMode.COLUMBUS_VIEW) {
|
||
|
result = camera.worldToCameraCoordinatesPoint(result, result);
|
||
|
|
||
|
if(inWorldCoordinates) {
|
||
|
result = scene.globe.ellipsoid.cartographicToCartesian(scene.mapProjection.unproject(result, unprojectedScratch), result);
|
||
|
}
|
||
|
} else {
|
||
|
if(!inWorldCoordinates) {
|
||
|
result = camera.worldToCameraCoordinatesPoint(result, result);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
};
|
||
|
|
||
|
return Utils;
|
||
|
});
|
||
|
|
||
|
/*global require*/
|
||
|
define('ViewModels/ZoomNavigationControl',[
|
||
|
'Cesium/Core/defined',
|
||
|
'Cesium/Core/Ray',
|
||
|
'Cesium/Core/IntersectionTests',
|
||
|
'Cesium/Core/Cartesian3',
|
||
|
'Cesium/Scene/SceneMode',
|
||
|
'ViewModels/NavigationControl',
|
||
|
'Core/Utils'
|
||
|
], function (
|
||
|
defined,
|
||
|
Ray,
|
||
|
IntersectionTests,
|
||
|
Cartesian3,
|
||
|
SceneMode,
|
||
|
NavigationControl,
|
||
|
Utils) {
|
||
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* The model for a zoom in control in the navigation control tool bar
|
||
|
*
|
||
|
* @alias ZoomOutNavigationControl
|
||
|
* @constructor
|
||
|
* @abstract
|
||
|
*
|
||
|
* @param {Terria} terria The Terria instance.
|
||
|
* @param {boolean} zoomIn is used for zooming in (true) or out (false)
|
||
|
*/
|
||
|
var ZoomNavigationControl = function (terria, zoomIn) {
|
||
|
NavigationControl.apply(this, arguments);
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the name of the control which is set as the control's title.
|
||
|
* This property is observable.
|
||
|
* @type {String}
|
||
|
*/
|
||
|
this.name = 'Zoom ' + (zoomIn ? 'In' : 'Out');
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the text to be displayed in the nav control. Controls that
|
||
|
* have text do not display the svgIcon.
|
||
|
* This property is observable.
|
||
|
* @type {String}
|
||
|
*/
|
||
|
this.text = zoomIn ? '+' : '-';
|
||
|
|
||
|
/**
|
||
|
* Gets or sets the CSS class of the control. This property is observable.
|
||
|
* @type {String}
|
||
|
*/
|
||
|
this.cssClass = 'navigation-control-icon-zoom-' + (zoomIn ? 'in' : 'out');
|
||
|
|
||
|
this.relativeAmount = 2;
|
||
|
|
||
|
if (zoomIn) {
|
||
|
// this ensures that zooming in is the inverse of zooming out and vice versa
|
||
|
// e.g. the camera position remains when zooming in and out
|
||
|
this.relativeAmount = 1 / this.relativeAmount;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
ZoomNavigationControl.prototype.relativeAmount = 1;
|
||
|
|
||
|
ZoomNavigationControl.prototype = Object.create(NavigationControl.prototype);
|
||
|
|
||
|
/**
|
||
|
* When implemented in a derived class, performs an action when the user clicks
|
||
|
* on this control
|
||
|
* @abstract
|
||
|
* @protected
|
||
|
*/
|
||
|
ZoomNavigationControl.prototype.activate = function () {
|
||
|
this.zoom(this.relativeAmount);
|
||
|
};
|
||
|
|
||
|
var cartesian3Scratch = new Cartesian3();
|
||
|
|
||
|
ZoomNavigationControl.prototype.zoom = function (relativeAmount) {
|
||
|
// this.terria.analytics.logEvent('navigation', 'click', 'zoomIn');
|
||
|
|
||
|
this.isActive = true;
|
||
|
|
||
|
if (defined(this.terria)) {
|
||
|
var scene = this.terria.scene;
|
||
|
|
||
|
var sscc = scene.screenSpaceCameraController;
|
||
|
// do not zoom if it is disabled
|
||
|
if (!sscc.enableInputs || !sscc.enableZoom) {
|
||
|
return;
|
||
|
}
|
||
|
// TODO
|
||
|
// if(scene.mode == SceneMode.COLUMBUS_VIEW && !sscc.enableTranslate) {
|
||
|
// return;
|
||
|
// }
|
||
|
|
||
|
var camera = scene.camera;
|
||
|
var orientation;
|
||
|
|
||
|
switch (scene.mode) {
|
||
|
case SceneMode.MORPHING:
|
||
|
break;
|
||
|
case SceneMode.SCENE2D:
|
||
|
camera.zoomIn(camera.positionCartographic.height * (1 - this.relativeAmount));
|
||
|
break;
|
||
|
default:
|
||
|
var focus;
|
||
|
|
||
|
if(defined(this.terria.trackedEntity)) {
|
||
|
focus = new Cartesian3();
|
||
|
} else {
|
||
|
focus = Utils.getCameraFocus(this.terria, false);
|
||
|
}
|
||
|
|
||
|
if (!defined(focus)) {
|
||
|
// Camera direction is not pointing at the globe, so use the ellipsoid horizon point as
|
||
|
// the focal point.
|
||
|
var ray = new Ray(camera.worldToCameraCoordinatesPoint(scene.globe.ellipsoid.cartographicToCartesian(camera.positionCartographic)), camera.directionWC);
|
||
|
focus = IntersectionTests.grazingAltitudeLocation(ray, scene.globe.ellipsoid);
|
||
|
|
||
|
orientation = {
|
||
|
heading: camera.heading,
|
||
|
pitch: camera.pitch,
|
||
|
roll: camera.roll
|
||
|
};
|
||
|
} else {
|
||
|
orientation = {
|
||
|
direction: camera.direction,
|
||
|
up: camera.up
|
||
|
};
|
||
|
}
|
||
|
|
||
|
var direction = Cartesian3.subtract(camera.position, focus, cartesian3Scratch);
|
||
|
var movementVector = Cartesian3.multiplyByScalar(direction, relativeAmount, direction);
|
||
|
var endPosition = Cartesian3.add(focus, movementVector, focus);
|
||
|
|
||
|
if (defined(this.terria.trackedEntity) || scene.mode == SceneMode.COLUMBUS_VIEW) {
|
||
|
// sometimes flyTo does not work (jumps to wrong position) so just set the position without any animation
|
||
|
// do not use flyTo when tracking an entity because during animatiuon the position of the entity may change
|
||
|
camera.position = endPosition;
|
||
|
} else {
|
||
|
camera.flyTo({
|
||
|
destination: endPosition,
|
||
|
orientation: orientation,
|
||
|
duration: 0.5,
|
||
|
convert: false
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// this.terria.notifyRepaintRequired();
|
||
|
this.isActive = false;
|
||
|
};
|
||
|
|
||
|
return ZoomNavigationControl;
|
||
|
});
|
||
|
|
||
|
/*global define*/
|
||
|
define('SvgPaths/svgCompassOuterRing',[
|
||
|
], function () {
|
||
|
'use strict';
|
||
|
|
||
|
return 'm 66.5625,0 0,15.15625 3.71875,0 0,-10.40625 5.5,10.40625 4.375,0 0,-15.15625 -3.71875,0 0,10.40625 L 70.9375,0 66.5625,0 z M 72.5,20.21875 c -28.867432,0 -52.28125,23.407738 -52.28125,52.28125 0,28.87351 23.413818,52.3125 52.28125,52.3125 28.86743,0 52.28125,-23.43899 52.28125,-52.3125 0,-28.873512 -23.41382,-52.28125 -52.28125,-52.28125 z m 0,1.75 c 13.842515,0 26.368948,5.558092 35.5,14.5625 l -11.03125,11 0.625,0.625 11.03125,-11 c 8.9199,9.108762 14.4375,21.579143 14.4375,35.34375 0,13.764606 -5.5176,26.22729 -14.4375,35.34375 l -11.03125,-11 -0.625,0.625 11.03125,11 c -9.130866,9.01087 -21.658601,14.59375 -35.5,14.59375 -13.801622,0 -26.321058,-5.53481 -35.4375,-14.5 l 11.125,-11.09375 c 6.277989,6.12179 14.857796,9.90625 24.3125,9.90625 19.241896,0 34.875,-15.629154 34.875,-34.875 0,-19.245847 -15.633104,-34.84375 -34.875,-34.84375 -9.454704,0 -18.034511,3.760884 -24.3125,9.875 L 37.0625,36.4375 C 46.179178,27.478444 58.696991,21.96875 72.5,21.96875 z m -0.875,0.84375 0,13.9375 1.75,0 0,-13.9375 -1.75,0 z M 36.46875,37.0625 47.5625,48.15625 C 41.429794,54.436565 37.65625,63.027539 37.65625,72.5 c 0,9.472461 3.773544,18.055746 9.90625,24.34375 L 36.46875,107.9375 c -8.96721,-9.1247 -14.5,-21.624886 -14.5,-35.4375 0,-13.812615 5.53279,-26.320526 14.5,-35.4375 z M 72.5,39.40625 c 18.297686,0 33.125,14.791695 33.125,33.09375 0,18.302054 -14.827314,33.125 -33.125,33.125 -18.297687,0 -33.09375,-14.822946 -33.09375,-33.125 0,-18.302056 14.796063,-33.09375 33.09375,-33.09375 z M 22.84375,71.625 l 0,1.75 13.96875,0 0,-1.75 -13.96875,0 z m 85.5625,0 0,1.75 14,0 0,-1.75 -14,0 z M 71.75,108.25 l 0,13.9375 1.71875,0 0,-13.9375 -1.71875,0 z';
|
||
|
});
|
||
|
/*global define*/
|
||
|
define('SvgPaths/svgCompassGyro',[
|
||
|
], function () {
|
||
|
'use strict';
|
||
|
|
||
|
return 'm 72.71875,54.375 c -0.476702,0 -0.908208,0.245402 -1.21875,0.5625 -0.310542,0.317098 -0.551189,0.701933 -0.78125,1.1875 -0.172018,0.363062 -0.319101,0.791709 -0.46875,1.25 -6.91615,1.075544 -12.313231,6.656514 -13,13.625 -0.327516,0.117495 -0.661877,0.244642 -0.9375,0.375 -0.485434,0.22959 -0.901634,0.471239 -1.21875,0.78125 -0.317116,0.310011 -0.5625,0.742111 -0.5625,1.21875 l 0.03125,0 c 0,0.476639 0.245384,0.877489 0.5625,1.1875 0.317116,0.310011 0.702066,0.58291 1.1875,0.8125 0.35554,0.168155 0.771616,0.32165 1.21875,0.46875 1.370803,6.10004 6.420817,10.834127 12.71875,11.8125 0.146999,0.447079 0.30025,0.863113 0.46875,1.21875 0.230061,0.485567 0.470708,0.870402 0.78125,1.1875 0.310542,0.317098 0.742048,0.5625 1.21875,0.5625 0.476702,0 0.876958,-0.245402 1.1875,-0.5625 0.310542,-0.317098 0.582439,-0.701933 0.8125,-1.1875 0.172018,-0.363062 0.319101,-0.791709 0.46875,-1.25 6.249045,-1.017063 11.256351,-5.7184 12.625,-11.78125 0.447134,-0.1471 0.86321,-0.300595 1.21875,-0.46875 0.485434,-0.22959 0.901633,-0.502489 1.21875,-0.8125 0.317117,-0.310011 0.5625,-0.710861 0.5625,-1.1875 l -0.03125,0 c 0,-0.476639 -0.245383,-0.908739 -0.5625,-1.21875 C 89.901633,71.846239 89.516684,71.60459 89.03125,71.375 88.755626,71.244642 88.456123,71.117495 88.125,71 87.439949,64.078341 82.072807,58.503735 75.21875,57.375 c -0.15044,-0.461669 -0.326927,-0.884711 -0.5,-1.25 -0.230061,-0.485567 -0.501958,-0.870402 -0.8125,-1.1875 -0.310542,-0.317098 -0.710798,-0.5625 -1.1875,-0.5625 z m -0.0625,1.40625 c 0.03595,-0.01283 0.05968,0 0.0625,0 0.0056,0 0.04321,-0.02233 0.1875,0.125 0.144288,0.147334 0.34336,0.447188 0.53125,0.84375 0.06385,0.134761 0.123901,0.309578 0.1875,0.46875 -0.320353,-0.01957 -0.643524,-0.0625 -0.96875,-0.0625 -0.289073,0 -0.558569,0.04702 -0.84375,0.0625 C 71.8761,57.059578 71.936151,56.884761 72,56.75 c 0.18789,-0.396562 0.355712,-0.696416 0.5,-0.84375 0.07214,-0.07367 0.120304,-0.112167 0.15625,-0.125 z m 0,2.40625 c 0.448007,0 0.906196,0.05436 1.34375,0.09375 0.177011,0.592256 0.347655,1.271044 0.5,2.03125 0.475097,2.370753 0.807525,5.463852 0.9375,8.9375 -0.906869,-0.02852 -1.834463,-0.0625 -2.78125,-0.0625 -0.92298,0 -1.802327,0.03537 -2.6875,0.0625 0.138529,-3.473648 0.493653,-6.566747 0.96875,-8.9375 0.154684,-0.771878 0.320019,-1.463985 0.5,-2.0625 0.405568,-0.03377 0.804291,-0.0625 1.21875,-0.0625 z m -2.71875,0.28125 c -0.129732,0.498888 -0.259782,0.987558 -0.375,1.5625 -0.498513,2.487595 -0.838088,5.693299 -0.96875,9.25 -3.21363,0.15162 -6.119596,0.480068 -8.40625,0.9375 -0.682394,0.136509 -1.275579,0.279657 -1.84375,0.4375 0.799068,-6.135482 5.504716,-11.036454 11.59375,-12.1875 z M 75.5,58.5 c 6.043169,1.18408 10.705093,6.052712 11.5,12.15625 -0.569435,-0.155806 -1.200273,-0.302525 -1.875,-0.4375 -2.262525,-0.452605 -5.108535,-0.783809 -8.28125,-0.9375 -0.130662,-3.556701 -0.470237,-6.762405 -0.96875,-9.25 C 75.761959,59.467174 75.626981,58.990925 75.5,58.5 z m -2.84375,12.09375 c 0.959338,0 1.895843,0.03282 2.8125,0.0625 C 75.48165,71.267751 75.5,71.871028 75.5,72.5 c 0,1.228616 -0.01449,2.438313 -0.0625,3.59375 -0.897358,0.0284 -1.811972,0.0625 -2.75,0.0625 -0.927373,0 -1.831062,-0.03473 -2.71875,-0.0625 -0.05109,-1.155437 -0.0625,-2.365134 -0.0625,-3.59375 0,-0.628972 0.01741,-1.232249 0.03125,-1.84375 0.895269,-0.02827 1.783025,-0.0625 2.71875,-0.0625 z M 68.5625,70.6875 c -0.01243,0.60601 -0.03125,1.189946 -0.03125,1.8125 0,1.22431 0.01541,2.407837 0.0625,3.5625 -3.125243,-0.150329 -5.92077,-0.471558 -8.09375,-0.90625 -0.784983,-0.157031 -1.511491,-0.316471 -2.125,-0.5 -0.107878,-0.704096 -0.1875,-1.422089 -0.1875,-2.15625 0,-0.115714 0.02849,-0.228688 0.03125,-0.34375 0.643106,-0.20284 1.389577,-0.390377 2.25,-0.5625 2.166953,-0.433487 4.97905,-0.75541 8.09375,-0.90625 z m 8.3125,0.03125 c 3.075121,0.15271 5.824455,0.446046 7.96875,0.875 0.857478,0.171534 1.630962,0.360416 2.28125,0.5625 0.0027,0.114659 0,0.228443 0,0.34375 0,0.735827 -0.07914,1.450633 -0.1875,2.15625 -0.598568,0.180148 -1.29077,0.34562 -2.0625,0.5 -2.158064,0.431708 -4.932088,0.754666 -8.03125,0.90625 0.04709,-1.154663
|
||
|
});
|
||
|
/*global define*/
|
||
|
define('SvgPaths/svgCompassRotationMarker',[
|
||
|
], function () {
|
||
|
'use strict';
|
||
|
|
||
|
return 'M 72.46875,22.03125 C 59.505873,22.050338 46.521615,27.004287 36.6875,36.875 L 47.84375,47.96875 C 61.521556,34.240041 83.442603,34.227389 97.125,47.90625 l 11.125,-11.125 C 98.401629,26.935424 85.431627,22.012162 72.46875,22.03125 z';
|
||
|
});
|
||
|
/*global define*/
|
||
|
define('ViewModels/NavigationViewModel',[
|
||
|
'Cesium/Core/defined',
|
||
|
'Cesium/Core/Math',
|
||
|
'Cesium/Core/getTimestamp',
|
||
|
'Cesium/Core/EventHelper',
|
||
|
'Cesium/Core/Transforms',
|
||
|
'Cesium/Scene/SceneMode',
|
||
|
'Cesium/Core/Cartesian2',
|
||
|
'Cesium/Core/Cartesian3',
|
||
|
'Cesium/Core/Matrix4',
|
||
|
'Cesium/Core/BoundingSphere',
|
||
|
'Cesium/Core/HeadingPitchRange',
|
||
|
'KnockoutES5',
|
||
|
'Core/loadView',
|
||
|
'ViewModels/ResetViewNavigationControl',
|
||
|
'ViewModels/ZoomNavigationControl',
|
||
|
'SvgPaths/svgCompassOuterRing',
|
||
|
'SvgPaths/svgCompassGyro',
|
||
|
'SvgPaths/svgCompassRotationMarker',
|
||
|
'Core/Utils'
|
||
|
], function(
|
||
|
defined,
|
||
|
CesiumMath,
|
||
|
getTimestamp,
|
||
|
EventHelper,
|
||
|
Transforms,
|
||
|
SceneMode,
|
||
|
Cartesian2,
|
||
|
Cartesian3,
|
||
|
Matrix4,
|
||
|
BoundingSphere,
|
||
|
HeadingPitchRange,
|
||
|
Knockout,
|
||
|
loadView,
|
||
|
ResetViewNavigationControl,
|
||
|
ZoomNavigationControl,
|
||
|
svgCompassOuterRing,
|
||
|
svgCompassGyro,
|
||
|
svgCompassRotationMarker,
|
||
|
Utils) {
|
||
|
'use strict';
|
||
|
|
||
|
var NavigationViewModel = function(options) {
|
||
|
|
||
|
this.terria = options.terria;
|
||
|
this.eventHelper = new EventHelper();
|
||
|
this.enableZoomControls = (defined(options.enableZoomControls)) ? options.enableZoomControls : true;
|
||
|
this.enableCompass = (defined(options.enableCompass)) ? options.enableCompass : true;
|
||
|
|
||
|
// if (this.showZoomControls)
|
||
|
// {
|
||
|
this.controls = options.controls;
|
||
|
if (!defined(this.controls)) {
|
||
|
this.controls = [
|
||
|
new ZoomNavigationControl(this.terria, true),
|
||
|
new ResetViewNavigationControl(this.terria),
|
||
|
new ZoomNavigationControl(this.terria, false)
|
||
|
];
|
||
|
}
|
||
|
//}
|
||
|
|
||
|
this.svgCompassOuterRing = svgCompassOuterRing;
|
||
|
this.svgCompassGyro = svgCompassGyro;
|
||
|
this.svgCompassRotationMarker = svgCompassRotationMarker;
|
||
|
|
||
|
this.showCompass = defined(this.terria) && this.enableCompass;
|
||
|
this.heading = this.showCompass ? this.terria.scene.camera.heading : 0.0;
|
||
|
|
||
|
this.isOrbiting = false;
|
||
|
this.orbitCursorAngle = 0;
|
||
|
this.orbitCursorOpacity = 0.0;
|
||
|
this.orbitLastTimestamp = 0;
|
||
|
this.orbitFrame = undefined;
|
||
|
this.orbitIsLook = false;
|
||
|
this.orbitMouseMoveFunction = undefined;
|
||
|
this.orbitMouseUpFunction = undefined;
|
||
|
|
||
|
this.isRotating = false;
|
||
|
this.rotateInitialCursorAngle = undefined;
|
||
|
this.rotateFrame = undefined;
|
||
|
this.rotateIsLook = false;
|
||
|
this.rotateMouseMoveFunction = undefined;
|
||
|
this.rotateMouseUpFunction = undefined;
|
||
|
|
||
|
this._unsubcribeFromPostRender = undefined;
|
||
|
|
||
|
Knockout.track(this, ['controls', 'showCompass', 'heading', 'isOrbiting', 'orbitCursorAngle', 'isRotating']);
|
||
|
|
||
|
var that = this;
|
||
|
|
||
|
function widgetChange() {
|
||
|
if (defined(that.terria)) {
|
||
|
if (that._unsubcribeFromPostRender) {
|
||
|
that._unsubcribeFromPostRender();
|
||
|
that._unsubcribeFromPostRender = undefined;
|
||
|
}
|
||
|
|
||
|
that.showCompass = true && that.enableCompass;
|
||
|
|
||
|
that._unsubcribeFromPostRender = that.terria.scene.postRender.addEventListener(function() {
|
||
|
that.heading = that.terria.scene.camera.heading;
|
||
|
});
|
||
|
} else {
|
||
|
if (that._unsubcribeFromPostRender) {
|
||
|
that._unsubcribeFromPostRender();
|
||
|
that._unsubcribeFromPostRender = undefined;
|
||
|
}
|
||
|
that.showCompass = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.eventHelper.add(this.terria.afterWidgetChanged, widgetChange, this);
|
||
|
//this.terria.afterWidgetChanged.addEventListener(widgetChange);
|
||
|
|
||
|
widgetChange();
|
||
|
};
|
||
|
|
||
|
|
||
|
NavigationViewModel.prototype.destroy = function() {
|
||
|
|
||
|
this.eventHelper.removeAll();
|
||
|
|
||
|
//loadView(require('fs').readFileSync(baseURLEmpCesium + 'js-lib/terrajs/lib/Views/Navigation.html', 'utf8'), container, this);
|
||
|
|
||
|
};
|
||
|
|
||
|
NavigationViewModel.prototype.show = function(container) {
|
||
|
var testing;
|
||
|
if (this.enableZoomControls && this.enableCompass) {
|
||
|
testing = '<div class="compass" title="Drag outer ring: rotate view. ' +
|
||
|
'Drag inner gyroscope: free orbit.' +
|
||
|
'Double-click: reset view.' +
|
||
|
'TIP: You can also free orbit by holding the CTRL key and dragging the map." data-bind="visible: showCompass, event: { mousedown: handleMouseDown, dblclick: handleDoubleClick }">' +
|
||
|
'<div class="compass-outer-ring-background"></div>' +
|
||
|
' <div class="compass-rotation-marker" data-bind="visible: isOrbiting, style: { transform: \'rotate(-\' + orbitCursorAngle + \'rad)\', \'-webkit-transform\': \'rotate(-\' + orbitCursorAngle + \'rad)\', opacity: orbitCursorOpacity }, cesiumSvgPath: { path: svgCompassRotationMarker, width: 145, height: 145 }"></div>' +
|
||
|
' <div class="compass-outer-ring" title="Click and drag to rotate the camera" data-bind="style: { transform: \'rotate(-\' + heading + \'rad)\', \'-webkit-transform\': \'rotate(-\' + heading + \'rad)\' }, cesiumSvgPath: { path: svgCompassOuterRing, width: 145, height: 145 }"></div>' +
|
||
|
' <div class="compass-gyro-background"></div>' +
|
||
|
' <div class="compass-gyro" data-bind="cesiumSvgPath: { path: svgCompassGyro, width: 145, height: 145 }, css: { \'compass-gyro-active\': isOrbiting }"></div>' +
|
||
|
'</div>' +
|
||
|
'<div class="navigation-controls">' +
|
||
|
'<!-- ko foreach: controls -->' +
|
||
|
'<div data-bind="click: activate, attr: { title: $data.name }, css: $root.isLastControl($data) ? \'navigation-control-last\' : \'navigation-control\' ">' +
|
||
|
' <!-- ko if: $data.hasText -->' +
|
||
|
' <div data-bind="text: $data.text, css: $data.isActive ? \'navigation-control-icon-active \' + $data.cssClass : $data.cssClass"></div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
' <!-- ko ifnot: $data.hasText -->' +
|
||
|
' <div data-bind="cesiumSvgPath: { path: $data.svgIcon, width: $data.svgWidth, height: $data.svgHeight }, css: $data.isActive ? \'navigation-control-icon-active \' + $data.cssClass : $data.cssClass"></div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
' </div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
'</div>';
|
||
|
} else if (!this.enableZoomControls && this.enableCompass) {
|
||
|
testing = '<div class="compass" title="Drag outer ring: rotate view. ' +
|
||
|
'Drag inner gyroscope: free orbit.' +
|
||
|
'Double-click: reset view.' +
|
||
|
'TIP: You can also free orbit by holding the CTRL key and dragging the map." data-bind="visible: showCompass, event: { mousedown: handleMouseDown, dblclick: handleDoubleClick }">' +
|
||
|
'<div class="compass-outer-ring-background"></div>' +
|
||
|
' <div class="compass-rotation-marker" data-bind="visible: isOrbiting, style: { transform: \'rotate(-\' + orbitCursorAngle + \'rad)\', \'-webkit-transform\': \'rotate(-\' + orbitCursorAngle + \'rad)\', opacity: orbitCursorOpacity }, cesiumSvgPath: { path: svgCompassRotationMarker, width: 145, height: 145 }"></div>' +
|
||
|
' <div class="compass-outer-ring" title="Click and drag to rotate the camera" data-bind="style: { transform: \'rotate(-\' + heading + \'rad)\', \'-webkit-transform\': \'rotate(-\' + heading + \'rad)\' }, cesiumSvgPath: { path: svgCompassOuterRing, width: 145, height: 145 }"></div>' +
|
||
|
' <div class="compass-gyro-background"></div>' +
|
||
|
' <div class="compass-gyro" data-bind="cesiumSvgPath: { path: svgCompassGyro, width: 145, height: 145 }, css: { \'compass-gyro-active\': isOrbiting }"></div>' +
|
||
|
'</div>' +
|
||
|
'<div class="navigation-controls" style="display: none;" >' +
|
||
|
'<!-- ko foreach: controls -->' +
|
||
|
'<div data-bind="click: activate, attr: { title: $data.name }, css: $root.isLastControl($data) ? \'navigation-control-last\' : \'navigation-control\' ">' +
|
||
|
' <!-- ko if: $data.hasText -->' +
|
||
|
' <div data-bind="text: $data.text, css: $data.isActive ? \'navigation-control-icon-active \' + $data.cssClass : $data.cssClass"></div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
' <!-- ko ifnot: $data.hasText -->' +
|
||
|
' <div data-bind="cesiumSvgPath: { path: $data.svgIcon, width: $data.svgWidth, height: $data.svgHeight }, css: $data.isActive ? \'navigation-control-icon-active \' + $data.cssClass : $data.cssClass"></div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
' </div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
'</div>';
|
||
|
} else if (this.enableZoomControls && !this.enableCompass) {
|
||
|
testing = '<div class="compass" style="display: none;" title="Drag outer ring: rotate view. ' +
|
||
|
'Drag inner gyroscope: free orbit.' +
|
||
|
'Double-click: reset view.' +
|
||
|
'TIP: You can also free orbit by holding the CTRL key and dragging the map." data-bind="visible: showCompass, event: { mousedown: handleMouseDown, dblclick: handleDoubleClick }">' +
|
||
|
'<div class="compass-outer-ring-background"></div>' +
|
||
|
' <div class="compass-rotation-marker" data-bind="visible: isOrbiting, style: { transform: \'rotate(-\' + orbitCursorAngle + \'rad)\', \'-webkit-transform\': \'rotate(-\' + orbitCursorAngle + \'rad)\', opacity: orbitCursorOpacity }, cesiumSvgPath: { path: svgCompassRotationMarker, width: 145, height: 145 }"></div>' +
|
||
|
' <div class="compass-outer-ring" title="Click and drag to rotate the camera" data-bind="style: { transform: \'rotate(-\' + heading + \'rad)\', \'-webkit-transform\': \'rotate(-\' + heading + \'rad)\' }, cesiumSvgPath: { path: svgCompassOuterRing, width: 145, height: 145 }"></div>' +
|
||
|
' <div class="compass-gyro-background"></div>' +
|
||
|
' <div class="compass-gyro" data-bind="cesiumSvgPath: { path: svgCompassGyro, width: 145, height: 145 }, css: { \'compass-gyro-active\': isOrbiting }"></div>' +
|
||
|
'</div>' +
|
||
|
'<div class="navigation-controls" >' +
|
||
|
'<!-- ko foreach: controls -->' +
|
||
|
'<div data-bind="click: activate, attr: { title: $data.name }, css: $root.isLastControl($data) ? \'navigation-control-last\' : \'navigation-control\' ">' +
|
||
|
' <!-- ko if: $data.hasText -->' +
|
||
|
' <div data-bind="text: $data.text, css: $data.isActive ? \'navigation-control-icon-active \' + $data.cssClass : $data.cssClass"></div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
' <!-- ko ifnot: $data.hasText -->' +
|
||
|
' <div data-bind="cesiumSvgPath: { path: $data.svgIcon, width: $data.svgWidth, height: $data.svgHeight }, css: $data.isActive ? \'navigation-control-icon-active \' + $data.cssClass : $data.cssClass"></div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
' </div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
'</div>';
|
||
|
} else if (!this.enableZoomControls && !this.enableCompass) {
|
||
|
testing = '<div class="compass" style="display: none;" title="Drag outer ring: rotate view. ' +
|
||
|
'Drag inner gyroscope: free orbit.' +
|
||
|
'Double-click: reset view.' +
|
||
|
'TIP: You can also free orbit by holding the CTRL key and dragging the map." data-bind="visible: showCompass, event: { mousedown: handleMouseDown, dblclick: handleDoubleClick }">' +
|
||
|
'<div class="compass-outer-ring-background"></div>' +
|
||
|
' <div class="compass-rotation-marker" data-bind="visible: isOrbiting, style: { transform: \'rotate(-\' + orbitCursorAngle + \'rad)\', \'-webkit-transform\': \'rotate(-\' + orbitCursorAngle + \'rad)\', opacity: orbitCursorOpacity }, cesiumSvgPath: { path: svgCompassRotationMarker, width: 145, height: 145 }"></div>' +
|
||
|
' <div class="compass-outer-ring" title="Click and drag to rotate the camera" data-bind="style: { transform: \'rotate(-\' + heading + \'rad)\', \'-webkit-transform\': \'rotate(-\' + heading + \'rad)\' }, cesiumSvgPath: { path: svgCompassOuterRing, width: 145, height: 145 }"></div>' +
|
||
|
' <div class="compass-gyro-background"></div>' +
|
||
|
' <div class="compass-gyro" data-bind="cesiumSvgPath: { path: svgCompassGyro, width: 145, height: 145 }, css: { \'compass-gyro-active\': isOrbiting }"></div>' +
|
||
|
'</div>' +
|
||
|
'<div class="navigation-controls" style="display: none;" >' +
|
||
|
'<!-- ko foreach: controls -->' +
|
||
|
'<div data-bind="click: activate, attr: { title: $data.name }, css: $root.isLastControl($data) ? \'navigation-control-last\' : \'navigation-control\' ">' +
|
||
|
' <!-- ko if: $data.hasText -->' +
|
||
|
' <div data-bind="text: $data.text, css: $data.isActive ? \'navigation-control-icon-active \' + $data.cssClass : $data.cssClass"></div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
' <!-- ko ifnot: $data.hasText -->' +
|
||
|
' <div data-bind="cesiumSvgPath: { path: $data.svgIcon, width: $data.svgWidth, height: $data.svgHeight }, css: $data.isActive ? \'navigation-control-icon-active \' + $data.cssClass : $data.cssClass"></div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
' </div>' +
|
||
|
' <!-- /ko -->' +
|
||
|
'</div>';
|
||
|
}
|
||
|
loadView(testing, container, this);
|
||
|
// loadView(navigatorTemplate, container, this);
|
||
|
//loadView(require('fs').readFileSync(baseURLEmpCesium + 'js-lib/terrajs/lib/Views/Navigation.html', 'utf8'), container, this);
|
||
|
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Adds a control to this toolbar.
|
||
|
* @param {NavControl} control The control to add.
|
||
|
*/
|
||
|
NavigationViewModel.prototype.add = function(control) {
|
||
|
this.controls.push(control);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Removes a control from this toolbar.
|
||
|
* @param {NavControl} control The control to remove.
|
||
|
*/
|
||
|
NavigationViewModel.prototype.remove = function(control) {
|
||
|
this.controls.remove(control);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Checks if the control given is the last control in the control array.
|
||
|
* @param {NavControl} control The control to remove.
|
||
|
*/
|
||
|
NavigationViewModel.prototype.isLastControl = function(control) {
|
||
|
return (control === this.controls[this.controls.length - 1]);
|
||
|
};
|
||
|
|
||
|
var vectorScratch = new Cartesian2();
|
||
|
|
||
|
NavigationViewModel.prototype.handleMouseDown = function(viewModel, e) {
|
||
|
var scene = this.terria.scene;
|
||
|
if (scene.mode === SceneMode.MORPHING) {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
var compassElement = e.currentTarget;
|
||
|
var compassRectangle = e.currentTarget.getBoundingClientRect();
|
||
|
var maxDistance = compassRectangle.width / 2.0;
|
||
|
var center = new Cartesian2((compassRectangle.right - compassRectangle.left) / 2.0, (compassRectangle.bottom - compassRectangle.top) / 2.0);
|
||
|
var clickLocation = new Cartesian2(e.clientX - compassRectangle.left, e.clientY - compassRectangle.top);
|
||
|
var vector = Cartesian2.subtract(clickLocation, center, vectorScratch);
|
||
|
var distanceFromCenter = Cartesian2.magnitude(vector);
|
||
|
|
||
|
var distanceFraction = distanceFromCenter / maxDistance;
|
||
|
|
||
|
var nominalTotalRadius = 145;
|
||
|
var norminalGyroRadius = 50;
|
||
|
|
||
|
if (distanceFraction < norminalGyroRadius / nominalTotalRadius) {
|
||
|
orbit(this, compassElement, vector);
|
||
|
// return false;
|
||
|
} else if (distanceFraction < 1.0) {
|
||
|
rotate(this, compassElement, vector);
|
||
|
// return false;
|
||
|
} else {
|
||
|
return true;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var oldTransformScratch = new Matrix4();
|
||
|
var newTransformScratch = new Matrix4();
|
||
|
var centerScratch = new Cartesian3();
|
||
|
|
||
|
NavigationViewModel.prototype.handleDoubleClick = function(viewModel, e) {
|
||
|
var scene = viewModel.terria.scene;
|
||
|
var camera = scene.camera;
|
||
|
|
||
|
var sscc = scene.screenSpaceCameraController;
|
||
|
|
||
|
if (scene.mode == SceneMode.MORPHING || !sscc.enableInputs) {
|
||
|
return true;
|
||
|
}
|
||
|
if (scene.mode == SceneMode.COLUMBUS_VIEW && !sscc.enableTranslate) {
|
||
|
return;
|
||
|
}
|
||
|
if (scene.mode == SceneMode.SCENE3D || scene.mode == SceneMode.COLUMBUS_VIEW) {
|
||
|
if (!sscc.enableLook) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (scene.mode == SceneMode.SCENE3D) {
|
||
|
if (!sscc.enableRotate) {
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var center = Utils.getCameraFocus(viewModel.terria, true, centerScratch);
|
||
|
|
||
|
if (!defined(center)) {
|
||
|
// Globe is barely visible, so reset to home view.
|
||
|
|
||
|
this.controls[1].resetView();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var cameraPosition = scene.globe.ellipsoid.cartographicToCartesian(camera.positionCartographic, new Cartesian3());
|
||
|
|
||
|
var surfaceNormal = scene.globe.ellipsoid.geodeticSurfaceNormal(center);
|
||
|
|
||
|
var focusBoundingSphere = new BoundingSphere(center, 0);
|
||
|
|
||
|
camera.flyToBoundingSphere(focusBoundingSphere, {
|
||
|
offset: new HeadingPitchRange(0,
|
||
|
// do not use camera.pitch since the pitch at the center/target is required
|
||
|
CesiumMath.PI_OVER_TWO - Cartesian3.angleBetween(
|
||
|
surfaceNormal,
|
||
|
camera.directionWC
|
||
|
),
|
||
|
// distanceToBoundingSphere returns wrong values when in 2D or Columbus view so do not use
|
||
|
// camera.distanceToBoundingSphere(focusBoundingSphere)
|
||
|
// instead calculate distance manually
|
||
|
Cartesian3.distance(cameraPosition, center)
|
||
|
),
|
||
|
duration: 1.5
|
||
|
});
|
||
|
};
|
||
|
|
||
|
NavigationViewModel.create = function(options) {
|
||
|
//options.enableZoomControls = this.enableZoomControls;
|
||
|
//options.enableCompass = this.enableCompass;
|
||
|
var result = new NavigationViewModel(options);
|
||
|
result.show(options.container);
|
||
|
return result;
|
||
|
};
|
||
|
|
||
|
function orbit(viewModel, compassElement, cursorVector) {
|
||
|
var scene = viewModel.terria.scene;
|
||
|
|
||
|
|
||
|
var sscc = scene.screenSpaceCameraController;
|
||
|
|
||
|
// do not orbit if it is disabled
|
||
|
if (scene.mode == SceneMode.MORPHING || !sscc.enableInputs) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
switch (scene.mode) {
|
||
|
case SceneMode.COLUMBUS_VIEW:
|
||
|
if (sscc.enableLook) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (!sscc.enableTranslate || !sscc.enableTilt) {
|
||
|
return;
|
||
|
}
|
||
|
break;
|
||
|
case SceneMode.SCENE3D:
|
||
|
if (sscc.enableLook) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (!sscc.enableTilt || !sscc.enableRotate) {
|
||
|
return;
|
||
|
}
|
||
|
break;
|
||
|
case SceneMode.SCENE2D:
|
||
|
if (!sscc.enableTranslate) {
|
||
|
return;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Remove existing event handlers, if any.
|
||
|
document.removeEventListener('mousemove', viewModel.orbitMouseMoveFunction, false);
|
||
|
document.removeEventListener('mouseup', viewModel.orbitMouseUpFunction, false);
|
||
|
|
||
|
if (defined(viewModel.orbitTickFunction)) {
|
||
|
viewModel.terria.clock.onTick.removeEventListener(viewModel.orbitTickFunction);
|
||
|
}
|
||
|
|
||
|
viewModel.orbitMouseMoveFunction = undefined;
|
||
|
viewModel.orbitMouseUpFunction = undefined;
|
||
|
viewModel.orbitTickFunction = undefined;
|
||
|
|
||
|
viewModel.isOrbiting = true;
|
||
|
viewModel.orbitLastTimestamp = getTimestamp();
|
||
|
|
||
|
var camera = scene.camera;
|
||
|
|
||
|
if (defined(viewModel.terria.trackedEntity)) {
|
||
|
// when tracking an entity simply use that reference frame
|
||
|
viewModel.orbitFrame = undefined;
|
||
|
viewModel.orbitIsLook = false;
|
||
|
} else {
|
||
|
var center = Utils.getCameraFocus(viewModel.terria, true, centerScratch);
|
||
|
|
||
|
if (!defined(center)) {
|
||
|
viewModel.orbitFrame = Transforms.eastNorthUpToFixedFrame(camera.positionWC, scene.globe.ellipsoid, newTransformScratch);
|
||
|
viewModel.orbitIsLook = true;
|
||
|
} else {
|
||
|
viewModel.orbitFrame = Transforms.eastNorthUpToFixedFrame(center, scene.globe.ellipsoid, newTransformScratch);
|
||
|
viewModel.orbitIsLook = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
viewModel.orbitTickFunction = function(e) {
|
||
|
var timestamp = getTimestamp();
|
||
|
var deltaT = timestamp - viewModel.orbitLastTimestamp;
|
||
|
var rate = (viewModel.orbitCursorOpacity - 0.5) * 2.5 / 1000;
|
||
|
var distance = deltaT * rate;
|
||
|
|
||
|
var angle = viewModel.orbitCursorAngle + CesiumMath.PI_OVER_TWO;
|
||
|
var x = Math.cos(angle) * distance;
|
||
|
var y = Math.sin(angle) * distance;
|
||
|
|
||
|
var oldTransform;
|
||
|
|
||
|
if (defined(viewModel.orbitFrame)) {
|
||
|
oldTransform = Matrix4.clone(camera.transform, oldTransformScratch);
|
||
|
|
||
|
camera.lookAtTransform(viewModel.orbitFrame);
|
||
|
}
|
||
|
|
||
|
// do not look up/down or rotate in 2D mode
|
||
|
if (scene.mode == SceneMode.SCENE2D) {
|
||
|
camera.move(new Cartesian3(x, y, 0), Math.max(scene.canvas.clientWidth, scene.canvas.clientHeight) / 100 * camera.positionCartographic.height * distance);
|
||
|
} else {
|
||
|
if (viewModel.orbitIsLook) {
|
||
|
camera.look(Cartesian3.UNIT_Z, -x);
|
||
|
camera.look(camera.right, -y);
|
||
|
} else {
|
||
|
camera.rotateLeft(x);
|
||
|
camera.rotateUp(y);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (defined(viewModel.orbitFrame)) {
|
||
|
camera.lookAtTransform(oldTransform);
|
||
|
}
|
||
|
|
||
|
// viewModel.terria.cesium.notifyRepaintRequired();
|
||
|
|
||
|
viewModel.orbitLastTimestamp = timestamp;
|
||
|
};
|
||
|
|
||
|
function updateAngleAndOpacity(vector, compassWidth) {
|
||
|
var angle = Math.atan2(-vector.y, vector.x);
|
||
|
viewModel.orbitCursorAngle = CesiumMath.zeroToTwoPi(angle - CesiumMath.PI_OVER_TWO);
|
||
|
|
||
|
var distance = Cartesian2.magnitude(vector);
|
||
|
var maxDistance = compassWidth / 2.0;
|
||
|
var distanceFraction = Math.min(distance / maxDistance, 1.0);
|
||
|
var easedOpacity = 0.5 * distanceFraction * distanceFraction + 0.5;
|
||
|
viewModel.orbitCursorOpacity = easedOpacity;
|
||
|
|
||
|
//viewModel.terria.cesium.notifyRepaintRequired();
|
||
|
}
|
||
|
|
||
|
viewModel.orbitMouseMoveFunction = function(e) {
|
||
|
var compassRectangle = compassElement.getBoundingClientRect();
|
||
|
var center = new Cartesian2((compassRectangle.right - compassRectangle.left) / 2.0, (compassRectangle.bottom - compassRectangle.top) / 2.0);
|
||
|
var clickLocation = new Cartesian2(e.clientX - compassRectangle.left, e.clientY - compassRectangle.top);
|
||
|
var vector = Cartesian2.subtract(clickLocation, center, vectorScratch);
|
||
|
updateAngleAndOpacity(vector, compassRectangle.width);
|
||
|
};
|
||
|
|
||
|
viewModel.orbitMouseUpFunction = function(e) {
|
||
|
// TODO: if mouse didn't move, reset view to looking down, north is up?
|
||
|
|
||
|
viewModel.isOrbiting = false;
|
||
|
document.removeEventListener('mousemove', viewModel.orbitMouseMoveFunction, false);
|
||
|
document.removeEventListener('mouseup', viewModel.orbitMouseUpFunction, false);
|
||
|
|
||
|
if (defined(viewModel.orbitTickFunction)) {
|
||
|
viewModel.terria.clock.onTick.removeEventListener(viewModel.orbitTickFunction);
|
||
|
}
|
||
|
|
||
|
viewModel.orbitMouseMoveFunction = undefined;
|
||
|
viewModel.orbitMouseUpFunction = undefined;
|
||
|
viewModel.orbitTickFunction = undefined;
|
||
|
};
|
||
|
|
||
|
document.addEventListener('mousemove', viewModel.orbitMouseMoveFunction, false);
|
||
|
document.addEventListener('mouseup', viewModel.orbitMouseUpFunction, false);
|
||
|
viewModel.terria.clock.onTick.addEventListener(viewModel.orbitTickFunction);
|
||
|
|
||
|
updateAngleAndOpacity(cursorVector, compassElement.getBoundingClientRect().width);
|
||
|
}
|
||
|
|
||
|
function rotate(viewModel, compassElement, cursorVector) {
|
||
|
viewModel.terria.options.enableCompassOuterRing = (
|
||
|
defined(viewModel.terria.options.enableCompassOuterRing)) ? viewModel.terria.options.enableCompassOuterRing : true;
|
||
|
if (viewModel.terria.options.enableCompassOuterRing) {
|
||
|
var scene = viewModel.terria.scene;
|
||
|
var camera = scene.camera;
|
||
|
|
||
|
var sscc = scene.screenSpaceCameraController;
|
||
|
// do not rotate in 2D mode or if rotating is disabled
|
||
|
if (scene.mode == SceneMode.MORPHING || scene.mode == SceneMode.SCENE2D || !sscc.enableInputs) {
|
||
|
return;
|
||
|
}
|
||
|
if (!sscc.enableLook && (scene.mode == SceneMode.COLUMBUS_VIEW || (scene.mode == SceneMode.SCENE3D && !sscc.enableRotate))) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Remove existing event handlers, if any.
|
||
|
document.removeEventListener('mousemove', viewModel.rotateMouseMoveFunction, false);
|
||
|
document.removeEventListener('mouseup', viewModel.rotateMouseUpFunction, false);
|
||
|
|
||
|
viewModel.rotateMouseMoveFunction = undefined;
|
||
|
viewModel.rotateMouseUpFunction = undefined;
|
||
|
|
||
|
viewModel.isRotating = true;
|
||
|
viewModel.rotateInitialCursorAngle = Math.atan2(-cursorVector.y, cursorVector.x);
|
||
|
|
||
|
if (defined(viewModel.terria.trackedEntity)) {
|
||
|
// when tracking an entity simply use that reference frame
|
||
|
viewModel.rotateFrame = undefined;
|
||
|
viewModel.rotateIsLook = false;
|
||
|
} else {
|
||
|
var viewCenter = Utils.getCameraFocus(viewModel.terria, true, centerScratch);
|
||
|
|
||
|
if (!defined(viewCenter) || (scene.mode == SceneMode.COLUMBUS_VIEW && !sscc.enableLook && !sscc.enableTranslate)) {
|
||
|
viewModel.rotateFrame = Transforms.eastNorthUpToFixedFrame(camera.positionWC, scene.globe.ellipsoid, newTransformScratch);
|
||
|
viewModel.rotateIsLook = true;
|
||
|
} else {
|
||
|
viewModel.rotateFrame = Transforms.eastNorthUpToFixedFrame(viewCenter, scene.globe.ellipsoid, newTransformScratch);
|
||
|
viewModel.rotateIsLook = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var oldTransform;
|
||
|
if (defined(viewModel.rotateFrame)) {
|
||
|
oldTransform = Matrix4.clone(camera.transform, oldTransformScratch);
|
||
|
camera.lookAtTransform(viewModel.rotateFrame);
|
||
|
}
|
||
|
|
||
|
viewModel.rotateInitialCameraAngle = -camera.heading;
|
||
|
|
||
|
if (defined(viewModel.rotateFrame)) {
|
||
|
camera.lookAtTransform(oldTransform);
|
||
|
}
|
||
|
|
||
|
viewModel.rotateMouseMoveFunction = function(e) {
|
||
|
var compassRectangle = compassElement.getBoundingClientRect();
|
||
|
var center = new Cartesian2((compassRectangle.right - compassRectangle.left) / 2.0, (compassRectangle.bottom - compassRectangle.top) / 2.0);
|
||
|
var clickLocation = new Cartesian2(e.clientX - compassRectangle.left, e.clientY - compassRectangle.top);
|
||
|
var vector = Cartesian2.subtract(clickLocation, center, vectorScratch);
|
||
|
var angle = Math.atan2(-vector.y, vector.x);
|
||
|
|
||
|
var angleDifference = angle - viewModel.rotateInitialCursorAngle;
|
||
|
var newCameraAngle = CesiumMath.zeroToTwoPi(viewModel.rotateInitialCameraAngle - angleDifference);
|
||
|
|
||
|
var camera = viewModel.terria.scene.camera;
|
||
|
|
||
|
var oldTransform;
|
||
|
if (defined(viewModel.rotateFrame)) {
|
||
|
oldTransform = Matrix4.clone(camera.transform, oldTransformScratch);
|
||
|
camera.lookAtTransform(viewModel.rotateFrame);
|
||
|
}
|
||
|
|
||
|
var currentCameraAngle = -camera.heading;
|
||
|
camera.rotateRight(newCameraAngle - currentCameraAngle);
|
||
|
|
||
|
if (defined(viewModel.rotateFrame)) {
|
||
|
camera.lookAtTransform(oldTransform);
|
||
|
}
|
||
|
|
||
|
// viewModel.terria.cesium.notifyRepaintRequired();
|
||
|
};
|
||
|
|
||
|
viewModel.rotateMouseUpFunction = function(e) {
|
||
|
viewModel.isRotating = false;
|
||
|
document.removeEventListener('mousemove', viewModel.rotateMouseMoveFunction, false);
|
||
|
document.removeEventListener('mouseup', viewModel.rotateMouseUpFunction, false);
|
||
|
|
||
|
viewModel.rotateMouseMoveFunction = undefined;
|
||
|
viewModel.rotateMouseUpFunction = undefined;
|
||
|
};
|
||
|
|
||
|
document.addEventListener('mousemove', viewModel.rotateMouseMoveFunction, false);
|
||
|
document.addEventListener('mouseup', viewModel.rotateMouseUpFunction, false);
|
||
|
}
|
||
|
}
|
||
|
return NavigationViewModel;
|
||
|
});
|
||
|
|
||
|
/*global define*/
|
||
|
define('CesiumNavigation',[
|
||
|
'Cesium/Core/defined',
|
||
|
'Cesium/Core/defineProperties',
|
||
|
// 'Cesium/Core/defaultValue',
|
||
|
'Cesium/Core/Event',
|
||
|
'KnockoutES5',
|
||
|
'Core/registerKnockoutBindings',
|
||
|
'ViewModels/DistanceLegendViewModel',
|
||
|
'ViewModels/NavigationViewModel'
|
||
|
], function (
|
||
|
defined,
|
||
|
defineProperties,
|
||
|
// defaultValue,
|
||
|
CesiumEvent,
|
||
|
Knockout,
|
||
|
registerKnockoutBindings,
|
||
|
DistanceLegendViewModel,
|
||
|
NavigationViewModel)
|
||
|
{
|
||
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* @alias CesiumNavigation
|
||
|
* @constructor
|
||
|
*
|
||
|
* @param {Viewer|CesiumWidget} viewerCesiumWidget The Viewer or CesiumWidget instance
|
||
|
*/
|
||
|
var CesiumNavigation = function (viewerCesiumWidget) {
|
||
|
initialize.apply(this, arguments);
|
||
|
|
||
|
this._onDestroyListeners = [];
|
||
|
};
|
||
|
|
||
|
CesiumNavigation.prototype.distanceLegendViewModel = undefined;
|
||
|
CesiumNavigation.prototype.navigationViewModel = undefined;
|
||
|
CesiumNavigation.prototype.navigationDiv = undefined;
|
||
|
CesiumNavigation.prototype.distanceLegendDiv = undefined;
|
||
|
CesiumNavigation.prototype.terria = undefined;
|
||
|
CesiumNavigation.prototype.container = undefined;
|
||
|
CesiumNavigation.prototype._onDestroyListeners = undefined;
|
||
|
|
||
|
CesiumNavigation.prototype.destroy = function ()
|
||
|
{
|
||
|
if (defined(this.navigationViewModel))
|
||
|
{
|
||
|
this.navigationViewModel.destroy();
|
||
|
}
|
||
|
if (defined(this.distanceLegendViewModel))
|
||
|
{
|
||
|
this.distanceLegendViewModel.destroy();
|
||
|
}
|
||
|
|
||
|
if (defined(this.navigationDiv))
|
||
|
{
|
||
|
this.navigationDiv.parentNode.removeChild(this.navigationDiv);
|
||
|
}
|
||
|
delete this.navigationDiv;
|
||
|
|
||
|
if (defined(this.distanceLegendDiv))
|
||
|
{
|
||
|
this.distanceLegendDiv.parentNode.removeChild(this.distanceLegendDiv);
|
||
|
}
|
||
|
delete this.distanceLegendDiv;
|
||
|
|
||
|
if (defined(this.container))
|
||
|
{
|
||
|
this.container.parentNode.removeChild(this.container);
|
||
|
}
|
||
|
delete this.container;
|
||
|
|
||
|
for (var i = 0; i < this._onDestroyListeners.length; i++)
|
||
|
{
|
||
|
this._onDestroyListeners[i]();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
CesiumNavigation.prototype.addOnDestroyListener = function (callback)
|
||
|
{
|
||
|
if (typeof callback === "function")
|
||
|
{
|
||
|
this._onDestroyListeners.push(callback);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @param {Viewer|CesiumWidget} viewerCesiumWidget The Viewer or CesiumWidget instance
|
||
|
* @param options
|
||
|
*/
|
||
|
function initialize(viewerCesiumWidget, options) {
|
||
|
if (!defined(viewerCesiumWidget)) {
|
||
|
throw new DeveloperError('CesiumWidget or Viewer is required.');
|
||
|
}
|
||
|
|
||
|
// options = defaultValue(options, defaultValue.EMPTY_OBJECT);
|
||
|
|
||
|
var cesiumWidget = defined(viewerCesiumWidget.cesiumWidget) ? viewerCesiumWidget.cesiumWidget : viewerCesiumWidget;
|
||
|
|
||
|
var container = document.createElement('div');
|
||
|
container.className = 'cesium-widget-cesiumNavigationContainer';
|
||
|
cesiumWidget.container.appendChild(container);
|
||
|
|
||
|
this.terria = viewerCesiumWidget;
|
||
|
this.terria.options = (defined(options))?options :{};
|
||
|
this.terria.afterWidgetChanged = new CesiumEvent();
|
||
|
this.terria.beforeWidgetChanged = new CesiumEvent();
|
||
|
this.container = container;
|
||
|
|
||
|
//this.navigationDiv.setAttribute("id", "navigationDiv");
|
||
|
|
||
|
|
||
|
// Register custom Knockout.js bindings. If you're not using the TerriaJS user interface, you can remove this.
|
||
|
registerKnockoutBindings();
|
||
|
|
||
|
if (!defined(this.terria.options.enableDistanceLegend) || this.terria.options.enableDistanceLegend)
|
||
|
{
|
||
|
this.distanceLegendDiv = document.createElement('div');
|
||
|
container.appendChild(this.distanceLegendDiv);
|
||
|
this.distanceLegendDiv.setAttribute("id", "distanceLegendDiv");
|
||
|
this.distanceLegendViewModel = DistanceLegendViewModel.create({
|
||
|
container: this.distanceLegendDiv,
|
||
|
terria: this.terria,
|
||
|
mapElement: container,
|
||
|
enableDistanceLegend: true
|
||
|
});
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
if ((!defined(this.terria.options.enableZoomControls) || this.terria.options.enableZoomControls) && (!defined(this.terria.options.enableCompass) || this.terria.options.enableCompass))
|
||
|
{
|
||
|
this.navigationDiv = document.createElement('div');
|
||
|
this.navigationDiv.setAttribute("id", "navigationDiv");
|
||
|
container.appendChild(this.navigationDiv);
|
||
|
// Create the navigation controls.
|
||
|
this.navigationViewModel = NavigationViewModel.create({
|
||
|
container: this.navigationDiv,
|
||
|
terria: this.terria,
|
||
|
enableZoomControls: true,
|
||
|
enableCompass: true
|
||
|
});
|
||
|
}
|
||
|
else if ((defined(this.terria.options.enableZoomControls) && !this.terria.options.enableZoomControls) && (!defined(this.terria.options.enableCompass) || this.terria.options.enableCompass))
|
||
|
{
|
||
|
this.navigationDiv = document.createElement('div');
|
||
|
this.navigationDiv.setAttribute("id", "navigationDiv");
|
||
|
container.appendChild(this.navigationDiv);
|
||
|
// Create the navigation controls.
|
||
|
this.navigationViewModel = NavigationViewModel.create({
|
||
|
container: this.navigationDiv,
|
||
|
terria: this.terria,
|
||
|
enableZoomControls: false,
|
||
|
enableCompass: true
|
||
|
});
|
||
|
}
|
||
|
else if ((!defined(this.terria.options.enableZoomControls) || this.terria.options.enableZoomControls) && (defined(this.terria.options.enableCompass) && !this.terria.options.enableCompass))
|
||
|
{
|
||
|
this.navigationDiv = document.createElement('div');
|
||
|
this.navigationDiv.setAttribute("id", "navigationDiv");
|
||
|
container.appendChild(this.navigationDiv);
|
||
|
// Create the navigation controls.
|
||
|
this.navigationViewModel = NavigationViewModel.create({
|
||
|
container: this.navigationDiv,
|
||
|
terria: this.terria,
|
||
|
enableZoomControls: true,
|
||
|
enableCompass: false
|
||
|
});
|
||
|
}
|
||
|
else if ((defined(this.terria.options.enableZoomControls) && !this.terria.options.enableZoomControls) && (defined(this.terria.options.enableCompass) && !this.terria.options.enableCompass))
|
||
|
{
|
||
|
//this.navigationDiv.setAttribute("id", "navigationDiv");
|
||
|
// container.appendChild(this.navigationDiv);
|
||
|
// Create the navigation controls.
|
||
|
// this.navigationViewModel = NavigationViewModel.create({
|
||
|
// container: this.navigationDiv,
|
||
|
// terria: this.terria,
|
||
|
// enableZoomControls: false,
|
||
|
// enableCompass: false
|
||
|
// });
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return CesiumNavigation;
|
||
|
});
|
||
|
|
||
|
define('dummy/require-less/less/dummy',[],function(){});
|
||
|
/**
|
||
|
* Created by Larcius on 18.02.16.
|
||
|
*/
|
||
|
/*global define*/
|
||
|
define('viewerCesiumNavigationMixin',[
|
||
|
'Cesium/Core/defined',
|
||
|
'Cesium/Core/defineProperties',
|
||
|
'Cesium/Core/DeveloperError',
|
||
|
'CesiumNavigation',
|
||
|
'dummy/require-less/less/dummy'
|
||
|
], function(
|
||
|
defined,
|
||
|
defineProperties,
|
||
|
DeveloperError,
|
||
|
CesiumNavigation) {
|
||
|
'use strict';
|
||
|
|
||
|
/**
|
||
|
* A mixin which adds the Compass/Navigation widget to the Viewer widget.
|
||
|
* Rather than being called directly, this function is normally passed as
|
||
|
* a parameter to {@link Viewer#extend}, as shown in the example below.
|
||
|
* @exports viewerCesiumNavigationMixin
|
||
|
*
|
||
|
* @param {Viewer} viewer The viewer instance.
|
||
|
* @param {{}} options The options.
|
||
|
*
|
||
|
* @exception {DeveloperError} viewer is required.
|
||
|
*
|
||
|
* @demo {@link http://localhost:8080/index.html|run local server with examples}
|
||
|
*
|
||
|
* @example
|
||
|
* var viewer = new Cesium.Viewer('cesiumContainer');
|
||
|
* viewer.extend(viewerCesiumNavigationMixin);
|
||
|
*/
|
||
|
function viewerCesiumNavigationMixin(viewer, options) {
|
||
|
if (!defined(viewer)) {
|
||
|
throw new DeveloperError('viewer is required.');
|
||
|
}
|
||
|
|
||
|
var cesiumNavigation = init(viewer, options);
|
||
|
|
||
|
cesiumNavigation.addOnDestroyListener((function (viewer) {
|
||
|
return function () {
|
||
|
delete viewer.cesiumNavigation;
|
||
|
};
|
||
|
})(viewer));
|
||
|
|
||
|
defineProperties(viewer, {
|
||
|
cesiumNavigation: {
|
||
|
configurable: true,
|
||
|
get: function () {
|
||
|
return viewer.cesiumWidget.cesiumNavigation;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*
|
||
|
* @param {CesiumWidget} cesiumWidget The cesium widget instance.
|
||
|
* @param {{}} options The options.
|
||
|
*/
|
||
|
viewerCesiumNavigationMixin.mixinWidget = function (cesiumWidget, options) {
|
||
|
return init.apply(undefined, arguments);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @param {Viewer|CesiumWidget} viewerCesiumWidget The Viewer or CesiumWidget instance
|
||
|
* @param {{}} options the options
|
||
|
*/
|
||
|
var init = function (viewerCesiumWidget, options) {
|
||
|
var cesiumNavigation = new CesiumNavigation(viewerCesiumWidget, options);
|
||
|
|
||
|
var cesiumWidget = defined(viewerCesiumWidget.cesiumWidget) ? viewerCesiumWidget.cesiumWidget : viewerCesiumWidget;
|
||
|
|
||
|
defineProperties(cesiumWidget, {
|
||
|
cesiumNavigation: {
|
||
|
configurable: true,
|
||
|
get: function () {
|
||
|
return cesiumNavigation;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
|
||
|
cesiumNavigation.addOnDestroyListener((function (cesiumWidget) {
|
||
|
return function () {
|
||
|
delete cesiumWidget.cesiumNavigation;
|
||
|
};
|
||
|
})(cesiumWidget));
|
||
|
|
||
|
return cesiumNavigation;
|
||
|
};
|
||
|
|
||
|
return viewerCesiumNavigationMixin;
|
||
|
});
|
||
|
|
||
|
(function(c){var d=document,a='appendChild',i='styleSheet',s=d.createElement('style');s.type='text/css';d.getElementsByTagName('head')[0][a](s);s[i]?s[i].cssText=c:s[a](d.createTextNode(c));})
|
||
|
('.full-window{position:absolute;top:0;left:0;right:0;bottom:0;margin:0;overflow:hidden;padding:0;-webkit-transition:left .25s ease-out;-moz-transition:left .25s ease-out;-ms-transition:left .25s ease-out;-o-transition:left .25s ease-out;transition:left .25s ease-out}.transparent-to-input{pointer-events:none}.opaque-to-input{pointer-events:auto}.clickable{cursor:pointer}.markdown a:hover,.markdown u,a:hover{text-decoration:underline}.modal,.modal-background{top:0;left:0;bottom:0;right:0}.modal-background{pointer-events:auto;background-color:rgba(0,0,0,.5);z-index:1000;position:fixed}.modal{position:absolute;margin:auto;background-color:#2f353c;max-height:100%;max-width:100%;font-family:\'Roboto\',sans-serif;color:#fff}.modal-header{background-color:rgba(0,0,0,.2);border-bottom:1px solid rgba(100,100,100,.6);font-size:15px;line-height:40px;margin:0}.modal-header h1{font-size:15px;color:#fff;margin-left:15px}.modal-content{margin-left:15px;margin-right:15px;margin-bottom:15px;padding-top:15px;overflow:auto}.modal-close-button{position:absolute;right:15px;cursor:pointer;font-size:18px;color:#fff}#ui{z-index:2100}@media print{.full-window{position:initial}}.markdown img{max-width:100%}.markdown svg{max-height:100%}.markdown fieldset,.markdown input,.markdown select,.markdown textarea{font-family:inherit;font-size:1rem;box-sizing:border-box;margin-top:0;margin-bottom:0}.markdown label{vertical-align:middle}.markdown h1,.markdown h2,.markdown h3,.markdown h4,.markdown h5,.markdown h6{font-family:inherit;font-weight:700;line-height:1.25;margin-top:1em;margin-bottom:.5em}.markdown h1{font-size:2rem}.markdown h2{font-size:1.5rem}.markdown h3{font-size:1.25rem}.markdown h4{font-size:1rem}.markdown h5{font-size:.875rem}.markdown h6{font-size:.75rem}.markdown dl,.markdown ol,.markdown p,.markdown ul{margin-top:0;margin-bottom:1rem}.markdown strong{font-weight:700}.markdown em{font-style:italic}.markdown small{font-size:80%}.markdown mark{color:#000;background:#ff0}.markdown s{text-decoration:line-through}.markdown ol{list-style:decimal inside}.markdown ul{list-style:disc inside}.markdown code,.markdown pre,.markdown samp{font-family:monospace;font-size:inherit}.markdown pre{margin-top:0;margin-bottom:1rem;overflow-x:scroll}.markdown a{color:#68adfe;text-decoration:none}.markdown code,.markdown pre{background-color:transparent;border-radius:3px}.markdown hr{border:0;border-bottom-style:solid;border-bottom-width:1px;border-bottom-color:rgba(0,0,0,.125)}.markdown .left-align{text-align:left}.markdown .center{text-align:center}.markdown .right-align{text-align:right}.markdown .justify{text-align:justify}.markdown .truncate{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.markdown ol.upper-roman{list-style-type:upper-roman}.markdown ol.lower-alpha{list-style-type:lower-alpha}.markdown ul.circle{list-style-type:circle}.markdown ul.square{list-style-type:square}.markdown .list-reset{list-style:none;padding-left:0}.floating,.floating-horizontal,.floating-vertical{pointer-events:auto;position:absolute;border-radius:15px;background-color:rgba(47,53,60,.8)}.floating-horizontal{padding-left:5px;padding-right:5px}.floating-vertical{padding-top:5px;padding-bottom:5px}@media print{.floating{display:none}}.distance-legend{pointer-events:auto;position:absolute;border-radius:15px;background-color:rgba(47,53,60,.8);padding-left:5px;padding-right:5px;right:25px;bottom:30px;height:30px;width:125px;border:1px solid rgba(255,255,255,.1);box-sizing:content-box}.distance-legend-label{display:inline-block;font-family:\'Roboto\',sans-serif;font-size:14px;font-weight:lighter;line-height:30px;color:#fff;width:125px;text-align:center}.distance-legend-scale-bar{border-left:1px solid #fff;border-right:1px solid #fff;border-bottom:1px solid #fff;position:absolute;height:10px;top:15px}@media print{.distance-legend{display:none}}@media screen and (max-width:700px),screen and (max-height:420px){.distance-legend{display:none}}.navigation-controls{position:absolute;right:30px;top:210px;width:30px;border:1px solid rgba(255,255,255,.1);font-weigh
|
||
|
|
||
|
|
||
|
|
||
|
define(['viewerCesiumNavigationMixin'], function(viewerCesiumNavigationMixin) {
|
||
|
return viewerCesiumNavigationMixin;
|
||
|
});
|