silk.postings.filters = {}; silk.postings.filters.data = xb.core.object.extend( silk.data, { ctor: function( set, ident ) { silk.data.prototype.ctor.call( this, set, ident ); this.__filter = null; }, filter: function( data ) { this.__filter = ( typeof( data ) === "object" ) ? data : null; return this; }, getArray: function() { var result = this.set; if ( this.__filter !== null && Object.getOwnPropertyNames( this.__filter ).length ) { var result = []; for ( var i = 0, il = this.set.length; i < il; i++ ) { var filter = this.__filter[ this.set[ i ][ "filter-name" ] ]; if ( typeof( filter ) === "undefined" ) { result.push( this.set[ i ] ); continue; } var object = xb.core.object.prototype.copy.call( this.set[ i ], true ); for ( var j = this.set[ i ][ "list" ].length - 1; j >= 0; j-- ) { var item = this.set[ i ][ "list" ][ j ]; if ( filter.indexOf( item.value ) > -1 ) { object[ "pulldown" ].unshift( item ); } } result.push( object ); } } return result; }, match: function( items ) { var result = items; if ( 0 && document.body.getAttribute( "data-simply-edit" ) ) { for ( var i = 0, il = items.length; i < il; i++ ) { items[ i ][ "postings-filter" ] = this.set; } } if ( this.__filter !== null && Object.getOwnPropertyNames( this.__filter ).length ) { result = []; f_next_item: for ( var i = 0, il = items.length; i < il; i++ ) { var object = items[ i ]; if ( typeof( object[ "posting-filters" ] ) !== "object" ) { continue; } f_next_filter: for ( var name in this.__filter ) { var filter = this.__filter[ name ]; if ( ! ( ( object[ "posting-filters" ][ name ] ) instanceof Array ) ) { continue f_next_item; } for ( var j = 0, jl = filter.length; j < jl; j++ ) { if ( object[ "posting-filters" ][ name ].indexOf( filter[ j ] ) > -1 ) { continue f_next_filter; } } continue f_next_item; } result.push( object ); } } return result; }, } ); silk.postings.filters.mount = xb.core.object.extend( silk.node.mount, { ctor: function( domNode, name, resource ) { this.DOMNodeHandler = silk.postings.filters.mount.handler; this.$id = 0; this.indexed = {}; silk.node.mount.prototype.ctor.call( this, domNode, name, resource ); }, onLoad: function() { var self = this; self.getFilters(); }, onDOMChange: function( handler, before ) { var data = this.resource.data[ this.fieldName ]; //data.onDOMChange( handler, before ); var changes = data.handleDOMChanges( handler, before ); data.delete( changes.removed ); data.update( changes.mutations ); if ( changes.added.length ) { } data.add( changes.added ); data.reorder( changes.reorder[ 0 ], changes.reorder[ 1 ] ); }, select: function( selection ) { var q = window.location.search; // FIXME: dit moet natuurlijk beter. Niet alle parameters gaan gebruiken! var params = silk.parseURLQuery( q ); this.resource.data[ this.fieldName ].filter( params ); return selection; }, getFilters: function( categories ) { var result = {}; console.warn( "silk.postings.filters.getCategories", result ); return result; }, save: function( data ) { for ( var i = 0, il = this.nodes.length; i < il; i++ ) { $( this.nodes[ i ].domNode ) .find( "[data-silk-new]" ) .each( function() { this.removeAttribute( "data-silk-new" ); } ) ; } return this.resource.data[ this.fieldName ].set; } } ); silk.postings.filters.mount.handler = xb.core.object.extend( silk.node.mount.DOMNode, { factory: function( mount, domNode ) { console.warn( "domNode", domNode ); return new silk.postings.filters.mount.handler( mount, domNode ); }, ctor: function( mount, domNode ) { var self = this; this.rendered = false; silk.node.mount.DOMNode.prototype.ctor.call( this, mount, domNode ); this.domNode.addEventListener( "events/ui/select/toggle", function( evt ) { self.onChange( evt ); }, true ); }, onChange: function( evt ) { var data = silk.html.object( evt.detail.elm.domNode ).data().get(); var q = window.location.search; var params = silk.parseURLQuery( q ); var name = data[ "filter-name" ]; var selected = evt.detail.selected; if ( !selected.length ) { delete params[ name ]; } else { params[ name ] = []; for ( var i = 0, il = selected.length; i < il; i++ ) { params[ name ].push( selected[ i ].value ); } } var search = ""; for ( var name in params ) { if ( search.length ) { search += "&"; } search += name + "=" + params[ name ].join( "|" ); } if ( 1 || search.length ) { search = "?" + search; } history.pushState( null, null, search ) silk.postings.select(); }, display: function( data, reset ) { var list = data.getArray(); silk.node.mount.DOMNode.prototype.display.call( this, list, reset ); var resource = this.mount.resource; var selection = resource.selection; var ui_select = silk.html.getLibrary( "silk/ui/select" ); if ( ui_select !== null ) { var objects = ui_select.find( this.domNode ); for ( var i = 0, il = objects.length; i < il; i++ ) { objects[ i ].init(); } } }, onDOMChange: function( mutations, dt, mObserver ) { silk.node.mount.DOMNode.prototype.onDOMChange.call( this, mutations, dt, mObserver ); }, } );