silk.navigation = ( xb.core.object.extend( { ctor: function( domNode ) { this.__init( domNode ); }, handle: function( path, handler ) { this.handlers.push( { path: path, handler: handler } ); }, goto: function( path, state, evt ) { var hObject = this.__getHandlerObject( path ); if ( hObject !== null ) { var state = ( typeof( state ) === "object" && state !== null ) ? state : {}; console.log( "silk.navigation.goto", path, state ); if ( typeof( evt ) !== "undefined" ) { evt.preventDefault(); evt.stopImmediatePropagation(); } //var inEditMode = ( document.body.getAttribute( "data-simply-edit" ) !== null ); var a = document.createElement( "a" ); a.href = path; history.pushState( state, "", a.href ); hObject.handler( path ); return true; } return false; }, __init: function( domNode ) { var self = this; this.handlers = []; this.domNode = domNode; this.domNode.addEventListener( "click", function( evt ) { return self.__onClick( evt ); }, true ); this.domNode.addEventListener( "dblclick", function( evt ) { return self.__onDblClick( evt ); }, true ); window.addEventListener( "popstate", function( evt ) { return self.__onHistoryBack( evt ); }, true ); }, __getHandlerObject: function( pathname ) { var result = null; var pathname = ( pathname[ 0 ] === "/" ) ? pathname : "/" + pathname; for ( var i = 0, il = this.handlers.length; i < il; i++ ) { var hInfo = this.handlers[ i ]; if ( typeof( hInfo.path ) === "string" ) { if ( pathname.indexOf( hInfo.path ) === 0 ) { result = hInfo; break; } } } return result; }, __onClick: function( evt ) { var inEditMode = ( document.body.getAttribute( "data-simply-edit" ) !== null ); var tag = evt.target.tagName.toLowerCase(); if ( !inEditMode && tag === "a" ) { if ( !$( evt.target ).hasClass( "nonav" ) && ( $( evt.target ).parents( ".nonav" ).length === 0 ) ) { var path = evt.target.pathname; return this.goto( path, null, evt ); } } }, __onDblClick: function( evt ) { var inEditMode = ( document.body.getAttribute( "data-simply-edit" ) !== null ); var tag = evt.target.tagName.toLowerCase(); if ( inEditMode && tag === "a" && !$( evt.target ).hasClass( "nonav" ) ) { var path = evt.target.pathname; return this.goto( path, null, evt ); } }, __onHistoryBack: function( evt ) { console.log( "popstate", window.location.href, history ); var hObject = this.__getHandlerObject( window.location.pathname ); if ( hObject !== null ) { evt.preventDefault(); evt.stopImmediatePropagation(); hObject.handler( evt.target ); return false; } } } ) )( document );