silk.postings.items = xb.core.object.extend( { } ); silk.postings.items.mount = xb.core.object.extend( silk.node.mount, { ctor: function( domNode, name, resource ) { this.$id = 0; this.indexed = {}; if ( typeof( this.DOMNodeHandler ) === "undefined" || this.DOMNodeHandler === null ) { this.DOMNodeHandler = silk.postings.items.mount.handler; } silk.node.mount.prototype.ctor.call( this, domNode, name, resource ); }, getSelection: function() { return this.resource.selection; }, onLoad: function() { console.log( "silk.postings.items.mount: loaded" ); }, getSetting: function( fieldName, mountName ) { var value = null; var mountName = ( typeof( mountName ) === "string" ) ? mountName : null; var config = silk.postings.config[ this.resource.config.name ]; if ( typeof( config ) === "object" ) { if ( mountName ) { if ( typeof( config[ mountName ] ) !== "object" ) { return value; } config = config[ mountName ]; } if ( typeof( config[ fieldName ] ) !== "undefined" ) { return config[ fieldName ]; } } return value; }, filename: function( posting ) { var filename = ( typeof( posting[ "posting-id" ] ) !== "undefined" ) ? posting[ "posting-id" ] : ""; var tmpNode = document.createElement( "span" ); var clean = function( name ) { var result = ""; tmpNode.innerHTML = name; result = ( "" + tmpNode.innerText ).toLowerCase(); result = removeDiacritics( result ); result = result.replace( /[^a-zA-Z0-9_]+/g, "-" ); return result.replace( /^[-]+/g, "" ).replace( /[-]+$/g, "" ); }; if ( typeof( posting[ "title" ] ) !== "undefined" ) { var title = clean( posting[ "title" ] ); if ( title ) { filename += "-" + title; } if ( posting[ "sub-title" ] ) { var filename_ext = clean( posting[ "sub-title" ] ); if ( filename_ext ) { filename += "-" + filename_ext; } } } return filename; }, getItemCategories: function( item ) { var result = []; var categories = this.resource.data[ "postings-categories" ]; if ( typeof( categories ) !== "undefined" ) { var catIDs = ( new String( item[ "posting-categories" ] ) ).split( "," ); for ( var j = 0, jl = catIDs.length; j < jl; j++ ) { var c = categories.index[ "" + catIDs[ j ] ]; if ( typeof( c ) === "object" ) { result.push( c ); } } } return result; }, select: function( selection ) { var data = this.resource.data[ this.fieldName ]; var list = data.getArray(); var items = []; selection.items = []; for ( var i = 0, il = list.length; i < il; i++ ) { var item = list[ i ]; var id = ( new Number( item[ "posting-id" ] ) ); if ( id >= 0 ) { selection.items.push( xb.core.object.prototype.copy.call( item, true ) ); } } var config = silk.postings.config[ this.resource.config.name ]; if ( typeof( config ) !== "undefined" ) { var categories = this.resource.data[ "postings-categories" ]; if ( typeof( categories ) !== "undefined" ) { if ( typeof( config[ "path-settings" ] ) === "object" ) { for ( var p in config[ "path-settings" ] ) { if ( ! ( new RegExp( p ) ).test( window.location.pathname ) ) { continue; } var settings = config[ "path-settings" ][ p ]; if ( ! ( settings[ "categories" ] instanceof Array ) ) { continue; } for ( var i = 0, il = settings[ "categories" ].length; i < il; i++ ) { var tag = settings[ "categories" ][ i ]; for ( var n in categories.set ) { var category = categories.set[ n ]; if ( category[ "category-name" ].href == tag ) { if ( typeof( selection.categories ) !== "object" ) { selection.categories = {}; } console.log( "path-settings.categories", p, category ); // als er een "alles" keuze gemaakt is, haal deze dan weg delete selection.categories[ -1 ]; selection.categories[ category[ "category-id" ] ] = category; } } } } } } } if ( typeof( selection.categories ) !== "undefined" && Object.getOwnPropertyNames( selection.categories ).length ) { if ( typeof( selection.categories[ "-1" ] ) === "undefined" ) { for ( var i = 0, il = selection.items.length; i < il; i++ ) { var object = selection.items[ i ]; if ( typeof( object[ "posting-categories"] ) === "string" ) { var cats = object[ "posting-categories" ].split( "," ); for ( var j = 0, jl = cats.length; j < jl; j++ ) { if ( typeof( selection[ "categories" ][ cats[ j ] ] ) !== "undefined" ) { items.push( object ); break; } } } } selection.items = items; } } var __d = this.resource.data[ "postings-filters" ]; if ( typeof( __d ) !== "undefined" ) { if ( typeof( __d.match ) === "function" ) { selection.items = __d.match( selection.items ); } } for ( var i = 0, il = selection.items.length; i < il; i++ ) { var item = selection.items[ i ]; var categories = this.getItemCategories( item ); var catName = ""; for ( var j = 0, jl = categories.length; j < jl; j++ ) { if ( catName.length > 0 ) { catName += " | "; } catName += categories[ j ][ "category-name" ].innerHTML; } item[ "tag-name" ] = catName; } var patterns = this.getSetting( "patterns" ); if ( selection.items.length && patterns ) { var len = selection.items.length; console.error( patterns.list.length ); var repAt = parseInt( patterns[ "repeat-from" ], 10 ) if ( isNaN( repAt ) ) { repAt = 0; } var fact = Math.floor( len / patterns.list.length ); var rest = len % patterns.list.length; var pList = []; var restBase = 0; var restTail = rest; if ( fact > 0 && rest < repAt ) { fact -= 1; restBase = ( patterns.list.length + rest ) - repAt; restTail = repAt; } var pBase = []; for ( var i = 0, il = fact; i < il; i++ ) { pBase = pBase.concat( patterns.list[ patterns.list.length - 1 ] ); } var pRestBase = []; if ( restBase > 0 ) { pRestBase = pRestBase.concat( patterns.list[ restBase - 1 ] ); } var pRestTail = []; if ( restTail > 0 ) { pRestTail = pRestTail.concat( patterns.list[ restTail - 1 ] ); } console.error( "patterns", { base: pBase, rest: { base: pRestBase, tail: pRestTail } } ); selection.patterns = { map: patterns.classes, list: pBase.concat( pRestBase, pRestTail ) }; } return selection; }, displayAll: function() { var data = this.resource.data[ this.fieldName ]; var list = data.getArray(); for ( var i = 0, il = this.nodes.length; i < il; i++ ) { this.nodes[ i ].render( list, true ); } }, display: function() { var self = this; var selection = this.getSelection(); this.render( selection.items, true ); var categories = this.resource.data[ "postings-categories" ]; if ( typeof( categories ) === "undefined" ) { return; } var domNodes = []; for ( var i = 0, il = this.nodes.length; i < il; i++ ) { domNodes.push( this.nodes[ i ].domNode ); } $( domNodes ) .find( ".silk-elm.tag-name" ) .each( function() { var link = document.createElement( "a" ); $( this ) .parents( "[data-simply-list][data-simply-data] > .silk-listItem > .silk-object" ) .each( function() { var elm = this; var className = ""; $( this ) .find( ".silk-id.posting-categories" ) .each( function() { var ids = this.innerText.split( "," ); for ( var i = 0, il = ids.length; i < il; i++ ) { var c = categories.index[ "" + ids[ i ] ]; if ( typeof( c ) === "object" ) { link.href = c[ "category-name" ].href; var name = link.hash.substr( 1 ).toLowerCase(); className += " in-category-" + name.replace( /[^a-zA-Z0-9_]+/g, "-" ); } } } ) ; this.className += className; } ) ; } ) ; // FIXME!!: Gooi een event, en handle onderstaande in een handler! objectFitImages(); }, onDOMChangeFilenames: function( changes, after, before ) { var path = silk.postings.get( this.resource, "path" ); var data = this.resource.data[ this.fieldName ]; var count = 0; var update = {}; for ( var i = 0, il = changes.mutations.length; i < il; i++ ) { var new_data = changes.mutations[ i ]; var $id = new_data[ data.ident ]; var old_data = data.get( $id ); if ( old_data === null ) { continue; } if ( typeof( new_data.link ) === "undefined" ) { continue; } if ( typeof( old_data.link ) === "undefined" ) { continue; } var new_path = new_data.link.href; var old_path = old_data.link.href; if ( new_path !== old_path ) { continue; } var old_gen_filename = this.filename( old_data ); var old_gen_path = path + old_gen_filename + "/"; if ( !old_path || ( old_gen_filename !== null && old_path === old_gen_path ) ) { var new_gen_filename = this.filename( new_data ); var new_gen_path = path + new_gen_filename + "/"; if ( new_gen_filename !== null && new_path !== new_gen_path ) { count++; new_data.link.href = new_gen_path; update[ $id ] = new_gen_path; console.warn( old_gen_path, "=>", new_gen_path ); } continue; } } //console.log( "onDOMChangeFilenames", update ); if ( count > 0 ) { after.each( function() { var id = this.get( data.ident ); var link = this.get( "link" ); if ( id !== null && link !== null ) { var $id = id.getValue(); if ( typeof( update[ $id ] ) !== "undefined" ) { console.log( "replacing link", update[ $id ], $id ); link.domNode.href = update[ $id ]; } } } ); } }, onDOMChange: function( handler, before ) { var data = this.resource.data[ this.fieldName ]; var mainData = this.resource.data[ "postings-items" ]; //data.onDOMChange( handler, before ); var reselect = false; var changes = data.handleDOMChanges( handler, before ); this.onDOMChangeFilenames( changes, handler, before ); data.delete( changes.removed ); data.update( changes.mutations ); if ( changes.added.length ) { var categories = this.resource.data[ "postings-categories" ]; if ( categories !== "undefined" ) { var categoryIDs = []; var categoryNames = []; for ( var i = 0, il = categories.set.length; i < il; i++ ) { var item = categories.set[ i ]; if ( item[ "data-simply-template" ] === "categorie tekst" ) { continue; } if ( item[ categories.ident ] > -1 ) { categoryIDs.push( item[ categories.ident ] ); categoryNames.push( item[ "category-name" ].innerText ); break; } } if ( categoryIDs.length ) { var names = []; for ( var i = 0, il = changes.added.length; i < il; i++ ) { changes.added[ i ].object[ "posting-categories" ] = categoryIDs.join( "," ); if ( typeof( changes.added[ i ].node ) === "object" ) { var postingCategories = changes.added[ i ].node.get( "posting-categories" ); if ( postingCategories !== null ) { postingCategories.setValue( categoryIDs.join( "," ) ); } var tagName = changes.added[ i ].node.get( "tag-name" ); if ( tagName !== null ) { tagName.setValue( categoryNames.join( " | " ) ); } } } } } } data.add( changes.added ); if ( mainData && changes.added.length ) { var sjablonen = this.getSetting( "themes" ); var path = silk.postings.get( this.resource, "path" ); for ( var i = 0, il = changes.added.length; i < il; i++ ) { var object = changes.added[ i ].object; var node = changes.added[ i ].node; var sjabloon = mainData.index[ "-10" ]; if ( sjablonen !== null && typeof( sjablonen[ node.template ] ) !== "undefined" ) { var sjabloonID = "" + sjablonen[ node.template ].id; if ( typeof( mainData.index[ sjabloonID ] ) !== "undefined" ) { sjabloon = mainData.index[ sjabloonID ]; } } // var patterns = this.getSetting( "patterns" ); //item[ "data-simply-template" ] if ( typeof( sjabloon ) === "object" ) { reselect = true; // FIXME: Altijd doen? for ( var n in sjabloon ) { switch ( n ) { case "data-simply-template": case "posting-id": console.log( "sjabloon skip", n ); continue; break; default: object[ n ] = sjabloon[ n ]; break; } } if ( typeof( sjabloon.link ) === "object" ) { object.link.href = path + this.filename( object ) + "/"; } } } } if ( changes.reorder[ 0 ].join( "-" ) !== changes.reorder[ 1 ].join( "-" ) ) { data.reorder( changes.reorder[ 0 ], changes.reorder[ 1 ] ); //reselect = true; } if ( !reselect && ( changes.removed.length || changes.added.length ) ) { //reselect = true; } if ( reselect ) { var self = this; window.setTimeout( function() { self.resource.select(); }, 1 ); } }, save: function() { 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.items.mount.handler = xb.core.object.extend( silk.node.mount.DOMNode, { factory: function( mount, domNode ) { return new silk.postings.items.mount.handler( mount, domNode ); }, ctor: function( mount, domNode ) { var self = this; silk.node.mount.DOMNode.prototype.ctor.call( this, mount, domNode ); silk.events.add( { element: window, on: [ "scroll", "resize" ], method: function() { self.scroll(); } } ); }, scroll: function() { var self = this; var cRect = self.domNode.getBoundingClientRect(); var i = cRect.bottom - window.innerHeight; var selection = this.mount.getSelection(); if ( selection.limit && ( i < -30 && selection.offset + selection.limit < selection.items.length ) ) { selection.offset += selection.limit; this.mount.resource.select( selection ); } }, display: function() { var selection = this.mount.getSelection(); if ( selection.limit ) { this.render( selection.items.slice( selection.offset, selection.offset + selection.limit ), ( selection.offset > 0 ) ? false : true ); } else { this.render( selection.items, true ); } this.displayPatterns( selection ) }, displayPatterns: function( selection ) { var patterns = selection.patterns; if ( typeof( patterns ) === "undefined" ) { return false; } var nodes = this.domNode.children; for ( var i = selection.offset, il = nodes.length; i < il; i++ ) { var domNode = nodes[ i ]; var classNames = selection.patterns.map[ selection.patterns.list[ i ] ]; if ( !( classNames instanceof Array ) ) { classNames = [ classNames ]; } for ( var j = 0, jl = classNames.length; j < jl; j++ ) { domNode.classList.add( classNames[ j ] ); for ( var a = 0, al = domNode.children.length; a < al; a++ ) { domNode.children[ a ].classList.add( classNames[ j ] ); } } } return true; }, } );