From a2b3f62aba2d7b3d4d07d1d7166c61849ed6797a Mon Sep 17 00:00:00 2001 From: mattbrailsford Date: Tue, 8 Nov 2011 21:43:23 +0000 Subject: [PATCH] Updated uGoLive to v1.1 --- foreign dlls/Our.Umbraco.uGoLive.47x.dll | Bin 4608 -> 4608 bytes foreign dlls/Our.Umbraco.uGoLive.Checks.dll | Bin 11776 -> 11776 bytes foreign dlls/Our.Umbraco.uGoLive.dll | Bin 24064 -> 26112 bytes .../umbraco/plugins/uGoLive/Dashboard.ascx | 58 ++- .../umbraco/plugins/uGoLive/Dashboard.css | 16 + .../umbraco/plugins/uGoLive/Dashboard.js | 307 +++++------ .../umbraco/plugins/uGoLive/jquery.tmpl.js | 484 ++++++++++++++++++ .../umbraco/plugins/uGoLive/knockout-1.2.1.js | 194 +++++++ 8 files changed, 864 insertions(+), 195 deletions(-) create mode 100644 umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.css create mode 100644 umbraco/presentation/umbraco/plugins/uGoLive/jquery.tmpl.js create mode 100644 umbraco/presentation/umbraco/plugins/uGoLive/knockout-1.2.1.js diff --git a/foreign dlls/Our.Umbraco.uGoLive.47x.dll b/foreign dlls/Our.Umbraco.uGoLive.47x.dll index 0afa00e50411f55b23e5a4006f9fd5a065f5d334..eeb3afec20cfab7d6e6eb320230a163784a45ce5 100644 GIT binary patch delta 51 zcmZorX;7Ka!7ROC=f>`j>;h{9?5=p)%yR91D4h~fwsiL99*zP=knH6DoSKY$n>D$v GvjYGh^%M;N delta 51 zcmZorX;7Ka!K{60-Nx>Z>;lhhp1qy7|A)uMx%*z-$i8!Xa}P%WBS?1ge@;zCw#}Mc G*VzH7Ef~rG diff --git a/foreign dlls/Our.Umbraco.uGoLive.Checks.dll b/foreign dlls/Our.Umbraco.uGoLive.Checks.dll index c5dd4e20a7a9ec0531342f0c7d130fff5fb7b37b..ec4900edecf697edc44ed5bcddac68855166bb34 100644 GIT binary patch delta 2666 zcmb7Ge{39A5uSOw``-C{KKp$2oiFEK7svMcN6v2IHnAOqjpI5|)5d8MHB};t?HtBn zd!4;A!9va1a%iJ8ftZ)74GoGD{%A`pBzl6TQd=U?R8%5DYKxSXC~Ad@FhWpJsh|>t zd2cu2QUQXq_S^Yp=FK;6XYZXC4lEovb<9Yvytw>mExxk+%>6he5nHT_g8(%$#X95z z*n+RhMa(Bwwu1g_BV=H~Y%{>NS^$)b&70&1+m*MY0707p@Us!Cn%TD%(FC)ris%|< z$BJl@+3_M;!|duJT6^o-I%X$|qV*-rUZZ&4SFR5-J6W7i%IunA9%452eY4a0GG^Bm z^DwjPi+MS-8;W@avr~#2-cE!32m+Yv)E)_ASiS8g=3eP&t@|uyL z_(w)vUd2O!xEBw&LprW<15vZRKC8lICDmTI#65pATtZ=pm~F`}4$smYsDlW=nv>KH zM$L#Bvu#@Hv=SIj8)5t;)xxM1v10WHz8kTec5+_GN6fhU7pi(8VpbpNAlC^RCK5}y zfAie-dh!Ojou*qU#6s=mAOcP&F@QjP-y5Moeee@A$|HRJZ{T{Rxa||vL!^!*>&Cwv9jv`C2fE-2nP8vSbG#I_3H!(=Pv-KzA)Kkz*cgadRL#`N|5W`>JogJqWZm*i%-KhWA!9RO%N z0&tY>AJPME+?{hLXC|`rq~L3`r-RD3cQ;(4lSXZ^ad_``^|t+9z8q+;qNk{)LN6x( zeTURL2wUXe18;wU!&&R76^04Ep9kS2cR7c1yq{japYzLR46gGxc?>=x3_?;|HiOWh zu~XySVn768MB|votoDDC>=;}XKM`_W@OZi1NP4gcJ;!`0iclvdk*Y>FwJ zexG@j_xNmCubcImr*OGb{1E;GPx6nUmF!Z&AMy%pg_n3Y`F}?KNFIO3yD)+QaVI7)Dz;!Nwuk|| z9lOOa*}Y;1_TYYTA8yA<@c{0^yeOriKO#P_qlYN^9dTIWLs+6^-iC9cjkV&lqMQy5 zCHx)~#404TU4pCRPiZ>^`A6YhNJA8!Gt-dN_;u*B(sbILAWtJaPuQ;Qjqp0zeLClE zjl1E`+ zG1uBT_T|jD9Ek61@Xi6)<4#Tw%^ZZ`xygetG(DS}2TC6w&B@2(5AM5bbSj&|-8$>IHL~Y@6q8(+rZj8&d2eSVPm9~Qxi delta 2510 zcmaJ@Yitx%6h8OP%$oAY>T7_ z-C~WgJhbIPz<`0^43n^1t9!f@e{nBHY5`Spv#~DY_C_#ripMG4O7Dp;CNuop+;63jZhS`-O0(wKsgW&s(yE;2pazzHSS!y-jhuAuqDCa0yQz_z&OOw?xklnMs1Zx&nKV%? zMpMj59jp%rSI6>wik;-~!%8erfbLE`7$1dC&=ZT$J6^~yDPgqVQDRA9ciBRw-ImxT z?ZVgQSIhIdh1qS-HqG|L?T2PNn!&4W9z@lwRlw$bR|*SuOVFWK~tSBsaSHqn3q%qU0EsT*VP;ew#MJOga@_*i5B_Rx~= z-1a=jebvvrZ0s*^*=NhTPbAT8@e1K|33Owe5JG8t}=t z2MD}1lms1HB9Tf3o?qm6+KWFVd$eSjd?0h{|fgd6{7cPHaHO2}!0X zOJM#2V4^0zJQJ}a2fwA2&^Y0HS-#VW9-8PO@frU|3z4%D{}xz#j6#>A99S6!R$;+1 z@K+KTiMac~F7-NQ!rKd>2Qiam4F5wbrY=QPbB)BVRJOAq-5~L(z)@?||F8Cm`nZPa zMO7qSK{a7ma4Wy!C@tS1b*F80Bm+12h{axz>`ROF5Y&r>(^Q;yP*V#O2ZXl(E=}Sm8$d zI!oUm@l|4%#k>;35(_Nc0#~5|{P4b70TGF>z*MaQzvgYIDTEYavRsmh@HLXBq|-c! zi{LhDRzMU3Rzn$LH%!!KfJj;c15l5)0eF)PAXd=*QvWW>JLyR&e}VEOg)C_Quxp<>EbwRvkZF}p}JRS&aFJh@| z?^2DQ2oCavp*5k|Yuj32R!3J)FPL8_)WkbiEaRs_3-xCcZ5^{ZTXK(~UWW zPdi^9tLFP6g;{}TFlh(&(1Xu~=+X|osgse-YUcjBgZlBEZSz0=y>b1%qQ~w4;KVUeQIZMFX2~<>r)=% QoO$|>jOQ$MGjR2QO`xsN4@INa=&Zs-@KB5 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

p#+eqCc-|MuibF<{6X5 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 literal 24064 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 diff --git a/umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.ascx b/umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.ascx index 5610a65c81..973bdc1028 100644 --- a/umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.ascx +++ b/umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.ascx @@ -1,27 +1,21 @@ <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Dashboard.ascx.cs" Inherits="Our.Umbraco.uGoLive.Web.Umbraco.Plugins.uGoLive.Dashboard" %> <%@ Import Namespace="umbraco.IO" %> - - +<%@ Import Namespace="Our.Umbraco.uGoLive.Web" %> + + + + + + + \ No newline at end of file diff --git a/umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.css b/umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.css new file mode 100644 index 0000000000..cf2ff8d914 --- /dev/null +++ b/umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.css @@ -0,0 +1,16 @@ +.uGoLive .propertyItemContent img { vertical-align: middle; margin-right: 5px; } +.uGoLive .propertypane .propertypane { padding: 10px 10px 0px; } +.uGoLive .dashboardWrapper { padding: 5px 5px 5px 5px; overflow: hidden; color: #333; } +.uGoLive .dashboardWrapper h2 { margin-top: 0; padding-bottom: 10px; border-bottom: 1px solid #CCC; padding-left: 37px; line-height: 32px; } +.uGoLive .dashboardWrapper .dashboardIcon { position: absolute; top: 10px; left: 10px; } +.uGoLive .dashboardWrapper h3 { margin-bottom: 10px; } +.uGoLive .dashboardWrapper p { line-height: 1.4em; font-size: 1.1em; margin-top: 0; } +.uGoLive #btnRunChecks { color: #fff; background: #f26e20; padding: 10px; border: 0; font-weight: bold; cursor: pointer; outline: 0; } +.uGoLive #btnRunChecks.disabled { background: #f9b790; } +.uGoLive a.disabled { cursor: default; opacity:0.3; filter:alpha(opacity=30); } +.uGoLive span.status { padding-left: 20px; background-position: left center; background-repeat: no-repeat; line-height: 16px; } +.uGoLive span.status.uglUnchecked { background-image: url('help.png') } +.uGoLive span.status.uglChecking, .uGoLive span.status.uglQueued { background-image: url('throbber.gif') } +.uGoLive span.status.uglPassed, .uGoLive span.status.uglSuccess { background-image: url('tick.png') } +.uGoLive span.status.uglFailed { background-image: url('cross.png') } +.uGoLive span.status.uglIndeterminate { background-image: url('error.png') } \ No newline at end of file diff --git a/umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.js b/umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.js index fb64a2f9c8..25980c1ffe 100644 --- a/umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.js +++ b/umbraco/presentation/umbraco/plugins/uGoLive/Dashboard.js @@ -4,134 +4,140 @@ Our.Umbraco.uGoLive = Our.Umbraco.uGoLive || {}; (function ($) { + // Class representing a check group + Our.Umbraco.uGoLive.CheckGroup = function(name, checks, opts) { + var me = { + name: name, + checks: ko.observableArray([]) + }; + + for(var i = 0; i < checks.length; i++) { + me.checks.push(new Our.Umbraco.uGoLive.Check(checks[i], opts)); + } + + return me; + }; + + // Class representing a check + Our.Umbraco.uGoLive.Check = function(check, opts) { + var me = { + id: check.Id, + name: check.Name, + description: check.Description, + canRectify: check.CanRectify, + status: ko.observable("Unchecked"), + message: ko.observable("Unchecked"), + check: function (e, doneCallback) { + var _this = this; + + // Set status / message + _this.status("Checking"); + _this.message("Checking..."); + + // Perform check + $.getJSON(opts.basePath + '/uGoLive/Check/' + this.id + '.aspx', function(data) { + + // Set status / message + _this.status(data.Status.Value); + _this.message(data.Message); + + // Trigger done callback + if(doneCallback != undefined) + doneCallback(data); + }); + }, + rectify: function (e, doneCallback) { + var _this = this; + + // Set status / message + _this.status("Checking"); + _this.message("Rectifying..."); + + // Perform check + $.getJSON(opts.basePath + '/uGoLive/Rectify/' + this.id + '.aspx', function(data) { + + // Set status / message + _this.status(data.Status.Value); + _this.message(data.Message); + + // Trigger done callback + if(doneCallback != undefined) + doneCallback(data); + }); + } + }; + + return me; + }; + Our.Umbraco.uGoLive.Dashboard = (function() { - var checks = []; - var currentCheckIndex = -1; - var opts = { - basePath: "/base", - umbracoPath: "/umbraco" - }; - - function performNextCheck() { - - // Get the current check id - var checkId = checks[currentCheckIndex]; - - // Trigger check - performCheck(checkId, function(data) { - - // Trigger next check, or finish - if(currentCheckIndex + 1 == checks.length) { - - // Re-enable the "Run All Checks" button - var $btn = $("#btnRunChecks"); - $btn.text("Re-Run All Checks"); - $btn.removeClass("disabled"); - + var opts = { + checkDefs: [], + basePath: "/base", + umbracoPath: "/umbraco" + }; + + var viewModel = { + checkGroups: ko.observableArray([]), + checkAllText: ko.observable("Run All Checks"), + checkAll: function() { + var _this = this; + + // Set button text + _this.checkAllText("Running..."); + + // Queue checks + ko.utils.arrayForEach(_this.allChecks(), function(check) { + check.status("Queued"); + check.message("Queued..."); + }); + + // Trigger checks + _this.checkNext(function () { + + // Reset button text + _this.checkAllText("Re-Run All Checks"); + }); + }, + checkNext: function (doneCallback) { + var _this = this; + + // Check for any queued checks + if(_this.queuedChecks().length > 0) { + + // Trigger first queued check + _this.queuedChecks()[0].check(null, function() { + + // Trigger the next check + _this.checkNext(doneCallback); + }); } else { - - // Run the next check - currentCheckIndex++; - performNextCheck(); - + + // Call done callback + if(doneCallback != undefined) + doneCallback(); } - }); - } + } + }; - function performCheck(checkId, callBack) { - - // Get references - var $checkEl = $("span.status[data-check-id=" + checkId + "]"); - var $checkButton = $("a.check[data-check-id=" + checkId + "]"); - var $rectifyButton = $("a.rectify[data-check-id=" + checkId + "][data-check-can-rectify='true']"); - - // Disable buttons - $checkButton.addClass("disabled"); - $rectifyButton.addClass("disabled"); - - // Display throbber - $checkEl.html("Checking... Checking..."); - - // Perform check - $.getJSON(opts.basePath + '/uGoLive/Check/'+ checkId +'.aspx', function(data) { - - // Remove throbber - $checkEl.empty(); - - // Display icon & enable / disable rectify button - switch(data.Status.Value) { - case "Passed": - $checkEl.append("Passed"); - $rectifyButton.addClass("disabled"); - break; - case "Indeterminate": - $checkEl.append("Indeterminate"); - $rectifyButton.removeClass("disabled"); - break; - case "Failed": - $checkEl.append("Failed"); - $rectifyButton.removeClass("disabled"); - break; - } - - // Display message - if($.trim(data.Message) != "") - $checkEl.append(data.Message); - - // Re-enable check button - $checkButton.removeClass("disabled"); - - // Execute callback - if(callBack != undefined) - callBack(data); + // Helper list of all checks + viewModel.allChecks = ko.dependentObservable(function() { + var all = []; + ko.utils.arrayForEach(this.checkGroups(), function(group) { + ko.utils.arrayForEach(group.checks(), function(check) { + all.push(check); + }); }); - } - - function performRectify(checkId, callBack) { - - // Get references - var $checkEl = $("span.status[data-check-id=" + checkId + "]"); - var $checkButton = $("a.check[data-check-id=" + checkId + "]"); - var $rectifyButton = $("a.rectify[data-check-id=" + checkId + "][data-check-can-rectify='true']"); + return all; + }, viewModel); - // Disable buttons - $checkButton.addClass("disabled"); - $rectifyButton.addClass("disabled"); - - // Display throbber - $checkEl.html("Rectifying... Rectifying..."); - - // Perform rectify - $.getJSON(opts.basePath + '/uGoLive/Rectify/'+ checkId +'.aspx', function(data) { - - // Remove throbber - $checkEl.empty(); - - // Display icon & enable / disable rectify button - switch(data.Status.Value) { - case "Success": - $checkEl.append("Passed"); - $rectifyButton.addClass("disabled"); - break; - case "Failed": - $checkEl.append("Failed"); - $rectifyButton.removeClass("disabled"); - break; - } - - // Display message - if($.trim(data.Message) != "") - $checkEl.append(data.Message); - - // Re-enable check button - $checkButton.removeClass("disabled"); - - // Execute callback - if(callBack != undefined) - callBack(data); + // Helper list of queued checks + viewModel.queuedChecks = ko.dependentObservable(function() { + return ko.utils.arrayFilter(this.allChecks(), function(check) { + return check.status() == "Queued"; }); - } + }, viewModel); return { @@ -139,62 +145,17 @@ Our.Umbraco.uGoLive = Our.Umbraco.uGoLive || {}; // Merge options opts = $.extend(opts, o); - + // Parse all checks - $("span.status").each(function (idx, el) { - checks.push($(el).attr("data-check-id")); - }); - - // Hookup run all check button - $("#btnRunChecks").click(function(e) { - - e.preventDefault(); - - var $this = $(this); - - if(!$this.hasClass("disabled")) { - - // Clear out previous checks - $("span.status").empty(); - - // Disable check/rectify buttons - $("a.check").addClass("disabled"); - $("a.rectify").addClass("disabled"); - - // Update run checks button - $this.text("Running checks..."); - $this.addClass("disabled"); - - // Start checks - currentCheckIndex = 0; - performNextCheck(); - + for(var i = 0; i < opts.checkDefs.length; i++) { + var groupChecks = opts.checkDefs[i]; + if(groupChecks.length > 0) { + viewModel.checkGroups.push(new Our.Umbraco.uGoLive.CheckGroup(groupChecks[0].Group, groupChecks, opts)); } - }); - - // Hookup individual check buttons - $("a.check").click(function(e) { + } - e.preventDefault(); - - var $this = $(this); - - if(!$this.hasClass("disabled")) { - performCheck($this.attr("data-check-id")); - } - }); - - // Hookup individual rectify buttons - $("a.rectify").click(function(e) { - - e.preventDefault(); - - var $this = $(this); - - if(!$this.hasClass("disabled")) { - performRectify($this.attr("data-check-id")); - } - }); + // Bind view model + ko.applyBindings(viewModel, $("#uGoLive").get(0)); } }; diff --git a/umbraco/presentation/umbraco/plugins/uGoLive/jquery.tmpl.js b/umbraco/presentation/umbraco/plugins/uGoLive/jquery.tmpl.js new file mode 100644 index 0000000000..386994e902 --- /dev/null +++ b/umbraco/presentation/umbraco/plugins/uGoLive/jquery.tmpl.js @@ -0,0 +1,484 @@ +/*! + * jQuery Templates Plugin 1.0.0pre + * http://github.com/jquery/jquery-tmpl + * Requires jQuery 1.4.2 + * + * Copyright Software Freedom Conservancy, Inc. + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + */ +(function( jQuery, undefined ){ + var oldManip = jQuery.fn.domManip, tmplItmAtt = "_tmplitem", htmlExpr = /^[^<]*(<[\w\W]+>)[^>]*$|\{\{\! /, + newTmplItems = {}, wrappedItems = {}, appendToTmplItems, topTmplItem = { key: 0, data: {} }, itemKey = 0, cloneIndex = 0, stack = []; + + function newTmplItem( options, parentItem, fn, data ) { + // Returns a template item data structure for a new rendered instance of a template (a 'template item'). + // The content field is a hierarchical array of strings and nested items (to be + // removed and replaced by nodes field of dom elements, once inserted in DOM). + var newItem = { + data: data || (data === 0 || data === false) ? data : (parentItem ? parentItem.data : {}), + _wrap: parentItem ? parentItem._wrap : null, + tmpl: null, + parent: parentItem || null, + nodes: [], + calls: tiCalls, + nest: tiNest, + wrap: tiWrap, + html: tiHtml, + update: tiUpdate + }; + if ( options ) { + jQuery.extend( newItem, options, { nodes: [], parent: parentItem }); + } + if ( fn ) { + // Build the hierarchical content to be used during insertion into DOM + newItem.tmpl = fn; + newItem._ctnt = newItem._ctnt || newItem.tmpl( jQuery, newItem ); + newItem.key = ++itemKey; + // Keep track of new template item, until it is stored as jQuery Data on DOM element + (stack.length ? wrappedItems : newTmplItems)[itemKey] = newItem; + } + return newItem; + } + + // Override appendTo etc., in order to provide support for targeting multiple elements. (This code would disappear if integrated in jquery core). + jQuery.each({ + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" + }, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var ret = [], insert = jQuery( selector ), elems, i, l, tmplItems, + parent = this.length === 1 && this[0].parentNode; + + appendToTmplItems = newTmplItems || {}; + if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) { + insert[ original ]( this[0] ); + ret = this; + } else { + for ( i = 0, l = insert.length; i < l; i++ ) { + cloneIndex = i; + elems = (i > 0 ? this.clone(true) : this).get(); + jQuery( insert[i] )[ original ]( elems ); + ret = ret.concat( elems ); + } + cloneIndex = 0; + ret = this.pushStack( ret, name, insert.selector ); + } + tmplItems = appendToTmplItems; + appendToTmplItems = null; + jQuery.tmpl.complete( tmplItems ); + return ret; + }; + }); + + jQuery.fn.extend({ + // Use first wrapped element as template markup. + // Return wrapped set of template items, obtained by rendering template against data. + tmpl: function( data, options, parentItem ) { + return jQuery.tmpl( this[0], data, options, parentItem ); + }, + + // Find which rendered template item the first wrapped DOM element belongs to + tmplItem: function() { + return jQuery.tmplItem( this[0] ); + }, + + // Consider the first wrapped element as a template declaration, and get the compiled template or store it as a named template. + template: function( name ) { + return jQuery.template( name, this[0] ); + }, + + domManip: function( args, table, callback, options ) { + if ( args[0] && jQuery.isArray( args[0] )) { + var dmArgs = jQuery.makeArray( arguments ), elems = args[0], elemsLength = elems.length, i = 0, tmplItem; + while ( i < elemsLength && !(tmplItem = jQuery.data( elems[i++], "tmplItem" ))) {} + if ( tmplItem && cloneIndex ) { + dmArgs[2] = function( fragClone ) { + // Handler called by oldManip when rendered template has been inserted into DOM. + jQuery.tmpl.afterManip( this, fragClone, callback ); + }; + } + oldManip.apply( this, dmArgs ); + } else { + oldManip.apply( this, arguments ); + } + cloneIndex = 0; + if ( !appendToTmplItems ) { + jQuery.tmpl.complete( newTmplItems ); + } + return this; + } + }); + + jQuery.extend({ + // Return wrapped set of template items, obtained by rendering template against data. + tmpl: function( tmpl, data, options, parentItem ) { + var ret, topLevel = !parentItem; + if ( topLevel ) { + // This is a top-level tmpl call (not from a nested template using {{tmpl}}) + parentItem = topTmplItem; + tmpl = jQuery.template[tmpl] || jQuery.template( null, tmpl ); + wrappedItems = {}; // Any wrapped items will be rebuilt, since this is top level + } else if ( !tmpl ) { + // The template item is already associated with DOM - this is a refresh. + // Re-evaluate rendered template for the parentItem + tmpl = parentItem.tmpl; + newTmplItems[parentItem.key] = parentItem; + parentItem.nodes = []; + if ( parentItem.wrapped ) { + updateWrapped( parentItem, parentItem.wrapped ); + } + // Rebuild, without creating a new template item + return jQuery( build( parentItem, null, parentItem.tmpl( jQuery, parentItem ) )); + } + if ( !tmpl ) { + return []; // Could throw... + } + if ( typeof data === "function" ) { + data = data.call( parentItem || {} ); + } + if ( options && options.wrapped ) { + updateWrapped( options, options.wrapped ); + } + ret = jQuery.isArray( data ) ? + jQuery.map( data, function( dataItem ) { + return dataItem ? newTmplItem( options, parentItem, tmpl, dataItem ) : null; + }) : + [ newTmplItem( options, parentItem, tmpl, data ) ]; + return topLevel ? jQuery( build( parentItem, null, ret ) ) : ret; + }, + + // Return rendered template item for an element. + tmplItem: function( elem ) { + var tmplItem; + if ( elem instanceof jQuery ) { + elem = elem[0]; + } + while ( elem && elem.nodeType === 1 && !(tmplItem = jQuery.data( elem, "tmplItem" )) && (elem = elem.parentNode) ) {} + return tmplItem || topTmplItem; + }, + + // Set: + // Use $.template( name, tmpl ) to cache a named template, + // where tmpl is a template string, a script element or a jQuery instance wrapping a script element, etc. + // Use $( "selector" ).template( name ) to provide access by name to a script block template declaration. + + // Get: + // Use $.template( name ) to access a cached template. + // Also $( selectorToScriptBlock ).template(), or $.template( null, templateString ) + // will return the compiled template, without adding a name reference. + // If templateString includes at least one HTML tag, $.template( templateString ) is equivalent + // to $.template( null, templateString ) + template: function( name, tmpl ) { + if (tmpl) { + // Compile template and associate with name + if ( typeof tmpl === "string" ) { + // This is an HTML string being passed directly in. + tmpl = buildTmplFn( tmpl ); + } else if ( tmpl instanceof jQuery ) { + tmpl = tmpl[0] || {}; + } + if ( tmpl.nodeType ) { + // If this is a template block, use cached copy, or generate tmpl function and cache. + tmpl = jQuery.data( tmpl, "tmpl" ) || jQuery.data( tmpl, "tmpl", buildTmplFn( tmpl.innerHTML )); + // Issue: In IE, if the container element is not a script block, the innerHTML will remove quotes from attribute values whenever the value does not include white space. + // This means that foo="${x}" will not work if the value of x includes white space: foo="${x}" -> foo=value of x. + // To correct this, include space in tag: foo="${ x }" -> foo="value of x" + } + return typeof name === "string" ? (jQuery.template[name] = tmpl) : tmpl; + } + // Return named compiled template + return name ? (typeof name !== "string" ? jQuery.template( null, name ): + (jQuery.template[name] || + // If not in map, and not containing at least on HTML tag, treat as a selector. + // (If integrated with core, use quickExpr.exec) + jQuery.template( null, htmlExpr.test( name ) ? name : jQuery( name )))) : null; + }, + + encode: function( text ) { + // Do HTML encoding replacing < > & and ' and " by corresponding entities. + return ("" + text).split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'"); + } + }); + + jQuery.extend( jQuery.tmpl, { + tag: { + "tmpl": { + _default: { $2: "null" }, + open: "if($notnull_1){__=__.concat($item.nest($1,$2));}" + // tmpl target parameter can be of type function, so use $1, not $1a (so not auto detection of functions) + // This means that {{tmpl foo}} treats foo as a template (which IS a function). + // Explicit parens can be used if foo is a function that returns a template: {{tmpl foo()}}. + }, + "wrap": { + _default: { $2: "null" }, + open: "$item.calls(__,$1,$2);__=[];", + close: "call=$item.calls();__=call._.concat($item.wrap(call,__));" + }, + "each": { + _default: { $2: "$index, $value" }, + open: "if($notnull_1){$.each($1a,function($2){with(this){", + close: "}});}" + }, + "if": { + open: "if(($notnull_1) && $1a){", + close: "}" + }, + "else": { + _default: { $1: "true" }, + open: "}else if(($notnull_1) && $1a){" + }, + "html": { + // Unecoded expression evaluation. + open: "if($notnull_1){__.push($1a);}" + }, + "=": { + // Encoded expression evaluation. Abbreviated form is ${}. + _default: { $1: "$data" }, + open: "if($notnull_1){__.push($.encode($1a));}" + }, + "!": { + // Comment tag. Skipped by parser + open: "" + } + }, + + // This stub can be overridden, e.g. in jquery.tmplPlus for providing rendered events + complete: function( items ) { + newTmplItems = {}; + }, + + // Call this from code which overrides domManip, or equivalent + // Manage cloning/storing template items etc. + afterManip: function afterManip( elem, fragClone, callback ) { + // Provides cloned fragment ready for fixup prior to and after insertion into DOM + var content = fragClone.nodeType === 11 ? + jQuery.makeArray(fragClone.childNodes) : + fragClone.nodeType === 1 ? [fragClone] : []; + + // Return fragment to original caller (e.g. append) for DOM insertion + callback.call( elem, fragClone ); + + // Fragment has been inserted:- Add inserted nodes to tmplItem data structure. Replace inserted element annotations by jQuery.data. + storeTmplItems( content ); + cloneIndex++; + } + }); + + //========================== Private helper functions, used by code above ========================== + + function build( tmplItem, nested, content ) { + // Convert hierarchical content into flat string array + // and finally return array of fragments ready for DOM insertion + var frag, ret = content ? jQuery.map( content, function( item ) { + return (typeof item === "string") ? + // Insert template item annotations, to be converted to jQuery.data( "tmplItem" ) when elems are inserted into DOM. + (tmplItem.key ? item.replace( /(<\w+)(?=[\s>])(?![^>]*_tmplitem)([^>]*)/g, "$1 " + tmplItmAtt + "=\"" + tmplItem.key + "\" $2" ) : item) : + // This is a child template item. Build nested template. + build( item, tmplItem, item._ctnt ); + }) : + // If content is not defined, insert tmplItem directly. Not a template item. May be a string, or a string array, e.g. from {{html $item.html()}}. + tmplItem; + if ( nested ) { + return ret; + } + + // top-level template + ret = ret.join(""); + + // Support templates which have initial or final text nodes, or consist only of text + // Also support HTML entities within the HTML markup. + ret.replace( /^\s*([^<\s][^<]*)?(<[\w\W]+>)([^>]*[^>\s])?\s*$/, function( all, before, middle, after) { + frag = jQuery( middle ).get(); + + storeTmplItems( frag ); + if ( before ) { + frag = unencode( before ).concat(frag); + } + if ( after ) { + frag = frag.concat(unencode( after )); + } + }); + return frag ? frag : unencode( ret ); + } + + function unencode( text ) { + // Use createElement, since createTextNode will not render HTML entities correctly + var el = document.createElement( "div" ); + el.innerHTML = text; + return jQuery.makeArray(el.childNodes); + } + + // Generate a reusable function that will serve to render a template against data + function buildTmplFn( markup ) { + return new Function("jQuery","$item", + // Use the variable __ to hold a string array while building the compiled template. (See https://github.com/jquery/jquery-tmpl/issues#issue/10). + "var $=jQuery,call,__=[],$data=$item.data;" + + + // Introduce the data as local variables using with(){} + "with($data){__.push('" + + + // Convert the template into pure JavaScript + jQuery.trim(markup) + .replace( /([\\'])/g, "\\$1" ) + .replace( /[\r\t\n]/g, " " ) + .replace( /\$\{([^\}]*)\}/g, "{{= $1}}" ) + .replace( /\{\{(\/?)(\w+|.)(?:\(((?:[^\}]|\}(?!\}))*?)?\))?(?:\s+(.*?)?)?(\(((?:[^\}]|\}(?!\}))*?)\))?\s*\}\}/g, + function( all, slash, type, fnargs, target, parens, args ) { + var tag = jQuery.tmpl.tag[ type ], def, expr, exprAutoFnDetect; + if ( !tag ) { + throw "Unknown template tag: " + type; + } + def = tag._default || []; + if ( parens && !/\w$/.test(target)) { + target += parens; + parens = ""; + } + if ( target ) { + target = unescape( target ); + args = args ? ("," + unescape( args ) + ")") : (parens ? ")" : ""); + // Support for target being things like a.toLowerCase(); + // In that case don't call with template item as 'this' pointer. Just evaluate... + expr = parens ? (target.indexOf(".") > -1 ? target + unescape( parens ) : ("(" + target + ").call($item" + args)) : target; + exprAutoFnDetect = parens ? expr : "(typeof(" + target + ")==='function'?(" + target + ").call($item):(" + target + "))"; + } else { + exprAutoFnDetect = expr = def.$1 || "null"; + } + fnargs = unescape( fnargs ); + return "');" + + tag[ slash ? "close" : "open" ] + .split( "$notnull_1" ).join( target ? "typeof(" + target + ")!=='undefined' && (" + target + ")!=null" : "true" ) + .split( "$1a" ).join( exprAutoFnDetect ) + .split( "$1" ).join( expr ) + .split( "$2" ).join( fnargs || def.$2 || "" ) + + "__.push('"; + }) + + "');}return __;" + ); + } + function updateWrapped( options, wrapped ) { + // Build the wrapped content. + options._wrap = build( options, true, + // Suport imperative scenario in which options.wrapped can be set to a selector or an HTML string. + jQuery.isArray( wrapped ) ? wrapped : [htmlExpr.test( wrapped ) ? wrapped : jQuery( wrapped ).html()] + ).join(""); + } + + function unescape( args ) { + return args ? args.replace( /\\'/g, "'").replace(/\\\\/g, "\\" ) : null; + } + function outerHtml( elem ) { + var div = document.createElement("div"); + div.appendChild( elem.cloneNode(true) ); + return div.innerHTML; + } + + // Store template items in jQuery.data(), ensuring a unique tmplItem data data structure for each rendered template instance. + function storeTmplItems( content ) { + var keySuffix = "_" + cloneIndex, elem, elems, newClonedItems = {}, i, l, m; + for ( i = 0, l = content.length; i < l; i++ ) { + if ( (elem = content[i]).nodeType !== 1 ) { + continue; + } + elems = elem.getElementsByTagName("*"); + for ( m = elems.length - 1; m >= 0; m-- ) { + processItemKey( elems[m] ); + } + processItemKey( elem ); + } + function processItemKey( el ) { + var pntKey, pntNode = el, pntItem, tmplItem, key; + // Ensure that each rendered template inserted into the DOM has its own template item, + if ( (key = el.getAttribute( tmplItmAtt ))) { + while ( pntNode.parentNode && (pntNode = pntNode.parentNode).nodeType === 1 && !(pntKey = pntNode.getAttribute( tmplItmAtt ))) { } + if ( pntKey !== key ) { + // The next ancestor with a _tmplitem expando is on a different key than this one. + // So this is a top-level element within this template item + // Set pntNode to the key of the parentNode, or to 0 if pntNode.parentNode is null, or pntNode is a fragment. + pntNode = pntNode.parentNode ? (pntNode.nodeType === 11 ? 0 : (pntNode.getAttribute( tmplItmAtt ) || 0)) : 0; + if ( !(tmplItem = newTmplItems[key]) ) { + // The item is for wrapped content, and was copied from the temporary parent wrappedItem. + tmplItem = wrappedItems[key]; + tmplItem = newTmplItem( tmplItem, newTmplItems[pntNode]||wrappedItems[pntNode] ); + tmplItem.key = ++itemKey; + newTmplItems[itemKey] = tmplItem; + } + if ( cloneIndex ) { + cloneTmplItem( key ); + } + } + el.removeAttribute( tmplItmAtt ); + } else if ( cloneIndex && (tmplItem = jQuery.data( el, "tmplItem" )) ) { + // This was a rendered element, cloned during append or appendTo etc. + // TmplItem stored in jQuery data has already been cloned in cloneCopyEvent. We must replace it with a fresh cloned tmplItem. + cloneTmplItem( tmplItem.key ); + newTmplItems[tmplItem.key] = tmplItem; + pntNode = jQuery.data( el.parentNode, "tmplItem" ); + pntNode = pntNode ? pntNode.key : 0; + } + if ( tmplItem ) { + pntItem = tmplItem; + // Find the template item of the parent element. + // (Using !=, not !==, since pntItem.key is number, and pntNode may be a string) + while ( pntItem && pntItem.key != pntNode ) { + // Add this element as a top-level node for this rendered template item, as well as for any + // ancestor items between this item and the item of its parent element + pntItem.nodes.push( el ); + pntItem = pntItem.parent; + } + // Delete content built during rendering - reduce API surface area and memory use, and avoid exposing of stale data after rendering... + delete tmplItem._ctnt; + delete tmplItem._wrap; + // Store template item as jQuery data on the element + jQuery.data( el, "tmplItem", tmplItem ); + } + function cloneTmplItem( key ) { + key = key + keySuffix; + tmplItem = newClonedItems[key] = + (newClonedItems[key] || newTmplItem( tmplItem, newTmplItems[tmplItem.parent.key + keySuffix] || tmplItem.parent )); + } + } + } + + //---- Helper functions for template item ---- + + function tiCalls( content, tmpl, data, options ) { + if ( !content ) { + return stack.pop(); + } + stack.push({ _: content, tmpl: tmpl, item:this, data: data, options: options }); + } + + function tiNest( tmpl, data, options ) { + // nested template, using {{tmpl}} tag + return jQuery.tmpl( jQuery.template( tmpl ), data, options, this ); + } + + function tiWrap( call, wrapped ) { + // nested template, using {{wrap}} tag + var options = call.options || {}; + options.wrapped = wrapped; + // Apply the template, which may incorporate wrapped content, + return jQuery.tmpl( jQuery.template( call.tmpl ), call.data, options, call.item ); + } + + function tiHtml( filter, textOnly ) { + var wrapped = this._wrap; + return jQuery.map( + jQuery( jQuery.isArray( wrapped ) ? wrapped.join("") : wrapped ).filter( filter || "*" ), + function(e) { + return textOnly ? + e.innerText || e.textContent : + e.outerHTML || outerHtml(e); + }); + } + + function tiUpdate() { + var coll = this.nodes; + jQuery.tmpl( null, null, null, this).insertBefore( coll[0] ); + jQuery( coll ).remove(); + } +})( jQuery ); \ No newline at end of file diff --git a/umbraco/presentation/umbraco/plugins/uGoLive/knockout-1.2.1.js b/umbraco/presentation/umbraco/plugins/uGoLive/knockout-1.2.1.js new file mode 100644 index 0000000000..225d7de7a7 --- /dev/null +++ b/umbraco/presentation/umbraco/plugins/uGoLive/knockout-1.2.1.js @@ -0,0 +1,194 @@ +// Knockout JavaScript library v1.2.1 +// (c) Steven Sanderson - http://knockoutjs.com/ +// License: MIT (http://www.opensource.org/licenses/mit-license.php) + +(function (window, undefined) { + function c(e) { throw e; } var m = void 0, o = null, p = window.ko = {}; p.b = function (e, d) { for (var b = e.split("."), a = window, f = 0; f < b.length - 1; f++) a = a[b[f]]; a[b[b.length - 1]] = d }; p.i = function (e, d, b) { e[d] = b }; + p.a = new function () { + function e(a, b) { if (a.tagName != "INPUT" || !a.type) return !1; if (b.toLowerCase() != "click") return !1; var d = a.type.toLowerCase(); return d == "checkbox" || d == "radio" } var d = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, b = /MSIE 6/i.test(navigator.userAgent), a = /MSIE 7/i.test(navigator.userAgent), f = {}, h = {}; f[/Firefox\/2/i.test(navigator.userAgent) ? "KeyboardEvent" : "UIEvents"] = ["keyup", "keydown", "keypress"]; f.MouseEvents = ["click", "dblclick", "mousedown", "mouseup", "mousemove", "mouseover", "mouseout", "mouseenter", "mouseleave"]; + for (var g in f) { var i = f[g]; if (i.length) for (var k = 0, j = i.length; k < j; k++) h[i[k]] = g } return { ca: ["authenticity_token", /^__RequestVerificationToken(_.*)?$/], g: function (a, b) { for (var d = 0, e = a.length; d < e; d++) b(a[d]) }, h: function (a, b) { if (typeof a.indexOf == "function") return a.indexOf(b); for (var d = 0, e = a.length; d < e; d++) if (a[d] === b) return d; return -1 }, xa: function (a, b, d) { for (var e = 0, f = a.length; e < f; e++) if (b.call(d, a[e])) return a[e]; return o }, N: function (a, b) { var d = p.a.h(a, b); d >= 0 && a.splice(d, 1) }, L: function (a) { + for (var a = +a || [], b = [], d = 0, e = a.length; d < e; d++) p.a.h(b, a[d]) < 0 && b.push(a[d]); return b + }, M: function (a, b) { for (var a = a || [], d = [], e = 0, f = a.length; e < f; e++) d.push(b(a[e])); return d }, K: function (a, b) { for (var a = a || [], d = [], e = 0, f = a.length; e < f; e++) b(a[e]) && d.push(a[e]); return d }, u: function (a, b) { for (var d = 0, e = b.length; d < e; d++) a.push(b[d]) }, Q: function (a) { for (; a.firstChild; ) p.removeNode(a.firstChild) }, Xa: function (a, b) { p.a.Q(a); b && p.a.g(b, function (b) { a.appendChild(b) }) }, ka: function (a, b) { + var d = a.nodeType ? [a] : a; if (d.length > 0) { + for (var e = +d[0], f = e.parentNode, h = 0, g = b.length; h < g; h++) f.insertBefore(b[h], e); h = 0; for (g = d.length; h < g; h++) p.removeNode(d[h]) + } + }, ma: function (a, b) { navigator.userAgent.indexOf("MSIE 6") >= 0 ? a.setAttribute("selected", b) : a.selected = b }, da: function (a, b) { if (!a || a.nodeType != 1) return []; var d = []; a.getAttribute(b) !== o && d.push(a); for (var e = a.getElementsByTagName("*"), f = 0, h = e.length; f < h; f++) e[f].getAttribute(b) !== o && d.push(e[f]); return d }, k: function (a) { return (a || "").replace(d, "") }, ab: function (a, b) { + for (var d = [], e = (a || "").split(b), +f = 0, h = e.length; f < h; f++) { var g = p.a.k(e[f]); g !== "" && d.push(g) } return d + }, Za: function (a, b) { a = a || ""; if (b.length > a.length) return !1; return a.substring(0, b.length) === b }, Ha: function (a, b) { if (b === m) return (new Function("return " + a))(); return (new Function("sc", "with(sc) { return (" + a + ") }"))(b) }, Fa: function (a, b) { if (b.compareDocumentPosition) return (b.compareDocumentPosition(a) & 16) == 16; for (; a != o; ) { if (a == b) return !0; a = a.parentNode } return !1 }, P: function (a) { return p.a.Fa(a, document) }, t: function (a, b, d) { + if (typeof jQuery != +"undefined") { if (e(a, b)) var f = d, d = function (a, b) { var d = this.checked; if (b) this.checked = b.Aa !== !0; f.call(this, a); this.checked = d }; jQuery(a).bind(b, d) } else typeof a.addEventListener == "function" ? a.addEventListener(b, d, !1) : typeof a.attachEvent != "undefined" ? a.attachEvent("on" + b, function (b) { d.call(a, b) }) : c(Error("Browser doesn't support addEventListener or attachEvent")) + }, qa: function (a, b) { + (!a || !a.nodeType) && c(Error("element must be a DOM node when calling triggerEvent")); if (typeof jQuery != "undefined") { + var d = +[]; e(a, b) && d.push({ Aa: a.checked }); jQuery(a).trigger(b, d) + } else if (typeof document.createEvent == "function") typeof a.dispatchEvent == "function" ? (d = document.createEvent(h[b] || "HTMLEvents"), d.initEvent(b, !0, !0, window, 0, 0, 0, 0, 0, !1, !1, !1, !1, 0, a), a.dispatchEvent(d)) : c(Error("The supplied element doesn't support dispatchEvent")); else if (typeof a.fireEvent != "undefined") { + if (b == "click" && a.tagName == "INPUT" && (a.type.toLowerCase() == "checkbox" || a.type.toLowerCase() == "radio")) a.checked = a.checked !== !0; a.fireEvent("on" + +b) + } else c(Error("Browser doesn't support triggering events")) + }, d: function (a) { return p.C(a) ? a() : a }, Ea: function (a, b) { return p.a.h((a.className || "").split(/\s+/), b) >= 0 }, pa: function (a, b, d) { var e = p.a.Ea(a, b); if (d && !e) a.className = (a.className || "") + " " + b; else if (e && !d) { for (var d = (a.className || "").split(/\s+/), e = "", f = 0; f < d.length; f++) d[f] != b && (e += d[f] + " "); a.className = p.a.k(e) } }, Ua: function (a, b) { for (var a = p.a.d(a), b = p.a.d(b), d = [], e = a; e <= b; e++) d.push(e); return d }, U: function (a) { + for (var b = [], d = 0, e = a.length; d < +e; d++) b.push(a[d]); return b + }, S: b, Ma: a, ea: function (a, b) { for (var d = p.a.U(a.getElementsByTagName("INPUT")).concat(p.a.U(a.getElementsByTagName("TEXTAREA"))), e = typeof b == "string" ? function (a) { return a.name === b } : function (a) { return b.test(a.name) }, f = [], h = d.length - 1; h >= 0; h--) e(d[h]) && f.push(d[h]); return f }, F: function (a) { if (typeof a == "string" && (a = p.a.k(a))) { if (window.JSON && window.JSON.parse) return window.JSON.parse(a); return (new Function("return " + a))() } return o }, Y: function (a) { + (typeof JSON == "undefined" || typeof JSON.stringify == +"undefined") && c(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 JSON.stringify(p.a.d(a)) + }, Ta: function (a, b, d) { + var d = d || {}, e = d.params || {}, f = d.includeFields || this.ca, h = a; if (typeof a == "object" && a.tagName == "FORM") for (var h = a.action, g = f.length - 1; g >= 0; g--) for (var i = p.a.ea(a, f[g]), k = i.length - 1; k >= 0; k--) e[i[k].name] = i[k].value; var b = p.a.d(b), +j = document.createElement("FORM"); j.style.display = "none"; j.action = h; j.method = "post"; for (var u in b) a = document.createElement("INPUT"), a.name = u, a.value = p.a.Y(p.a.d(b[u])), j.appendChild(a); for (u in e) a = document.createElement("INPUT"), a.name = u, a.value = e[u], j.appendChild(a); document.body.appendChild(j); d.submitter ? d.submitter(j) : j.submit(); setTimeout(function () { j.parentNode.removeChild(j) }, 0) + } + } + }; p.b("ko.utils", p.a); p.b("ko.utils.arrayForEach", p.a.g); p.b("ko.utils.arrayFirst", p.a.xa); + p.b("ko.utils.arrayFilter", p.a.K); p.b("ko.utils.arrayGetDistinctValues", p.a.L); p.b("ko.utils.arrayIndexOf", p.a.h); p.b("ko.utils.arrayMap", p.a.M); p.b("ko.utils.arrayPushAll", p.a.u); p.b("ko.utils.arrayRemoveItem", p.a.N); p.b("ko.utils.fieldsIncludedWithJsonPost", p.a.ca); p.b("ko.utils.getElementsHavingAttribute", p.a.da); p.b("ko.utils.getFormFields", p.a.ea); p.b("ko.utils.postJson", p.a.Ta); p.b("ko.utils.parseJson", p.a.F); p.b("ko.utils.registerEventHandler", p.a.t); p.b("ko.utils.stringifyJson", p.a.Y); + p.b("ko.utils.range", p.a.Ua); p.b("ko.utils.toggleDomNodeCssClass", p.a.pa); p.b("ko.utils.triggerEvent", p.a.qa); p.b("ko.utils.unwrapObservable", p.a.d); Function.prototype.bind || (Function.prototype.bind = function (e) { var d = this, b = Array.prototype.slice.call(arguments), e = b.shift(); return function () { return d.apply(e, b.concat(Array.prototype.slice.call(arguments))) } }); + p.a.e = new function () { var e = 0, d = "__ko__" + (new Date).getTime(), b = {}; return { get: function (a, b) { var d = p.a.e.getAll(a, !1); return d === m ? m : d[b] }, set: function (a, b, d) { d === m && p.a.e.getAll(a, !1) === m || (p.a.e.getAll(a, !0)[b] = d) }, getAll: function (a, f) { var h = a[d]; if (!h) { if (!f) return; h = a[d] = "ko" + e++; b[h] = {} } return b[h] }, clear: function (a) { var e = a[d]; e && (delete b[e], a[d] = o) } } }; + p.a.p = new function () { + function e(a, d) { var e = p.a.e.get(a, b); e === m && d && (e = [], p.a.e.set(a, b, e)); return e } function d(a) { var b = e(a, !1); if (b) for (var b = b.slice(0), d = 0; d < b.length; d++) b[d](a); p.a.e.clear(a); typeof jQuery == "function" && typeof jQuery.cleanData == "function" && jQuery.cleanData([a]) } var b = "__ko_domNodeDisposal__" + (new Date).getTime(); return { ba: function (a, b) { typeof b != "function" && c(Error("Callback must be a function")); e(a, !0).push(b) }, ja: function (a, d) { + var h = e(a, !1); h && (p.a.N(h, d), h.length == 0 && p.a.e.set(a, +b, m)) + }, v: function (a) { if (!(a.nodeType != 1 && a.nodeType != 9)) { d(a); var b = []; p.a.u(b, a.getElementsByTagName("*")); for (var a = 0, e = b.length; a < e; a++) d(b[a]) } }, removeNode: function (a) { p.v(a); a.parentNode && a.parentNode.removeChild(a) } + } + }; p.v = p.a.p.v; p.removeNode = p.a.p.removeNode; p.b("ko.cleanNode", p.v); p.b("ko.removeNode", p.removeNode); p.b("ko.utils.domNodeDisposal", p.a.p); p.b("ko.utils.domNodeDisposal.addDisposeCallback", p.a.p.ba); p.b("ko.utils.domNodeDisposal.removeDisposeCallback", p.a.p.ja); + p.a.Sa = function (e) { if (typeof jQuery != "undefined") e = jQuery.clean([e]); else { var d = p.a.k(e).toLowerCase(), b = document.createElement("div"), d = d.match(/^<(thead|tbody|tfoot)/) && [1, "", "
"] || !d.indexOf("", ""] || (!d.indexOf("", ""] || [0, "", ""]; for (b.innerHTML = d[1] + e + d[2]; d[0]--; ) b = b.lastChild; e = p.a.U(b.childNodes) } return e }; + p.a.Ya = function (e, d) { p.a.Q(e); if (d !== o && d !== m) if (typeof d != "string" && (d = d.toString()), typeof jQuery != "undefined") jQuery(e).html(d); else for (var b = p.a.Sa(d), a = 0; a < b.length; a++) e.appendChild(b[a]) }; + p.l = function () { + function e() { return ((1 + Math.random()) * 4294967296 | 0).toString(16).substring(1) } function d(a, b) { if (a) if (a.nodeType == 8) { var e = p.l.ha(a.nodeValue); e != o && b.push({ Da: a, Pa: e }) } else if (a.nodeType == 1) for (var e = 0, g = a.childNodes, i = g.length; e < i; e++) d(g[e], b) } var b = {}; return { V: function (a) { typeof a != "function" && c(Error("You can only pass a function to ko.memoization.memoize()")); var d = e() + e(); b[d] = a; return "<\!--[ko_memo:" + d + "]--\>" }, ra: function (a, d) { + var e = b[a]; e === m && c(Error("Couldn't find any memo with ID " + +a + ". Perhaps it's already been unmemoized.")); try { return e.apply(o, d || []), !0 } finally { delete b[a] } + }, sa: function (a, b) { var e = []; d(a, e); for (var g = 0, i = e.length; g < i; g++) { var k = e[g].Da, j = [k]; b && p.a.u(j, b); p.l.ra(e[g].Pa, j); k.nodeValue = ""; k.parentNode && k.parentNode.removeChild(k) } }, ha: function (a) { return (a = a.match(/^\[ko_memo\:(.*?)\]$/)) ? a[1] : o } + } + } (); p.b("ko.memoization", p.l); p.b("ko.memoization.memoize", p.l.V); p.b("ko.memoization.unmemoize", p.l.ra); p.b("ko.memoization.parseMemoText", p.l.ha); + p.b("ko.memoization.unmemoizeDomNodeAndDescendants", p.l.sa); p.$a = function (e, d) { this.za = e; this.n = function () { this.La = !0; d() } .bind(this); p.i(this, "dispose", this.n) }; p.Z = function () { var e = []; this.$ = function (d, b) { var a = b ? d.bind(b) : d, f = new p.$a(a, function () { p.a.N(e, f) }); e.push(f); return f }; this.z = function (d) { p.a.g(e.slice(0), function (b) { b && b.La !== !0 && b.za(d) }) }; this.Ja = function () { return e.length }; p.i(this, "subscribe", this.$); p.i(this, "notifySubscribers", this.z); p.i(this, "getSubscriptionsCount", this.Ja) }; + p.ga = function (e) { return typeof e.$ == "function" && typeof e.z == "function" }; p.b("ko.subscribable", p.Z); p.b("ko.isSubscribable", p.ga); p.A = function () { var e = []; return { ya: function () { e.push([]) }, end: function () { return e.pop() }, ia: function (d) { p.ga(d) || c("Only subscribable things can act as dependencies"); e.length > 0 && e[e.length - 1].push(d) } } } (); var x = { undefined: !0, "boolean": !0, number: !0, string: !0 }; function y(e, d) { return e === o || typeof e in x ? e === d : !1 } + p.s = function (e) { function d() { if (arguments.length > 0) { if (!d.equalityComparer || !d.equalityComparer(b, arguments[0])) b = arguments[0], d.z(b); return this } else return p.A.ia(d), b } var b = e; d.o = p.s; d.H = function () { d.z(b) }; d.equalityComparer = y; p.Z.call(d); p.i(d, "valueHasMutated", d.H); return d }; p.C = function (e) { if (e === o || e === m || e.o === m) return !1; if (e.o === p.s) return !0; return p.C(e.o) }; p.D = function (e) { if (typeof e == "function" && e.o === p.s) return !0; if (typeof e == "function" && e.o === p.j && e.Ka) return !0; return !1 }; + p.b("ko.observable", p.s); p.b("ko.isObservable", p.C); p.b("ko.isWriteableObservable", p.D); + p.Ra = function (e) { + arguments.length == 0 && (e = []); e !== o && e !== m && !("length" in e) && c(Error("The argument passed when initializing an observable array must be an array, or null, or undefined.")); var d = new p.s(e); p.a.g(["pop", "push", "reverse", "shift", "sort", "splice", "unshift"], function (b) { d[b] = function () { var a = d(), a = a[b].apply(a, arguments); d.H(); return a } }); p.a.g(["slice"], function (b) { d[b] = function () { var a = d(); return a[b].apply(a, arguments) } }); d.remove = function (b) { + for (var a = d(), e = [], h = [], g = typeof b == "function" ? +b : function (a) { return a === b }, i = 0, k = a.length; i < k; i++) { var j = a[i]; g(j) ? h.push(j) : e.push(j) } d(e); return h + }; d.Va = function (b) { if (b === m) { var a = d(); d([]); return a } if (!b) return []; return d.remove(function (a) { return p.a.h(b, a) >= 0 }) }; d.O = function (b) { for (var a = d(), e = typeof b == "function" ? b : function (a) { return a === b }, h = a.length - 1; h >= 0; h--) e(a[h]) && (a[h]._destroy = !0); d.H() }; d.Ca = function (b) { if (b === m) return d.O(function () { return !0 }); if (!b) return []; return d.O(function (a) { return p.a.h(b, a) >= 0 }) }; d.indexOf = function (b) { + var a = +d(); return p.a.h(a, b) + }; d.replace = function (b, a) { var e = d.indexOf(b); e >= 0 && (d()[e] = a, d.H()) }; p.i(d, "remove", d.remove); p.i(d, "removeAll", d.Va); p.i(d, "destroy", d.O); p.i(d, "destroyAll", d.Ca); p.i(d, "indexOf", d.indexOf); return d + }; p.b("ko.observableArray", p.Ra); + p.j = function (e, d, b) { + function a() { p.a.g(n, function (a) { a.n() }); n = [] } function f(b) { a(); p.a.g(b, function (a) { n.push(a.$(h)) }) } function h() { if (k && typeof b.disposeWhen == "function" && b.disposeWhen()) g.n(); else { try { p.A.ya(), i = b.owner ? b.read.call(b.owner) : b.read() } finally { var a = p.a.L(p.A.end()); f(a) } g.z(i); k = !0 } } function g() { + if (arguments.length > 0) if (typeof b.write === "function") { var a = arguments[0]; b.owner ? b.write.call(b.owner, a) : b.write(a) } else c("Cannot write a value to a dependentObservable unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters."); + else return k || h(), p.A.ia(g), i + } var i, k = !1; e && typeof e == "object" ? b = e : (b = b || {}, b.read = e || b.read, b.owner = d || b.owner); typeof b.read != "function" && c("Pass a function that returns the value of the dependentObservable"); var j = typeof b.disposeWhenNodeIsRemoved == "object" ? b.disposeWhenNodeIsRemoved : o, l = o; if (j) { l = function () { g.n() }; p.a.p.ba(j, l); var q = b.disposeWhen; b.disposeWhen = function () { return !p.a.P(j) || typeof q == "function" && q() } } var n = []; g.o = p.j; g.Ia = function () { return n.length }; g.Ka = typeof b.write === "function"; + g.n = function () { j && p.a.p.ja(j, l); a() }; p.Z.call(g); b.deferEvaluation !== !0 && h(); p.i(g, "dispose", g.n); p.i(g, "getDependenciesCount", g.Ia); return g + }; p.j.o = p.s; p.b("ko.dependentObservable", p.j); + (function () { + function e(a, f, h) { h = h || new b; a = f(a); if (!(typeof a == "object" && a !== o && a !== m)) return a; var g = a instanceof Array ? [] : {}; h.save(a, g); d(a, function (b) { var d = f(a[b]); switch (typeof d) { case "boolean": case "number": case "string": case "function": g[b] = d; break; case "object": case "undefined": var j = h.get(d); g[b] = j !== m ? j : e(d, f, h) } }); return g } function d(a, b) { if (a instanceof Array) for (var d = 0; d < a.length; d++) b(d); else for (d in a) b(d) } function b() { + var a = [], b = []; this.save = function (d, e) { + var i = p.a.h(a, d); i >= 0 ? +b[i] = e : (a.push(d), b.push(e)) + }; this.get = function (d) { d = p.a.h(a, d); return d >= 0 ? b[d] : m } + } p.oa = function (a) { arguments.length == 0 && c(Error("When calling ko.toJS, pass the object you want to convert.")); return e(a, function (a) { for (var b = 0; p.C(a) && b < 10; b++) a = a(); return a }) }; p.toJSON = function (a) { a = p.oa(a); return p.a.Y(a) } + })(); p.b("ko.toJS", p.oa); p.b("ko.toJSON", p.toJSON); + p.f = { m: function (e) { if (e.tagName == "OPTION") { if (e.__ko__hasDomDataOptionValue__ === !0) return p.a.e.get(e, p.c.options.W); return e.getAttribute("value") } else return e.tagName == "SELECT" ? e.selectedIndex >= 0 ? p.f.m(e.options[e.selectedIndex]) : m : e.value }, I: function (e, d) { + if (e.tagName == "OPTION") switch (typeof d) { + case "string": case "number": p.a.e.set(e, p.c.options.W, m); "__ko__hasDomDataOptionValue__" in e && delete e.__ko__hasDomDataOptionValue__; e.value = d; break; default: p.a.e.set(e, p.c.options.W, d), e.__ko__hasDomDataOptionValue__ = +!0, e.value = "" + } else if (e.tagName == "SELECT") for (var b = e.options.length - 1; b >= 0; b--) { if (p.f.m(e.options[b]) == d) { e.selectedIndex = b; break } } else { if (d === o || d === m) d = ""; e.value = d } + } + }; p.b("ko.selectExtensions", p.f); p.b("ko.selectExtensions.readValue", p.f.m); p.b("ko.selectExtensions.writeValue", p.f.I); + p.r = function () { + function e(a, b) { return a.replace(d, function (a, d) { return b[d] }) } var d = /\[ko_token_(\d+)\]/g, b = /^[\_$a-z][\_$a-z0-9]*(\[.*?\])*(\.[\_$a-z][\_$a-z0-9]*(\[.*?\])*)*$/i, a = ["true", "false"]; return { F: function (a) { + a = p.a.k(a); if (a.length < 3) return {}; for (var b = [], d = o, i, k = a.charAt(0) == "{" ? 1 : 0; k < a.length; k++) { + var j = a.charAt(k); if (d === o) switch (j) { case '"': case "'": case "/": d = k; i = j; break; case "{": d = k; i = "}"; break; case "[": d = k, i = "]" } else if (j == i) { + j = a.substring(d, k + 1); b.push(j); var l = "[ko_token_" + (b.length - +1) + "]", a = a.substring(0, d) + l + a.substring(k + 1); k -= j.length - l.length; d = o + } + } d = {}; a = a.split(","); i = 0; for (k = a.length; i < k; i++) { var l = a[i], q = l.indexOf(":"); q > 0 && q < l.length - 1 && (j = p.a.k(l.substring(0, q)), l = p.a.k(l.substring(q + 1)), j.charAt(0) == "{" && (j = j.substring(1)), l.charAt(l.length - 1) == "}" && (l = l.substring(0, l.length - 1)), j = p.a.k(e(j, b)), l = p.a.k(e(l, b)), d[j] = l) } return d + }, R: function (d) { + var e = p.r.F(d), g = [], i; for (i in e) { + var k = e[i], j; j = k; j = p.a.h(a, p.a.k(j).toLowerCase()) >= 0 ? !1 : j.match(b) !== o; j && (g.length > 0 && g.push(", "), +g.push(i + " : function(__ko_value) { " + k + " = __ko_value; }")) + } g.length > 0 && (d = d + ", '_ko_property_writers' : { " + g.join("") + " } "); return d + } + } + } (); p.b("ko.jsonExpressionRewriting", p.r); p.b("ko.jsonExpressionRewriting.parseJson", p.r.F); p.b("ko.jsonExpressionRewriting.insertPropertyAccessorsIntoJson", p.r.R); p.c = {}; + p.J = function (e, d, b, a) { + function f(a) { return function () { return i[a] } } function h() { return i } var g = !0, a = a || "data-bind", i; new p.j(function () { + var k; if (!(k = typeof d == "function" ? d() : d)) { var j = e.getAttribute(a); try { var l = " { " + p.r.R(j) + " } "; k = p.a.Ha(l, b === o ? window : b) } catch (q) { c(Error("Unable to parse binding attribute.\nMessage: " + q + ";\nAttribute value: " + j)) } } i = k; if (g) for (var n in i) p.c[n] && typeof p.c[n].init == "function" && (0, p.c[n].init)(e, f(n), h, b); for (n in i) p.c[n] && typeof p.c[n].update == "function" && (0, p.c[n].update)(e, +f(n), h, b) + }, o, { disposeWhenNodeIsRemoved: e }); g = !1 + }; p.ua = function (e, d) { d && d.nodeType == m && c(Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node (note: this is a breaking change since KO version 1.05)")); var d = d || window.document.body, b = p.a.da(d, "data-bind"); p.a.g(b, function (a) { p.J(a, o, e) }) }; p.b("ko.bindingHandlers", p.c); p.b("ko.applyBindings", p.ua); p.b("ko.applyBindingsToNode", p.J); + p.a.g(["click"], function (e) { p.c[e] = { init: function (d, b, a, f) { return p.c.event.init.call(this, d, function () { var a = {}; a[e] = b(); return a }, a, f) } } }); p.c.event = { init: function (e, d, b, a) { var f = d() || {}, h; for (h in f) (function () { var f = h; typeof f == "string" && p.a.t(e, f, function (e) { var h, j = d()[f]; if (j) { var l = b(); try { h = j.apply(a, arguments) } finally { if (h !== !0) e.preventDefault ? e.preventDefault() : e.returnValue = !1 } if (l[f + "Bubble"] === !1) e.cancelBubble = !0, e.stopPropagation && e.stopPropagation() } }) })() } }; + p.c.submit = { init: function (e, d, b, a) { typeof d() != "function" && c(Error("The value for a submit binding must be a function to invoke on submit")); p.a.t(e, "submit", function (b) { var h, g = d(); try { h = g.call(a, e) } finally { if (h !== !0) b.preventDefault ? b.preventDefault() : b.returnValue = !1 } }) } }; p.c.visible = { update: function (e, d) { var b = p.a.d(d()), a = e.style.display != "none"; if (b && !a) e.style.display = ""; else if (!b && a) e.style.display = "none" } }; + p.c.enable = { update: function (e, d) { var b = p.a.d(d()); if (b && e.disabled) e.removeAttribute("disabled"); else if (!b && !e.disabled) e.disabled = !0 } }; p.c.disable = { update: function (e, d) { p.c.enable.update(e, function () { return !p.a.d(d()) }) } }; + p.c.value = { init: function (e, d, b) { var a = ["change"], f = b().valueUpdate; f && (typeof f == "string" && (f = [f]), p.a.u(a, f), a = p.a.L(a)); p.a.g(a, function (a) { var f = !1; p.a.Za(a, "after") && (f = !0, a = a.substring(5)); var i = f ? function (a) { setTimeout(a, 0) } : function (a) { a() }; p.a.t(e, a, function () { i(function () { var a = d(), f = p.f.m(e); p.D(a) ? a(f) : (a = b(), a._ko_property_writers && a._ko_property_writers.value && a._ko_property_writers.value(f)) }) }) }) }, update: function (e, d) { + var b = p.a.d(d()), a = p.f.m(e), f = b != a; b === 0 && a !== 0 && a !== "0" && (f = !0); + f && (a = function () { p.f.I(e, b) }, a(), e.tagName == "SELECT" && setTimeout(a, 0)); e.tagName == "SELECT" && (a = p.f.m(e), a !== b && p.a.qa(e, "change")) + } + }; + p.c.options = { update: function (e, d, b) { + e.tagName != "SELECT" && c(Error("options binding applies only to SELECT elements")); var a = p.a.M(p.a.K(e.childNodes, function (a) { return a.tagName && a.tagName == "OPTION" && a.selected }), function (a) { return p.f.m(a) || a.innerText || a.textContent }), f = e.scrollTop, h = p.a.d(d()); p.a.Q(e); if (h) { + var g = b(); typeof h.length != "number" && (h = [h]); if (g.optionsCaption) { var i = document.createElement("OPTION"); i.innerHTML = g.optionsCaption; p.f.I(i, m); e.appendChild(i) } b = 0; for (d = h.length; b < d; b++) { + var i = +document.createElement("OPTION"), k = typeof g.optionsValue == "string" ? h[b][g.optionsValue] : h[b], k = p.a.d(k); p.f.I(i, k); var j = g.optionsText; optionText = typeof j == "function" ? j(h[b]) : typeof j == "string" ? h[b][j] : k; if (optionText === o || optionText === m) optionText = ""; optionText = p.a.d(optionText).toString(); typeof i.innerText == "string" ? i.innerText = optionText : i.textContent = optionText; e.appendChild(i) + } h = e.getElementsByTagName("OPTION"); b = g = 0; for (d = h.length; b < d; b++) p.a.h(a, p.f.m(h[b])) >= 0 && (p.a.ma(h[b], !0), g++); if (f) e.scrollTop = +f + } + } + }; p.c.options.W = "__ko.bindingHandlers.options.optionValueDomData__"; + p.c.selectedOptions = { fa: function (e) { for (var d = [], e = e.childNodes, b = 0, a = e.length; b < a; b++) { var f = e[b]; f.tagName == "OPTION" && f.selected && d.push(p.f.m(f)) } return d }, init: function (e, d, b) { p.a.t(e, "change", function () { var a = d(); p.D(a) ? a(p.c.selectedOptions.fa(this)) : (a = b(), a._ko_property_writers && a._ko_property_writers.value && a._ko_property_writers.value(p.c.selectedOptions.fa(this))) }) }, update: function (e, d) { + e.tagName != "SELECT" && c(Error("values binding applies only to SELECT elements")); var b = p.a.d(d()); if (b && +typeof b.length == "number") for (var a = e.childNodes, f = 0, h = a.length; f < h; f++) { var g = a[f]; g.tagName == "OPTION" && p.a.ma(g, p.a.h(b, p.f.m(g)) >= 0) } + } + }; p.c.text = { update: function (e, d) { var b = p.a.d(d()); if (b === o || b === m) b = ""; typeof e.innerText == "string" ? e.innerText = b : e.textContent = b } }; p.c.html = { update: function (e, d) { var b = p.a.d(d()); p.a.Ya(e, b) } }; p.c.css = { update: function (e, d) { var b = p.a.d(d() || {}), a; for (a in b) if (typeof a == "string") { var f = p.a.d(b[a]); p.a.pa(e, a, f) } } }; + p.c.style = { update: function (e, d) { var b = p.a.d(d() || {}), a; for (a in b) if (typeof a == "string") { var f = p.a.d(b[a]); e.style[a] = f || "" } } }; p.c.uniqueName = { init: function (e, d) { if (d()) e.name = "ko_unique_" + ++p.c.uniqueName.Ba, p.a.S && e.mergeAttributes(document.createElement(""), !1) } }; p.c.uniqueName.Ba = 0; + p.c.checked = { init: function (e, d, b) { p.a.t(e, "click", function () { var a; if (e.type == "checkbox") a = e.checked; else if (e.type == "radio" && e.checked) a = e.value; else return; var f = d(); e.type == "checkbox" && p.a.d(f) instanceof Array ? (a = p.a.h(p.a.d(f), e.value), e.checked && a < 0 ? f.push(e.value) : !e.checked && a >= 0 && f.splice(a, 1)) : p.D(f) ? f() !== a && f(a) : (f = b(), f._ko_property_writers && f._ko_property_writers.checked && f._ko_property_writers.checked(a)) }); e.type == "radio" && !e.name && p.c.uniqueName.init(e, function () { return !0 }) }, update: function (e, +d) { var b = p.a.d(d()); if (e.type == "checkbox") e.checked = b instanceof Array ? p.a.h(b, e.value) >= 0 : b, b && p.a.S && e.mergeAttributes(document.createElement(""), !1); else if (e.type == "radio") e.checked = e.value == b, e.value == b && (p.a.S || p.a.Ma) && e.mergeAttributes(document.createElement(""), !1) } + }; + p.c.attr = { update: function (e, d) { var b = p.a.d(d()) || {}, a; for (a in b) if (typeof a == "string") { var f = p.a.d(b[a]); f === !1 || f === o || f === m ? e.removeAttribute(a) : e.setAttribute(a, f.toString()) } } }; + p.aa = function () { this.renderTemplate = function () { c("Override renderTemplate in your ko.templateEngine subclass") }; this.isTemplateRewritten = function () { c("Override isTemplateRewritten in your ko.templateEngine subclass") }; this.rewriteTemplate = function () { c("Override rewriteTemplate in your ko.templateEngine subclass") }; this.createJavaScriptEvaluatorBlock = function () { c("Override createJavaScriptEvaluatorBlock in your ko.templateEngine subclass") } }; p.b("ko.templateEngine", p.aa); + p.G = function () { + var e = /(<[a-z]+\d*(\s+(?!data-bind=)[a-z0-9\-]+(=(\"[^\"]*\"|\'[^\']*\'))?)*\s+)data-bind=(["'])([\s\S]*?)\5/gi; return { Ga: function (d, b) { b.isTemplateRewritten(d) || b.rewriteTemplate(d, function (a) { return p.G.Qa(a, b) }) }, Qa: function (d, b) { return d.replace(e, function (a, d, e, g, i, k, j) { a = p.r.R(j); return b.createJavaScriptEvaluatorBlock("ko.templateRewriting.applyMemoizedBindingsToNextSibling(function() { return (function() { return { " + a + " } })() })") + d }) }, + va: function (d) { return p.l.V(function (b, a) { b.nextSibling && p.J(b.nextSibling, d, a) }) } + } + } (); p.b("ko.templateRewriting", p.G); p.b("ko.templateRewriting.applyMemoizedBindingsToNextSibling", p.G.va); + (function () { + function e(b, a, e, h, g) { var i = p.a.d(h), g = g || {}, k = g.templateEngine || d; p.G.Ga(e, k); e = k.renderTemplate(e, i, g); (typeof e.length != "number" || e.length > 0 && typeof e[0].nodeType != "number") && c("Template engine must return an array of DOM nodes"); e && p.a.g(e, function (a) { p.l.sa(a, [h]) }); switch (a) { case "replaceChildren": p.a.Xa(b, e); break; case "replaceNode": p.a.ka(b, e); break; case "ignoreTargetNode": break; default: c(Error("Unknown renderMode: " + a)) } g.afterRender && g.afterRender(e, h); return e } var d; p.na = function (b) { + b != +m && !(b instanceof p.aa) && c("templateEngine must inherit from ko.templateEngine"); d = b + }; p.X = function (b, a, f, h, g) { + f = f || {}; (f.templateEngine || d) == m && c("Set a template engine before calling renderTemplate"); g = g || "replaceChildren"; if (h) { + var i = h.nodeType ? h : h.length > 0 ? h[0] : o; return new p.j(function () { var d = typeof b == "function" ? b(a) : b, d = e(h, g, d, a, f); g == "replaceNode" && (h = d, i = h.nodeType ? h : h.length > 0 ? h[0] : o) }, o, { disposeWhen: function () { return !i || !p.a.P(i) }, disposeWhenNodeIsRemoved: i && g == "replaceNode" ? i.parentNode : +i + }) + } else return p.l.V(function (d) { p.X(b, a, f, d, "replaceNode") }) + }; p.Wa = function (b, a, d, h) { return new p.j(function () { var g = p.a.d(a) || []; typeof g.length == "undefined" && (g = [g]); g = p.a.K(g, function (a) { return d.includeDestroyed || !a._destroy }); p.a.la(h, g, function (a) { var g = typeof b == "function" ? b(a) : b; return e(o, "ignoreTargetNode", g, a, d) }, d) }, o, { disposeWhenNodeIsRemoved: h }) }; p.c.template = { update: function (b, a, d, e) { + a = p.a.d(a()); d = typeof a == "string" ? a : a.name; if (typeof a.foreach != "undefined") e = p.Wa(d, a.foreach || [], +{ templateOptions: a.templateOptions, afterAdd: a.afterAdd, beforeRemove: a.beforeRemove, includeDestroyed: a.includeDestroyed, afterRender: a.afterRender }, b); else var g = a.data, e = p.X(d, typeof g == "undefined" ? e : g, { templateOptions: a.templateOptions, afterRender: a.afterRender }, b); (a = p.a.e.get(b, "__ko__templateSubscriptionDomDataKey__")) && typeof a.n == "function" && a.n(); p.a.e.set(b, "__ko__templateSubscriptionDomDataKey__", e) + } + } + })(); p.b("ko.setTemplateEngine", p.na); p.b("ko.renderTemplate", p.X); + p.a.w = function (e, d, b) { + if (b === m) return p.a.w(e, d, 1) || p.a.w(e, d, 10) || p.a.w(e, d, Number.MAX_VALUE); else { + for (var e = e || [], d = d || [], a = e, f = d, h = [], g = 0; g <= f.length; g++) h[g] = []; for (var g = 0, i = Math.min(a.length, b); g <= i; g++) h[0][g] = g; g = 1; for (i = Math.min(f.length, b); g <= i; g++) h[g][0] = g; for (var i = a.length, k, j = f.length, g = 1; g <= i; g++) { var l = Math.min(j, g + b); for (k = Math.max(1, g - b); k <= l; k++) h[k][g] = a[g - 1] === f[k - 1] ? h[k - 1][g - 1] : Math.min(h[k - 1][g] === m ? Number.MAX_VALUE : h[k - 1][g] + 1, h[k][g - 1] === m ? Number.MAX_VALUE : h[k][g - 1] + 1) } b = +e.length; a = d.length; f = []; g = h[a][b]; if (g === m) h = o; else { for (; b > 0 || a > 0; ) { i = h[a][b]; k = a > 0 ? h[a - 1][b] : g + 1; j = b > 0 ? h[a][b - 1] : g + 1; l = a > 0 && b > 0 ? h[a - 1][b - 1] : g + 1; if (k === m || k < i - 1) k = g + 1; if (j === m || j < i - 1) j = g + 1; l < i - 1 && (l = g + 1); k <= j && k < l ? (f.push({ status: "added", value: d[a - 1] }), a--) : (j < k && j < l ? f.push({ status: "deleted", value: e[b - 1] }) : (f.push({ status: "retained", value: e[b - 1] }), a--), b--) } h = f.reverse() } return h + } + }; p.b("ko.utils.compareArrays", p.a.w); + (function () { + function e(d, b, a) { var e = [], d = p.j(function () { var d = b(a) || []; e.length > 0 && p.a.ka(e, d); e.splice(0, e.length); p.a.u(e, d) }, o, { disposeWhenNodeIsRemoved: d, disposeWhen: function () { return e.length == 0 || !p.a.P(e[0]) } }); return { Oa: e, j: d} } p.a.la = function (d, b, a, f) { + for (var b = b || [], f = f || {}, h = p.a.e.get(d, "setDomNodeChildrenFromArrayMapping_lastMappingResult") === m, g = p.a.e.get(d, "setDomNodeChildrenFromArrayMapping_lastMappingResult") || [], i = p.a.M(g, function (a) { return a.wa }), k = p.a.w(i, b), b = [], j = 0, l = [], i = [], q = +o, n = 0, v = k.length; n < v; n++) switch (k[n].status) { + case "retained": var r = g[j]; b.push(r); r.B.length > 0 && (q = r.B[r.B.length - 1]); j++; break; case "deleted": g[j].j.n(); p.a.g(g[j].B, function (a) { l.push({ element: a, index: n, value: k[n].value }); q = a }); j++; break; case "added": var s = e(d, a, k[n].value), r = s.Oa; b.push({ wa: k[n].value, B: r, j: s.j }); for (var s = 0, w = r.length; s < w; s++) { + var t = r[s]; i.push({ element: t, index: n, value: k[n].value }); q == o ? d.firstChild ? d.insertBefore(t, d.firstChild) : d.appendChild(t) : q.nextSibling ? d.insertBefore(t, +q.nextSibling) : d.appendChild(t); q = t + } + } p.a.g(l, function (a) { p.v(a.element) }); a = !1; if (!h) { if (f.afterAdd) for (n = 0; n < i.length; n++) f.afterAdd(i[n].element, i[n].index, i[n].value); if (f.beforeRemove) { for (n = 0; n < l.length; n++) f.beforeRemove(l[n].element, l[n].index, l[n].value); a = !0 } } a || p.a.g(l, function (a) { a.element.parentNode && a.element.parentNode.removeChild(a.element) }); p.a.e.set(d, "setDomNodeChildrenFromArrayMapping_lastMappingResult", b) + } + })(); p.b("ko.utils.setDomNodeChildrenFromArrayMapping", p.a.la); + p.T = function () { + this.q = function () { if (typeof jQuery == "undefined" || !jQuery.tmpl) return 0; if (jQuery.tmpl.tag) { if (jQuery.tmpl.tag.tmpl && jQuery.tmpl.tag.tmpl.open && jQuery.tmpl.tag.tmpl.open.toString().indexOf("__") >= 0) return 3; return 2 } return 1 } (); this.getTemplateNode = function (d) { var b = document.getElementById(d); b == o && c(Error("Cannot find template with ID=" + d)); return b }; var e = RegExp("__ko_apos__", "g"); this.renderTemplate = function (d, b, a) { + a = a || {}; this.q == 0 && c(Error("jquery.tmpl not detected.\nTo use KO's default template engine, reference jQuery and jquery.tmpl. See Knockout installation documentation for more details.")); + if (this.q == 1) return d = '