silk.calendar.items = xb.core.object.extend( { } ); silk.calendar.items.mount = xb.core.object.extend( silk.node.mount, { ctor: function( domNode, name, resource ) { this.$id = 0; this.indexed = {}; this.DOMNodeHandler = silk.calendar.items.mount.handler; silk.node.mount.prototype.ctor.call( this, domNode, name, resource ); }, getSelection: function() { return this.resource.selection; }, onLoad: function() { console.log( "LOADED" ); }, filename: function( posting ) { var result = ""; var tmpNode = document.createElement( "span" ); var clean = function( name ) { tmpNode.innerHTML = name; result = ( "" + tmpNode.innerText ).toLowerCase().replace( /[^a-zA-Z0-9_]+/g, "-" ); return result.replace( /^[-]+/g, "" ).replace( /[-]+$/g, "" ); }; var filename = clean( posting[ "title" ] ); if ( posting[ "sub-title" ] ) { var filename_ext = clean( posting[ "sub-title" ] ); if ( filename_ext ) { filename += "-" + filename_ext; } } return filename; }, select: function( selection ) { console.log( "calendar.items.select", selection ); var data = this.resource.data[ this.fieldName ]; var list = data.getArray(); var items = []; selection.items = list; if ( !silk.inEditMode() ) { var now = moment().startOf( "day" ).valueOf(); var timestamps = {}; var result = []; for ( var i = 0, il = list.length; i < il; i++ ) { var item = list[ i ]; var _day = item[ "datum-start-dag" ]; var _month = item[ "datum-start-maand" ]; var m = moment( _day + " " + _month, [ "D MMM", "D MMMM" ], "nl" ).endOf( "day" ); var ts = null; var prev = m.subtract( 1, "year" ).valueOf(); var curr = m.valueOf(); var next = m.add( 1, "year" ).valueOf(); if ( ts === null ) ts = curr; if ( ts === null || Math.abs( now - prev ) < Math.abs( now - ts ) ) ts = prev; if ( ts === null || Math.abs( now - next ) < Math.abs( now - ts ) ) ts = next; if ( ts > now ) { timestamps[ "" + item[ data.ident ] ] = ts; result.push( item ); } } result.sort( function( a, b ) { var at = timestamps[ a[ "" + data.ident ] ]; var bt = timestamps[ b[ "" + data.ident ] ]; return at - bt; } ); selection.items = result; } return selection; }, display: function() { this.render( this.getSelection().items, true ); }, onDOMChange: function( handler, before ) { var data = this.resource.data[ this.fieldName ]; data.onDOMChange( handler, before ); }, 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.calendar.items.mount.handler = xb.core.object.extend( silk.node.mount.DOMNode, { factory: function( mount, domNode ) { return new silk.calendar.items.mount.handler( mount, domNode ); }, ctor: function( mount, domNode ) { var self = this; silk.node.mount.DOMNode.prototype.ctor.call( this, mount, domNode ); }, display: function() { var selection = this.mount.getSelection(); var items = ( silk.inEditMode() ) ? selection.items : selection.items.slice( 0, 9 ); this.render( items, true ); } } );