/*! Knockout Fast Foreach v0.4.1 (2015-07-17T14:06:15.974Z) By: Brian M Hunt (C) 2015 License: MIT Adds `fastForEach` to `ko.bindingHandlers`. */ (function(root,factory){if(typeof define==='function'&&define.amd){define(['knockout'],factory);}else if(typeof exports==='object'){module.exports=factory(require('knockout'));}else{root.KnockoutFastForeach=factory(root.ko);}}(this,function(ko){"use strict";function isPlainObject(o){return!!o&&typeof o==='object'&&o.constructor===Object;} var commentNodesHaveTextProperty=document&&document.createComment("test").text==="";var startCommentRegex=commentNodesHaveTextProperty?/^$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/;var supportsDocumentFragment=document&&typeof document.createDocumentFragment==="function";function isVirtualNode(node){return(node.nodeType===8)&&startCommentRegex.test(commentNodesHaveTextProperty?node.text:node.nodeValue);} function makeTemplateNode(sourceNode){var container=document.createElement("div");var parentNode;if(sourceNode.content){parentNode=sourceNode.content;}else if(sourceNode.tagName==='SCRIPT'){parentNode=document.createElement("div");parentNode.innerHTML=sourceNode.text;}else{parentNode=sourceNode;} ko.utils.arrayForEach(ko.virtualElements.childNodes(parentNode),function(child){if(child){container.insertBefore(child.cloneNode(true),null);}});return container;} function insertAllAfter(containerNode,nodeOrNodeArrayToInsert,insertAfterNode){var frag,len,i;if(typeof nodeOrNodeArrayToInsert.nodeType!=="undefined"&&typeof nodeOrNodeArrayToInsert.length==="undefined"){throw new Error("Expected a single node or a node array");} if(typeof nodeOrNodeArrayToInsert.nodeType!=="undefined"){ko.virtualElements.insertAfter(containerNode,nodeOrNodeArrayToInsert,insertAfterNode);return;} if(nodeOrNodeArrayToInsert.length===1){ko.virtualElements.insertAfter(containerNode,nodeOrNodeArrayToInsert[0],insertAfterNode);return;} if(supportsDocumentFragment){frag=document.createDocumentFragment();for(i=0,len=nodeOrNodeArrayToInsert.length;i!==len;++i){frag.appendChild(nodeOrNodeArrayToInsert[i]);} ko.virtualElements.insertAfter(containerNode,frag,insertAfterNode);}else{for(i=nodeOrNodeArrayToInsert.length-1;i>=0;--i){var child=nodeOrNodeArrayToInsert[i];if(!child){return;} ko.virtualElements.insertAfter(containerNode,child,insertAfterNode);}}} function valueToChangeAddItem(value,index){return{status:'added',value:value,index:index};} function isAdditionAdjacentToLast(changeIndex,arrayChanges){return changeIndex>0&&changeIndex0){this.changeQueue.push.apply(this.changeQueue,changeMap.deleted);this.changeQueue.push({status:'clearDeletedIndexes'});} this.changeQueue.push.apply(this.changeQueue,changeMap.added);if(this.changeQueue.length>0&&!this.rendering_queued){this.rendering_queued=true;FastForEach.animateFrame.call(window,function(){self.processQueue();});}};FastForEach.prototype.processQueue=function(){var self=this;if(typeof this.beforeQueueFlush==='function'){this.beforeQueueFlush(this.changeQueue);} ko.utils.arrayForEach(this.changeQueue,function(changeItem){self[changeItem.status](changeItem);});this.rendering_queued=false;if(typeof this.afterQueueFlush==='function'){this.afterQueueFlush(this.changeQueue);} this.changeQueue=[];};FastForEach.prototype.added=function(changeItem){var index=changeItem.index;var valuesToAdd=changeItem.isBatch?changeItem.values:[changeItem.value];var referenceElement=this.lastNodesList[index-1]||null;var allChildNodes=[];for(var i=0,len=valuesToAdd.length;i=0;--i){this.lastNodesList.splice(this.indexesToDelete[i],1);} this.indexesToDelete=[];};ko.bindingHandlers.fastForEach={init:function init(element,valueAccessor,bindings,vm,context){var value=valueAccessor(),ffe;if(isPlainObject(value)){value.element=value.element||element;value.$context=context;ffe=new FastForEach(value);}else{ffe=new FastForEach({element:element,data:ko.unwrap(context.$rawData)===value?context.$rawData:value,$context:context});} ko.utils.domNodeDisposal.addDisposeCallback(element,function(){ffe.dispose();});return{controlsDescendantBindings:true};},FastForEach:FastForEach};ko.virtualElements.allowedBindings.fastForEach=true;}));