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 : this.name;
var config = silk.postings.config[ this.resource.config.name ];
if ( typeof( config.settings ) === "object" ) {
if ( typeof( config.settings[ mountName ] ) === "object" ) {
if ( typeof( config.settings[ mountName ][ fieldName ] ) !== "undefined" ) {
return config.settings[ mountName ][ 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 ) {
console.log( "postings.items.select", selection );
var data = this.resource.data[ this.fieldName ];
var list = data.getArray();
var items = [];
selection.items = list;
if ( typeof( this.resource.mounts.categories ) !== "undefined" ) {
if ( typeof( selection.categories[ "-1" ] ) === "undefined" ) {
for ( var i = 0, il = list.length; i < il; i++ ) {
var object = list[ 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;
}
}
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;
}
return selection;
},
display: function() {
var self = this;
this.render( this.getSelection().items, true );
var domNodes = [];
for ( var i = 0, il = this.nodes.length; i < il; i++ ) {
domNodes.push( this.nodes[ i ].domNode );
}
var categories = this.resource.data[ "postings-categories" ];
if ( typeof( categories ) === "undefined" ) {
return;
}
$( 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;
}
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 ];
//data.onDOMChange( handler, before );
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[ categories.ident ] > -1 ) {
categoryIDs.push( item[ categories.ident ] );
categoryNames.push( item[ "category-name" ].innerHTML );
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 );
data.reorder( changes.reorder[ 0 ], changes.reorder[ 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 );
}
}
} );