forked from RubaXa/Pilot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPilot.min.js
2 lines (2 loc) · 9.72 KB
/
Pilot.min.js
1
2
/*! Pilot 1.0.0 - MIT | git://github.com/rubaxa/Pilot.git */
(function(t,e){"use strict";function i(t,e,i){if(t){var n=0,s=t.length;if(n in t&&s!==a)for(;s>n;n++)e.call(i,t[n],n,t);else for(n in t)t.hasOwnProperty(n)&&e.call(i,t[n],n,t)}}function n(t,e){var i,n=arguments,s=1,r=n.length;for(t=t||{};r>s;s++)if(e=n[s],e&&"object"==typeof e)for(i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function s(t,i,n,s){return t instanceof RegExp?t:(e.isArray(t)&&(t="("+t.join("|")+")"),t=t.concat(s?"":"/?").replace(/(\/\(|\(\/)/g,"(?:/").replace(/(\/)?(\.)?:(\w+)(?:(\([^?].*?\)))?(\?)?(\*)?/g,function(t,e,n,s,r,o,h){return i.push({name:s,optional:!!o}),e=e||"",""+(o?"":e)+"(?:"+(o?e:"")+(n||"")+(r||n&&"([^/.]+?)"||"([^/]+?)")+")"+(o||"")+(h?"(/*)?":"")}).replace(/([\/.])/g,"\\$1").replace(/\*/g,"(.*)"),RegExp("^"+t+"$",n?"":"i"))}function r(t,e,i,n){if(i){var s,r,o,h=1,a=e.exec(t);if(!a)return!1;for(s=a.length;s>h;++h)r=i[h-1],o="string"==typeof a[h]?decodeURIComponent(a[h]):a[h],r?n[r.name]=o:n.push(o);return!0}return e.test(t)}var o=0,h=function(){},a=void 0,u=t.history,c=t.document,l=t.location,f=/^(https?|file)/i,p=[].slice,d={}.toString,g=function(t,e){var i=p.call(arguments,2);return e.bind?e.bind.apply(e,[t].concat(i)):function(){return e.apply(t,i.concat(p(arguments)))}},m=function(t){var e=function(){if(e.fn.singleton){if(e.__inst__)return e.__inst__;e.__inst__=this}this.cid=this.uniqId=++o,this.__lego.apply(this,arguments)};return e.fn=e.prototype=t||{},e.fn.__self=e.fn.constructor=e,e.extend=function(t){var i=m();return h.prototype=this.fn,i.prototype=new h,n(i,this),n(i.fn=i.prototype,t),i.fn.__self=e.fn.constructor=i,i},e},v=m({__lego:function(){var t=e(this);i({on:"bind",off:"unbind",fire:"triggerHandler"},function(e,i){this[i]=function(){return t[e].apply(t,arguments),this}},this)},emit:function(t,i){var n=("on-"+t).replace(/-(.)/g,function(t,e){return e.toUpperCase()}),s=e.Event(t.replace(/-/g,""));return s.target=this,this[n]!==a&&this[n].apply(this,[s].concat(i))===!1||s.isImmediatePropagationStopped()?void 0:this.fire(s,i)}}),_=v.extend({__lego:function(i){v.fn.__lego.call(this),n(this,{el:null,path:"/",production:t.Pilot&&t.Pilot.production,useHistory:!1},i),this.items=[],this.itemsIdx={},this.request=this.referrer=_.parseURL(_.getLocation()),this.history=[],this.historyIdx=0,i&&(i.useHistory&&e(t).bind("popstate hashchange",g(this,function(){this.nav(_.getLocation())})),i.el&&e(i.el).delegate("a[href],[data-nav]","click",g(this,function(t){this.nav(t.currentTarget.href),t.preventDefault()}))),this.on("error",g(this,function(t,e){this.error(e.message+" at "+e.line+"line in "+(e.file||"")),this.log(e.stack)})),this.init()},init:function(){},route:function(t,e,i,n,s){var r=this.addRoute(t,e,i,n,s);return s?r:this},addRoute:function(t,i,n,r,o){if(/string|regexp/i.test(d.call(i))||(r=n,n=i,i=t,t=a),n&&!n.fn){var h=n;n=y.extend("function"!=typeof h?h:{init:function(){this.on("routestart routechange"+(r===!0?" routeend":""),h)}})}"regexp"!==e.type(i)&&(i=(this.path+("."==i?"":i)).replace(/\/\//,"/"));var u,c=[],l=this;return o&&(l=new _({path:i}),l.items=this.items,l.itemsIdx=this.itemsIdx,l.parentRouter=this,i+="*"),n&&(u=this.items.push({id:t,path:i,keys:c,regexp:s(i,c),unit:n||_.View,options:r}),t&&(this.itemsIdx[t]=u-1)),o?l:u},removeRoute:function(t){t=this.itemsIdx[t]||t,this.items.splice(t,1)},createGroup:function(t,e,i,n){return this.route(t,e,i,n,!0)},closeGroup:function(){return this.parentRouter||this},_getUnits:function(t,e){var s=[];return i(e,function(e){var i=e.unit,o=[];r(t.path,e.regexp,e.keys,o)&&(i.__self===a&&(e.unit=i=new i(n({id:e.id,router:this,inited:!1},e.options))),i.requestParams=o,s.push(i))},this),s},_loadUnits:function(t,n){var s,r=[],o=function(t){n.push(t)};for(n=n.concat();s=n.shift();)if(s&&s.isActive()){if(i(s.units,o),t.params=s.requestParams,s.loadData)try{s=s.loadData(t,this._navByHistory)}catch(h){return h.name="loadData",this.emit("error",h),e.Deferred().reject()}e.isArray(s)?n.push.apply(n,s):s&&r.push(s)}return e.when.apply(e,r)},_doRouteUnits:function(t,s){i(s,function(i){var s=i.unit,o=!0,h=[],a=n({},t);if(a.params=h,s.request=a,r(a.path,i.regexp,i.keys,h)){if(s.inited!==!0&&s.__init(),s.active!==!0){o=!1,s.active=!0;try{s.emit("route-start",a)}catch(u){u.name="routestart",this.emit("error",u,a)}}try{s.emit("route",a)}catch(u){u.name="route",this.emit("error",u,a),this.emit("routeerror",u,a)}if(o)try{s.emit("route-change",a)}catch(u){u.name="routechange",this.emit("error",u,a)}}else if(s.active===!0&&!~e.inArray(s,this.activeUnits)){s.active=!1;try{s.emit("route-end",a)}catch(u){u.name="routeend",this.emit("geterror",u,a)}}},this)},_doRouteDone:function(t){if(this.activeRequest===t){if(this.request.url!=t.url&&(this.referrer=this.request,this.useHistory&&_.setLocation(t)),this.request=t,this._navByHistory||(this.history=this.history.slice(0,this.historyIdx+1),this.historyIdx=this.history.push(t.url)-1),this.items.length)try{this._doRouteUnits(t,this.items)}catch(e){e.name="route",this.emit("error",e)}var i=new Date-this.__ts;this.emit("route",[t,i]),this.log("Pilot.nav: "+i+"ms ("+t.path+t.search+")")}},_doRouteFail:function(t){this.activeRequest===t&&(this.activeRequest=null,this.emit("route-fail",t))},log:function(e){!this.production&&t.console&&console.log(e)},error:function(e){this.production||(t.console&&console.error?console.error(e):this.log(e))},get:function(t){return this.items[this.itemsIdx[t]]},getUrl:function(t,e,i){var s,r,o=this.get(t),h=0;return o&&(e=n({},e,i),s=o.keys,r=o.path.replace(/:(\w+)\??(\/?)/g,function(t,i,n,r){return i=s[h++],r=i&&e[i.name],r?r+(n||""):"("+t+")"}).replace(/\(.*?:[^)]+\)+\??/g,"").replace(/\(|\)\??/g,"").replace(/\/+/g,"/")),r},start:function(t){this.started||this._nav(t||this.request,!1,!0)},_nav:function(t,i,n){var s=e.Deferred(),r=_.parseURL(t.href||t.url||t);if(this.started=!0,this._navByHistory=!!i,n||!this.activeRequest||this.activeRequest.url!=r.url){this.__ts=+new Date,this.emit("before-route",[r,this.__ts]);var o=this._getUnits(r,this.items);r.referrer=this.request.url,this.activeUnits=o,this.activeRequest=r,o.length?this._loadUnits(r,o).done(g(this,this._doRouteDone,r)).fail(g(this,this._doRouteFail,r)).then(s.resolve,s.reject):(this._doRouteDone(r),this.emit("404",r),s.reject())}else s.resolve();return s.promise()},nav:function(t,i,n){return e.isFunction(i)&&(n=i,i=!1),this._nav(t,!1,i).then(n,n)},go:function(t,i){var n=this.getUrl(t,i);return n?this.nav(n):e.Deferred().reject().promise()},hasBack:function(){return this.historyIdx>0},back:function(){return this.hasBack()?this._nav(this.history[--this.historyIdx],!0):e.Deferred().resolve()},hasForward:function(){return!!this.history[this.historyIdx+1]},forward:function(){return this.hasForward()?this._nav(this.history[++this.historyIdx],!0):e.Deferred().resolve}});_.parseURL=function(t){f.test(t)||(t="/"==t.charAt(0)?"//"+l.hostname+t:l.pathname.substr(0,l.pathname.lastIndexOf("/")+1)+t,t="//"==t.substr(0,2)?l.protocol+t:l.hostname+t,f.test(t)||(t=l.protocol+"//"+t));var e=(t.split("?")[1]||"").replace(/#.*/,""),n={},s=t.match(f)[0].length+3,r=t.substr(t.indexOf("/",s)).replace(/\?.*/,"");return e&&(i(e.split("&"),function(t,e){e=t.split("="),n[e[0]]=decodeURIComponent(e[1]===void 0?"":e[1])}),e="?"+e),{url:t,href:t,query:n,search:e,path:r,pathname:r,hash:t.replace(/^[^#]+#/,"")}},_.setLocation=function(t){_.pushState&&u.pushState?u.pushState(null,c.title,t.url):l.hash="#!"+t.path+t.search},_.getLocation=function(){var t=""+l;return _.pushState||(t=t.split("#!").pop()),_.parseURL(t).path};var y=v.extend({data:{},boundAll:[],__lego:function(t){v.fn.__lego.call(this),n(this,t),i(this.boundAll,function(t){this[t]=this.bound(t)},this),this.inited!==!1&&this.__init()},__init:function(){this.inited=!0,this.init(),this.emit("init")},_exception:function(t,e){throw"["+this.uniqId+"."+t+"]: "+e},isActive:function(){return!0},bound:function(t){return"string"==typeof t&&(this[t]===a&&this._exception("bound",t+" -- method not found"),t=this[t]),g(this,t)},init:h,loadData:h,destroy:h,getUrl:function(t,e,i){return this.router.getUrl(t,e,i)},setData:function(t,e){return e?n(this.data,t):this.data=t,this},getData:function(){return this.data}}),x=y.extend({el:null,$el:e(),tag:null,tagName:null,className:"",parentNode:null,template:null,events:{},__init:function(){if(this.inited=!0,this.el)this.setElement(e(this.el,this.parentNode));else if(this.tagName||this.tag){var t=this.tagName,i=this.parentNode,n=this.className;this.tag&&(t=this.tag.match(/^(#[^\s]+)?\s*([^\.]+)\.?([^$]+)?/),t[1]&&(i=t[1]),t[3]&&(n=t[3].split(".").join(" ")),t=t[2]),this.el=c.createElement(t),this.$el=e(this.el),n&&this.$el.addClass(n),i&&(e.isReady?this.$el.appendTo(i):e(this.bound(function(){this.$el.appendTo(i)})))}else this.$el[0]=a,this.$el.length=0;this.on("routestart.view routeend.view",this.bound(function(t){this.toggleView("routeend"!=t.type)})),y.fn.__init.call(this)},toggleView:function(t){this.$el&&this.$el.css("display",t?"":"none")},setElement:function(t){return this.undelegateEvents(),t?(this.$el=e(t),this.delegateEvents()):(this.$el[0]=a,this.$el.length=0),this.el=this.$el[0],this},delegateEvents:function(t){return this.undelegateEvents(),i(t||this.events,function(t,e){e=e.match(/^([^\s]+)\s+(.+)/),this.$el.delegate(e[2],e[1]+".delegateEvents"+this.cid,this.bound(t))},this),this},undelegateEvents:function(){return this.$el&&this.$el.unbind(".delegateEvents"+this.cid),this},$:function(t){var i=this.$el;return void 0!==t&&(i="string"==typeof t?i.find(t):e(t)),i},getHtml:function(t){return t=t?n({},this.getData(),t):this.getData(),this.template(t)},render:function(){var t=this.getHtml();"string"==typeof t&&(this.emit("before-render"),this.$el.empty().each(function(){this.innerHTML=t}),this.emit("render"))}});_.Route=y,_.View=x,_.version="1.0.0",t.Pilot=_,"function"==typeof define&&define.amd&&define("Pilot",[],function(){return _})})(window,jQuery);