define(['dojo/_base/declare','dojo/_base/connect','dojo/_base/xhr','dojo/dom-construct', 'dojo/dom-attr','dojo/_base/lang','dojo/_base/Deferred','dojo/hash', 'dojo/io-query','dojo/_base/json','dijit','rft/util'], function(declare,connect,xhr,domConstruct,attr,lang,Deferred,hash,uriQuery,json,dijit,util){ return new (function() { var self = this; var current = ""; var HRI = declare(null,{ constructor: function() { this._path = '/'; this._args = {}; if ( arguments.length == 1 ) { this.hash(arguments[0]); } else if ( arguments.length == 2 ) { this.path(arguments[0]); this.args(arguments[1]); } }, path: function(path) { if ( path ) this._path = this._fixPath(path); return this._path; }, args: function(args) { if ( args && lang.isObject(args) ) this._args = args; return this._args; }, hash: function(hash) { if ( hash && lang.isString(hash) ) { var parts = hash.split('!'); if ( parts[1] ) this._path = this._fixPath(parts[1]); if ( parts[2] ) this._args = uriQuery.queryToObject(parts[2]); } return '!'+this._path+'!'+uriQuery.objectToQuery(this._args); }, _fixPath: function(path) { if ( !lang.isString(path) || util.isEmptyString(path) ) { path = "/"; } if ( path[0] != '/' ) { path = '/'+path; } if ( path[path.length-1] == '/' ) { path = path + "index"; } return path; } }); function _goTo(hri,replace) { var contentPane = dijit.byId('content'); var d = new Deferred(); var newHash = hri.hash(); if ( current == newHash ) { d.resolve(); return d.promise; } current = newHash; hash(newHash,replace); xhr.get({ url: 'pages'+hri.path()+'.html', failOk: true }) .then(function(html){ var root = domConstruct.toDom(html) var props = json.toJson(hri.args()); props = props.slice(1,props.length-2); if ( props ) attr.set(root,'data-rft-props',props); contentPane.set('content',root); d.resolve(); },function(){ contentPane.set('content',"Page "+hri.path()+" not found."); d.reject(); }); return d.promise; } self.initial = function(path,args) { if ( current ) { var dfd = new Deferred(); dfd.resolved(); return dfd.promise; } if ( hash() ) { var hri = new HRI(hash()); return _goTo(hri, true); } else { return _goTo(new HRI(path,args)); } } self.goTo = function(path,args) { return _goTo(new HRI(path,args)); } connect.subscribe('/dojo/hashchange', function(){ _goTo(new HRI(hash())); }); })(); });