Repository: woowabros/WoowahanJS Branch: v1 Commit: 14acd472b60a Files: 253 Total size: 810.8 KB Directory structure: gitextract_la2rqcub/ ├── .babelrc ├── .gitignore ├── CONTRIBUTING.md ├── README.en.md ├── README.md ├── dist/ │ └── woowahan.js ├── docs/ │ ├── README.md │ ├── action-reducer.md │ ├── collection-view.md │ ├── dom-refs.md │ ├── event.md │ ├── first-app.md │ ├── popup-view.md │ ├── project-setup.md │ ├── route.md │ ├── store.md │ ├── view-model.md │ └── view.md ├── examples/ │ ├── README.md │ ├── bind/ │ │ ├── .babelrc │ │ ├── gulpfile.js │ │ ├── hello-view.hbs │ │ ├── hello-view.js │ │ ├── index.html │ │ ├── main.js │ │ ├── package.json │ │ ├── plugin/ │ │ │ └── index.js │ │ └── webpack.config.js │ ├── collection/ │ │ ├── .babelrc │ │ ├── collection-first.js │ │ ├── collection-second.js │ │ ├── gulpfile.js │ │ ├── hello-view.js │ │ ├── index.html │ │ ├── main.js │ │ ├── package.json │ │ └── webpack.config.js │ ├── domrefs/ │ │ ├── .babelrc │ │ ├── gulpfile.js │ │ ├── index.html │ │ ├── main-view.hbs │ │ ├── main-view.js │ │ ├── main.js │ │ ├── package.json │ │ └── webpack.config.js │ ├── hello-yarn/ │ │ ├── README.md │ │ ├── app/ │ │ │ ├── hello-view.js │ │ │ └── index.js │ │ ├── index.html │ │ ├── package.json │ │ └── webpack.config.js │ ├── helloworld/ │ │ ├── .babelrc │ │ ├── gulpfile.js │ │ ├── hello-view.js │ │ ├── index.html │ │ ├── main.js │ │ ├── package.json │ │ └── webpack.config.js │ ├── listview/ │ │ ├── .babelrc │ │ ├── action/ │ │ │ └── index.js │ │ ├── global.config.js │ │ ├── gulpfile.js │ │ ├── index.html │ │ ├── main.js │ │ ├── package.json │ │ ├── plugin.config.js │ │ ├── reducer/ │ │ │ ├── core-reducer.js │ │ │ ├── one-user.js │ │ │ └── users.js │ │ ├── server/ │ │ │ ├── data/ │ │ │ │ └── users.json │ │ │ ├── demo.js │ │ │ └── proxy.js │ │ ├── view/ │ │ │ ├── control/ │ │ │ │ ├── pager.hbs │ │ │ │ └── pager.js │ │ │ ├── layout.hbs │ │ │ ├── layout.js │ │ │ ├── not-found.js │ │ │ ├── users/ │ │ │ │ ├── index.hbs │ │ │ │ ├── index.js │ │ │ │ ├── user-detail.js │ │ │ │ ├── user.hbs │ │ │ │ └── user.js │ │ │ ├── welcome.hbs │ │ │ └── welcome.js │ │ └── webpack.config.js │ ├── middleware/ │ │ ├── app.js │ │ ├── index.html │ │ └── woowahan.js │ ├── modal/ │ │ ├── .babelrc │ │ ├── gulpfile.js │ │ ├── hello-view.js │ │ ├── index.html │ │ ├── main.js │ │ ├── package.json │ │ ├── sass/ │ │ │ └── main.scss │ │ ├── view/ │ │ │ ├── modal-view-bootstrap/ │ │ │ │ ├── modal-view-bootstrap.hbs │ │ │ │ └── modal-view-bootstrap.js │ │ │ └── modal-view-normal/ │ │ │ ├── modal-view-normal.hbs │ │ │ └── modal-view-normal.js │ │ └── webpack.config.js │ ├── plugin/ │ │ ├── .babelrc │ │ ├── gulpfile.js │ │ ├── hello-view.js │ │ ├── index.html │ │ ├── main.js │ │ ├── package.json │ │ ├── plugin/ │ │ │ └── list.js │ │ └── webpack.config.js │ ├── popup/ │ │ ├── .babelrc │ │ ├── gulpfile.js │ │ ├── index.html │ │ ├── main.js │ │ ├── package.json │ │ ├── scss/ │ │ │ └── main.scss │ │ ├── view/ │ │ │ ├── component/ │ │ │ │ ├── alert-view.hbs │ │ │ │ ├── alert-view.js │ │ │ │ ├── base-view.hbs │ │ │ │ ├── base-view.js │ │ │ │ ├── index.js │ │ │ │ ├── popup-view.hbs │ │ │ │ └── popup-view.js │ │ │ └── layout/ │ │ │ ├── main-layout.hbs │ │ │ └── main-layout.js │ │ └── webpack.config.js │ ├── route/ │ │ ├── .babelrc │ │ ├── action/ │ │ │ └── index.js │ │ ├── gulpfile.js │ │ ├── index.html │ │ ├── main.js │ │ ├── middleware/ │ │ │ └── index.js │ │ ├── package.json │ │ ├── sass/ │ │ │ └── main.scss │ │ ├── template/ │ │ │ ├── main.hbs │ │ │ ├── sub1.hbs │ │ │ ├── sub2-2.hbs │ │ │ └── sub2.hbs │ │ ├── view/ │ │ │ ├── child.js │ │ │ ├── content1.hbs │ │ │ ├── content1.js │ │ │ ├── content2.hbs │ │ │ ├── content2.js │ │ │ ├── content3.hbs │ │ │ ├── content3.js │ │ │ ├── index.js │ │ │ ├── layout1.hbs │ │ │ ├── layout1.js │ │ │ ├── layout2.hbs │ │ │ ├── layout2.js │ │ │ ├── layout3.hbs │ │ │ ├── layout3.js │ │ │ ├── main.hbs │ │ │ ├── main.js │ │ │ ├── main1.hbs │ │ │ ├── main1.js │ │ │ ├── main2.hbs │ │ │ ├── main2.js │ │ │ ├── main3.hbs │ │ │ ├── main3.js │ │ │ ├── sub-child.js │ │ │ ├── sub-content1.hbs │ │ │ ├── sub-content1.js │ │ │ ├── sub-content2.hbs │ │ │ └── sub-content2.js │ │ └── webpack.config.js │ ├── schema/ │ │ ├── .babelrc │ │ ├── gulpfile.js │ │ ├── hello-view.js │ │ ├── index.html │ │ ├── main.js │ │ ├── package.json │ │ ├── schema.hbs │ │ └── webpack.config.js │ ├── timer/ │ │ ├── index.html │ │ └── js/ │ │ ├── main.js │ │ └── woowahan.js │ ├── todo/ │ │ ├── .babelrc │ │ ├── action/ │ │ │ └── index.js │ │ ├── global.config.js │ │ ├── gulpfile.js │ │ ├── index.html │ │ ├── keycode.js │ │ ├── main.js │ │ ├── package.json │ │ ├── reducer/ │ │ │ └── todos.js │ │ ├── schema/ │ │ │ └── todo.js │ │ ├── template/ │ │ │ ├── todo-app.hbs │ │ │ ├── todo-item.hbs │ │ │ └── todo-state.hbs │ │ ├── view/ │ │ │ ├── todo-app.js │ │ │ ├── todo-item.js │ │ │ └── todo-state.js │ │ └── webpack.config.js │ └── transition/ │ ├── .babelrc │ ├── gulpfile.js │ ├── index.html │ ├── main.js │ ├── package.json │ ├── view/ │ │ ├── component/ │ │ │ ├── base-view.hbs │ │ │ ├── base-view.js │ │ │ └── index.js │ │ └── layout/ │ │ ├── main-layout.hbs │ │ └── main-layout.js │ └── webpack.config.js ├── index.js ├── lib/ │ ├── action.js │ ├── collection-view.js │ ├── component.js │ ├── error.js │ ├── event.js │ ├── events.js │ ├── item-view.js │ ├── layout.js │ ├── middleware.js │ ├── plugin/ │ │ ├── checkbox.js │ │ ├── input-text.js │ │ ├── select.js │ │ └── text.js │ ├── plugin.js │ ├── popup-view.js │ ├── reducer.js │ ├── router.js │ ├── schema.js │ ├── store.js │ ├── types.js │ ├── view.js │ └── woowahan.js ├── package.json ├── src/ │ ├── action.js │ ├── collection-view.js │ ├── component.js │ ├── error.js │ ├── event.js │ ├── events.js │ ├── item-view.js │ ├── layout.js │ ├── middleware.js │ ├── plugin/ │ │ ├── checkbox.js │ │ ├── input-text.js │ │ ├── select.js │ │ └── text.js │ ├── plugin.js │ ├── popup-view.js │ ├── reducer.js │ ├── router.js │ ├── schema.js │ ├── store.js │ ├── types.js │ ├── view.js │ └── woowahan.js └── test/ ├── mocha.opts ├── schema.js ├── store.js └── types.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .babelrc ================================================ { "presets": ["es2015"] } ================================================ FILE: .gitignore ================================================ # Created by .ignore support plugin (hsz.mobi) ### Node template # Logs logs *.log npm-debug.log* # Runtime data pids *.pid *.seed # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage # nyc test coverage .nyc_output # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt # node-waf configuration .lock-wscript # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release # Dependency directories node_modules jspm_packages # Optional npm cache directory .npm # Optional REPL history .node_repl_history ### JetBrains template # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff: .idea ## File-based project format: *.iws ## Plugin-specific files: # IntelliJ /out/ # mpeltonen/sbt-idea plugin .idea_modules/ # JIRA plugin atlassian-ide-plugin.xml # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties ### OSX template *.DS_Store .AppleDouble .LSOverride # Icon must end with two \r Icon # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent # Directories potentially created on remote AFP share .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk examples/**/dist ================================================ FILE: CONTRIBUTING.md ================================================ # WoowahanJS에 기여하기 :+1::tada: WoowahanJS에 관심을 가져주셔서 감사합니다. :tada::+1: ## 이슈 제출 * [여기](https://github.com/woowabros/WoowahanJS/issues/new)에서 새로운 이슈를 제출할 수 있습니다. 이슈를 제출하기 전에 아래의 항목들을 숙지하고 가능한한 이슈에 대해 최대한 많은 정보와 자세한 설명을 포함해야 합니다. * 작성하려는 이슈가 이미 있는지 [여기](https://github.com/woowabros/WoowahanJS/issues)에서 검색 후 등록해야 합니다. 비슷한 이슈가 있다면 댓글로 추가 내용을 덧붙일 수 있습니다. * 이슈에는 하나의 문제 또는 제안을 작성해야 합니다. 하나의 이슈에 2개 이상의 내용을 제출할 수 없습니다. * 가능하다면 다음 항목을 포함해야 합니다: * 사용중인 WoowahanJS의 버전 * 사용중인 운영체제 * 무엇을 하려고 했고, 어떤 결과를 예측했으며, 어떤 것이 예측한대로 작동하지 않았는지에 대한 서술 * 스크린샷 또는 GIF 애니메이션 이미지들 * 터미널에 출력된 에러의 내용 또는 개발자 도구, 알림창에 뜬 내용 ## Pull request(PR) 하기 * `master` 브랜치의 코드는 수정할 수 없습니다. * PR은 `develop` 브랜치만 허용합니다. * `develop` 브랜치를 부모로 한 토픽 브랜치를 활용하는 것을 권장합니다. * 가능하다면 다음 항목을 포함해야 합니다: * 스크린샷 또는 GIF 애니메이션 이미지들 ================================================ FILE: README.en.md ================================================ # WoowahanJS WoowahanJS는 보다 큰 규모의 웹 어플리케이션 개발을 위한 프레임워크입니다. 현대의 웹 어플리케이션은 많은 수의 컴포넌트로 복잡하게 구성된 뷰와 상태를 관리하는 HTTP 기반 클라이언트 어플리케이션 입니다. 일정 규모 이상의 웹 어플리케이션을 개발하기 위해선 다양한 디자이너, 퍼블리셔 및 프로그래머가 협업해야 합니다. WoowahanJS는 퍼블리셔와 프로그래머간 협업이 쉬운 환경을 제공합니다. 빠르고 생산성 높은 UI 작업을 위해 계층 뷰 컴포넌트 관리와 One-way data binding을 지원하며 UI와 비즈니스 코드간 종속성을 최소화 하기 위한 아키텍처로 설계되었습니다. ## 영향을 받은 것들 WoowahanJS는 유명한 [BackboneJS](http://backbonejs.org) 기반 위에서 작성되었습니다. [BackboneJS](http://backbonejs.org)는 [UnderscoreJS](http://underscorejs.org), [jQuery](http://jquery.com) 종속성을 포함하므로 WoowahanJS도 자연스럽게 언제든 [UnderscoreJS](http://underscorejs.org)와 [jQuery](http://jquery.com)를 사용할 수 있습니다. API 호출에서 촉발되는 상태 흐름과 관리를 위해 [React](https://facebook.github.io/react/) 프로젝트의 [Flux](https://facebook.github.io/flux) 및 [Redux](http://redux.js.org) 아키텍처의 아이디어를 구현했습니다. 하지만 WoowahanJS를 사용하기 위해 이들을 선행학습 할 필요는 없습니다. ## 빠르게 시작하기 저장소를 Clone 한 뒤 [Example](./examples) 디렉토리의 셈플들을 살펴보세요. WoowahanJS를 가장 빠르게 시작할 수 있는 지름길입니다. ## 설치 ``` $ mkdir hello-woowa && cd hello-woowa $ npm init $ npm install --save woowahan ``` ## Hello, WoowahanJS ```Javascript import Woowahan from 'woowahan'; const Main = Woowahan.View.create('Main', { template: '

Hello, WoowahanJs

' }); const app = new Woowahan(); app.start({ url: '/', container: 'body', view: Main }); ``` 다음 링크에서 더 많은 정보를 제공합니다. * [WoowahanJS 시작하기](./docs/README.md) ================================================ FILE: README.md ================================================ # WoowahanJS [![npm](https://img.shields.io/npm/v/woowahan.svg?style=flat-square)]() [![npm (tag)](https://img.shields.io/npm/v/woowahan/beta.svg?style=flat-square)]() [![npm](https://img.shields.io/npm/dm/woowahan.svg?style=flat-square)]() [![npm](https://img.shields.io/npm/l/woowahan.svg?style=flat-square)]() WoowahanJS는 보다 큰 규모의 웹 어플리케이션 개발을 위한 프레임워크입니다. 현대의 웹 어플리케이션은 많은 수의 컴포넌트로 복잡하게 구성된 뷰와 상태를 관리하는 HTTP 기반 클라이언트 어플리케이션 입니다. 일정 규모 이상의 웹 어플리케이션을 개발하기 위해선 다양한 디자이너, 퍼블리셔 및 프로그래머가 협업해야 합니다. WoowahanJS는 퍼블리셔와 프로그래머간 협업이 쉬운 환경을 제공합니다. 빠르고 생산성 높은 UI 작업을 위해 계층 뷰 컴포넌트 관리와 One-way data binding을 지원하며 UI와 비즈니스 코드간 종속성을 최소화 하기 위한 아키텍처로 설계되었습니다. ## 영향을 받은 것들 WoowahanJS는 유명한 [BackboneJS](http://backbonejs.org) 기반 위에서 작성되었습니다. [BackboneJS](http://backbonejs.org)는 [UnderscoreJS](http://underscorejs.org), [jQuery](http://jquery.com) 종속성을 포함하므로 WoowahanJS도 자연스럽게 언제든 [UnderscoreJS](http://underscorejs.org)와 [jQuery](http://jquery.com)를 사용할 수 있습니다. API 호출에서 촉발되는 상태 흐름과 관리를 위해 [React](https://facebook.github.io/react/) 프로젝트의 [Flux](https://facebook.github.io/flux) 및 [Redux](http://redux.js.org) 아키텍처의 아이디어를 구현했습니다. 하지만 WoowahanJS를 사용하기 위해 이들을 선행학습 할 필요는 없습니다. ## 빠르게 시작하기 저장소를 Clone 한 뒤 [Example](./examples) 디렉토리의 셈플들을 살펴보세요. WoowahanJS를 가장 빠르게 시작할 수 있는 지름길입니다. ## 설치 ``` $ mkdir hello-woowa && cd hello-woowa $ npm init $ npm install --save woowahan ``` ## Hello, WoowahanJS ```Javascript import Woowahan from 'woowahan'; const Main = Woowahan.View.create('Main', { template: '

Hello, WoowahanJs

' }); const app = new Woowahan(); app.start({ url: '/', container: 'body', view: Main }); ``` 다음 링크에서 더 많은 정보를 제공합니다. * [WoowahanJS 시작하기](http://ibare.gitbooks.io/woowahanjs/) ================================================ FILE: dist/woowahan.js ================================================ !function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=6)}([function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);tc?h.call.apply(h,[f].concat(r(n),[u])):(h.call.apply(h,[f].concat(r(n))),setTimeout(u,1))}else{!!a&&a();var d=i.shift();o=!1,d&&s.run.apply(s,r(d))}}()}}},function(e,t,n){"use strict";(function(t){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};i(this,e),this.reducers=t.reducers||{},this.components=t.components||{},this.middlewares={app:{before:[],after:[]},router:{before:[],after:[]},reducer:{before:[],after:[]},view:{before:[],after:[],unmount:[]}},this.importViews={},this.store=null,this.queue=[],this.pretasks=[],this.actionObject={},this.queuemonitor=null,d=this,this.enableQueue()}return s(e,[{key:"import",value:function(e){var t=this;Object.keys(e.reducers||{}).forEach(function(n){return t.use(e.reducers[n])}),Object.keys(e.views||{}).forEach(function(n){return t.importViews[n]=e.views[n]})}},{key:"getView",value:function(e){return this.importViews[e]}},{key:"enableQueue",value:function(){this.queuemonitor=setInterval(this.queuing.bind(this),1e3/60)}},{key:"disableQueue",value:function(){this.queuemonitor=clearInterval(this.queuemonitor)}},{key:"addAction",value:function(e){this.actionObject[e]=Date.now(),1===this.numberOfWorkAction()&&this.trigger("start")}},{key:"removeAction",value:function(e){delete this.actionObject[e],0===this.numberOfWorkAction()&&this.trigger("finish")}},{key:"addError",value:function(e){this.trigger("error",e)}},{key:"queuing",value:function(){this.disableQueue();var e=this.queue.shift();if(e){var t=this.reducers[e.action.type];if(!t)throw this.enableQueue(),new Error("The unregistered reducer. Please check the type of action, if there is a written reducer use after registration.");if(e.subscriber=e.subscriber||function(){},"function"!=typeof e.subscriber)throw this.enableQueue(),new Error("The listener must be a function. If you do not need the listener it may not be specified.");if(t.schema){var n=t.schema.validate(e.action.data);n?this.trigger("error",n):new(Function.prototype.bind.apply(t,Array.prototype.concat.call(t,e.action.data,e.subscriber.bind(this))))}else new(Function.prototype.bind.apply(t,Array.prototype.concat.call(t,e.action.data,e.subscriber.bind(this))))}this.enableQueue()}},{key:"bindStore",value:function(e){this.store=e}},{key:"bindReducer",value:function(e){this.reducers[e.actionName]=e}},{key:"bindComponent",value:function(e){this.components[e.name]=e}},{key:"bindPlugin",value:function(t){var n=t.type.toLowerCase();if(e.View.prototype._plugins.hasOwnProperty(n))throw new Error("Duplicate plugin name");e.View.prototype._plugins[n]=t.plugin}},{key:"combineReducer",value:function(e){var t=this;e&&e.forEach(function(e){t.bindReducer(e)})}},{key:"getStates",value:function(e){return void 0!==e?this.store[e]:this.store}},{key:"setStates",value:function(e,t){var n=void 0;n="string"==typeof e&&void 0!==t?r({},e,t):e,this.store||(this.store={}),Object.assign(this.store,n)}},{key:"getMiddleware",value:function(e,t){return this.middlewares[e][t]}},{key:"getComponent",value:function(e){var t=this.components[e];if(t)return t.view}},{key:"getRouteTables",value:function(){return u.routeTables}},{key:"dispatch",value:function(e,t){this.queue.push({action:e,subscriber:t})}},{key:"use",value:function(e){var t=this;Array.isArray(e)?e.forEach(function(e){return t.useModule(e)}):"object"!==(void 0===e?"undefined":o(e))||"wwtype"in e?this.useModule(e):Object.keys(e).forEach(function(n){"function"==typeof e[n]&&t.useModule(e[n])})}},{key:"useModule",value:function(e){switch(e.wwtype){case"reducer":this.bindReducer(e);break;case"layout":u.bindLayout(e);break;case"store":this.bindStore(e.store);break;case"component":console.warn("Component:: Deprecated and will be removed in a future release."),this.bindComponent(e);break;case"plugin":this.bindPlugin(e)}}},{key:"set",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=new e(n);if(!r.mwtype)throw new Error('Required attribute "mwtype" is missing.');Object.values(l).forEach(function(e){e in r&&t.middlewares[r.mwtype][e].push(r)})}},{key:"start",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("undefined"==typeof jQuery)throw new Error("jQuery is not loaded!!");var r=setInterval(function(){switch(document.readyState){case"complete":case"loaded":break;default:return}clearInterval(r),a.History.started&&a.history.stop(),e&&u.design(e,n,h);var i=t.getMiddleware(c.APP,l.BEFORE);f.run(i,l.BEFORE,[h],function(){i=this.getMiddleware(c.APP,l.AFTER),f.run(i,l.AFTER,[h],function(){a.history.start({pushState:!!n.pushState})})}.bind(t))},1)}},{key:"numberOfAction",value:function(){return this.queue.length}},{key:"numberOfWorkAction",value:function(){return Object.keys(this.actionObject).length}}]),e}();Object.assign(p.prototype,a.Events),p.$=a.$,p.View=n(11)(h),p.Reducer=n(16)(h),p.Error=n(4),p.Types=n(17),p.Store=n(18),p.Action=n(19),p.Event=n(20),p.Schema=n(21),p.Layout=n(22),p.Component=n(23),p.Plugin=n(24),e.exports=t.Woowahan=p,p.CollectionView=n(25)(h),p.ItemView=n(26)(h),p.PopupView=n(27)(h),p.version="1.2.2"}).call(t,n(3))},function(e,t,n){"use strict";(function(r){var i,o,s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};!function(a){var u="object"==("undefined"==typeof self?"undefined":s(self))&&self.self===self&&self||"object"==(void 0===r?"undefined":s(r))&&r.global===r&&r;i=[n(7),n(8),t],void 0!==(o=function(e,t,n){u.Backbone=a(u,n,e,t)}.apply(t,i))&&(e.exports=o)}(function(e,t,n,r){var i=e.Backbone,o=Array.prototype.slice;t.VERSION="1.3.3",t.$=r,t.noConflict=function(){return e.Backbone=i,this},t.emulateHTTP=!1,t.emulateJSON=!1;var a=function(e,t,r){switch(e){case 1:return function(){return n[t](this[r])};case 2:return function(e){return n[t](this[r],e)};case 3:return function(e,i){return n[t](this[r],c(e,this),i)};case 4:return function(e,i,o){return n[t](this[r],c(e,this),i,o)};default:return function(){var e=o.call(arguments);return e.unshift(this[r]),n[t].apply(n,e)}}},u=function(e,t,r){n.each(t,function(t,i){n[i]&&(e.prototype[i]=a(t,i,r))})},c=function(e,t){return n.isFunction(e)?e:n.isObject(e)&&!t._isModel(e)?l(e):n.isString(e)?function(t){return t.get(e)}:e},l=function(e){var t=n.matches(e);return function(e){return t(e.attributes)}},f=t.Events={},h=/\s+/,d=function e(t,r,i,o,a){var u,c=0;if(i&&"object"===(void 0===i?"undefined":s(i))){void 0!==o&&"context"in a&&void 0===a.context&&(a.context=o);for(u=n.keys(i);cthis.length&&(i=this.length),i<0&&(i+=this.length+1);var o,s,a=[],u=[],c=[],l=[],f={},h=t.add,d=t.merge,p=t.remove,v=!1,y=this.comparator&&null==i&&!1!==t.sort,g=n.isString(this.comparator)?this.comparator:null;for(s=0;s7),this._useHashChange=this._wantsHashChange&&this._hasHashChange,this._wantsPushState=!!this.options.pushState,this._hasPushState=!(!this.history||!this.history.pushState),this._usePushState=this._wantsPushState&&this._hasPushState,this.fragment=this.getFragment(),this.root=("/"+this.root+"/").replace(q,"/"),this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){var t=this.root.slice(0,-1)||"/";return this.location.replace(t+"#"+this.getPath()),!0}this._hasPushState&&this.atRoot()&&this.navigate(this.getHash(),{replace:!0})}if(!this._hasHashChange&&this._wantsHashChange&&!this._usePushState){this.iframe=document.createElement("iframe"),this.iframe.src="javascript:0",this.iframe.style.display="none",this.iframe.tabIndex=-1;var r=document.body,i=r.insertBefore(this.iframe,r.firstChild).contentWindow;i.document.open(),i.document.close(),i.location.hash="#"+this.fragment}var o=window.addEventListener||function(e,t){return attachEvent("on"+e,t)};if(this._usePushState?o("popstate",this.checkUrl,!1):this._useHashChange&&!this.iframe?o("hashchange",this.checkUrl,!1):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),!this.options.silent)return this.loadUrl()},stop:function(){var e=window.removeEventListener||function(e,t){return detachEvent("on"+e,t)};this._usePushState?e("popstate",this.checkUrl,!1):this._useHashChange&&!this.iframe&&e("hashchange",this.checkUrl,!1),this.iframe&&(document.body.removeChild(this.iframe),this.iframe=null),this._checkUrlInterval&&clearInterval(this._checkUrlInterval),D.started=!1},route:function(e,t){this.handlers.unshift({route:e,callback:t})},checkUrl:function(e){var t=this.getFragment();if(t===this.fragment&&this.iframe&&(t=this.getHash(this.iframe.contentWindow)),t===this.fragment)return!1;this.iframe&&this.navigate(t),this.loadUrl()},loadUrl:function(e){return!!this.matchRoot()&&(e=this.fragment=this.getFragment(e),n.some(this.handlers,function(t){if(t.route.test(e))return t.callback(e),!0}))},navigate:function(e,t){if(!D.started)return!1;t&&!0!==t||(t={trigger:!!t}),e=this.getFragment(e||"");var n=this.root;""!==e&&"?"!==e.charAt(0)||(n=n.slice(0,-1)||"/");var r=n+e;if(e=this.decodeFragment(e.replace(I,"")),this.fragment!==e){if(this.fragment=e,this._usePushState)this.history[t.replace?"replaceState":"pushState"]({},document.title,r);else{if(!this._wantsHashChange)return this.location.assign(r);if(this._updateHash(this.location,e,t.replace),this.iframe&&e!==this.getHash(this.iframe.contentWindow)){var i=this.iframe.contentWindow;t.replace||(i.document.open(),i.document.close()),this._updateHash(i.location,e,t.replace)}}return t.trigger?this.loadUrl(e):void 0}},_updateHash:function(e,t,n){if(n){var r=e.href.replace(/(javascript:|#).*$/,"");e.replace(r+"#"+t)}else e.hash="#"+t}}),t.history=new D;var F=function(e,t){var r,i=this;return r=e&&n.has(e,"constructor")?e.constructor:function(){return i.apply(this,arguments)},n.extend(r,i,t),r.prototype=n.create(i.prototype,e),r.prototype.constructor=r,r.__super__=i.prototype,r};w.extend=x.extend=j.extend=_.extend=D.extend=F;var P=function(){throw new Error('A "url" property or function must be specified')},$=function(e,t){var n=t.error;t.error=function(r){n&&n.call(t.context,e,r,t),e.trigger("error",e,r,t)}};return t})}).call(t,n(3))},function(e,t,n){"use strict";var r,i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};r=function(){return this}();try{r=r||Function("return this")()||(0,eval)("this")}catch(e){"object"===("undefined"==typeof window?"undefined":i(window))&&(r=window)}e.exports=r},function(e,t,n){"use strict";e.exports={create:function(e,t){return{wwtype:"error",code:1,message:e,target:t}}}},function(e,t,n){"use strict";e.exports={SELECTED_ROW:"selectedRow",SELECTED_CELL:"selectedCell"}},function(e,t,n){"use strict";e.exports=n(1)},function(e,t,n){"use strict";var r,i,o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};(function(){function n(e){function t(t,n,r,i,o,s){for(;o>=0&&o0?0:a-1;return arguments.length<3&&(i=n[s?s[u]:u],u+=e),t(n,r,i,s,u,a)}}function s(e){return function(t,n,r){n=_(n,r);for(var i=O(t),o=e>0?0:i-1;o>=0&&o0?s=o>=0?o:Math.max(o+a,s):a=o>=0?Math.min(o+1,a):o+a+1;else if(n&&o&&a)return o=n(r,i),r[o]===i?o:-1;if(i!==i)return o=t(v.call(r,s,a),S.isNaN),o>=0?o+s:-1;for(o=e>0?s:a-1;o>=0&&o=0&&t<=j};S.each=S.forEach=function(e,t,n){t=T(t,n);var r,i;if(N(e))for(r=0,i=e.length;r=0},S.invoke=function(e,t){var n=v.call(arguments,2),r=S.isFunction(t);return S.map(e,function(e){var i=r?t:e[t];return null==i?i:i.apply(e,n)})},S.pluck=function(e,t){return S.map(e,S.property(t))},S.where=function(e,t){return S.filter(e,S.matcher(t))},S.findWhere=function(e,t){return S.find(e,S.matcher(t))},S.max=function(e,t,n){var r,i,o=-1/0,s=-1/0;if(null==t&&null!=e){e=N(e)?e:S.values(e);for(var a=0,u=e.length;ao&&(o=r)}else t=_(t,n),S.each(e,function(e,n,r){((i=t(e,n,r))>s||i===-1/0&&o===-1/0)&&(o=e,s=i)});return o},S.min=function(e,t,n){var r,i,o=1/0,s=1/0;if(null==t&&null!=e){e=N(e)?e:S.values(e);for(var a=0,u=e.length;ar||void 0===n)return 1;if(nt?(s&&(clearTimeout(s),s=null),a=c,o=e.apply(r,i),s||(r=i=null)):s||!1===n.trailing||(s=setTimeout(u,l)),o}},S.debounce=function(e,t,n){var r,i,o,s,a,u=function u(){var c=S.now()-s;c=0?r=setTimeout(u,t-c):(r=null,n||(a=e.apply(o,i),r||(o=i=null)))};return function(){o=this,i=arguments,s=S.now();var c=n&&!r;return r||(r=setTimeout(u,t)),c&&(a=e.apply(o,i),o=i=null),a}},S.wrap=function(e,t){return S.partial(t,e)},S.negate=function(e){return function(){return!e.apply(this,arguments)}},S.compose=function(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}},S.after=function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},S.before=function(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}},S.once=S.partial(S.before,2);var L=!{toString:null}.propertyIsEnumerable("toString"),q=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];S.keys=function(e){if(!S.isObject(e))return[];if(b)return b(e);var t=[];for(var n in e)S.has(e,n)&&t.push(n);return L&&u(e,t),t},S.allKeys=function(e){if(!S.isObject(e))return[];var t=[];for(var n in e)t.push(n);return L&&u(e,t),t},S.values=function(e){for(var t=S.keys(e),n=t.length,r=Array(n),i=0;i":">",'"':""","'":"'","`":"`"},P=S.invert(F),$=function(e){var t=function(t){return e[t]},n="(?:"+S.keys(e).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(e){return e=null==e?"":""+e,r.test(e)?e.replace(i,t):e}};S.escape=$(F),S.unescape=$(P),S.result=function(e,t,n){var r=null==e?void 0:e[t];return void 0===r&&(r=n),S.isFunction(r)?r.call(e):r};var H=0;S.uniqueId=function(e){var t=++H+"";return e?e+t:t},S.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var W=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},V=/\\|'|\r|\n|\u2028|\u2029/g,U=function(e){return"\\"+B[e]};S.template=function(e,t,n){!t&&n&&(t=n),t=S.defaults({},t,S.templateSettings);var r=RegExp([(t.escape||W).source,(t.interpolate||W).source,(t.evaluate||W).source].join("|")+"|$","g"),i=0,o="__p+='";e.replace(r,function(t,n,r,s,a){return o+=e.slice(i,a).replace(V,U),i=a+t.length,n?o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?o+="'+\n((__t=("+r+"))==null?'':__t)+\n'":s&&(o+="';\n"+s+"\n__p+='"),t}),o+="';\n",t.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{var s=new Function(t.variable||"obj","_",o)}catch(e){throw e.source=o,e}var a=function(e){return s.call(this,e,S)};return a.source="function("+(t.variable||"obj")+"){\n"+o+"}",a},S.chain=function(e){var t=S(e);return t._chain=!0,t};var z=function(e,t){return e._chain?S(t).chain():t};S.mixin=function(e){S.each(S.functions(e),function(t){var n=S[t]=e[t];S.prototype[t]=function(){var e=[this._wrapped];return p.apply(e,arguments),z(this,n.apply(S,e))}})},S.mixin(S),S.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=f[e];S.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0],z(this,n)}}),S.each(["concat","join","slice"],function(e){var t=f[e];S.prototype[e]=function(){return z(this,t.apply(this._wrapped,arguments))}}),S.prototype.value=function(){return this._wrapped},S.prototype.valueOf=S.prototype.toJSON=S.prototype.value,S.prototype.toString=function(){return""+this._wrapped},r=[],void 0!==(i=function(){return S}.apply(t,r))&&(e.exports=i)}).call(void 0)},function(e,t,n){"use strict";(function(e){var n,r,i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};/*! * jQuery JavaScript Library v2.2.4 * http://jquery.com/ * * Includes Sizzle.js * http://sizzlejs.com/ * * Copyright jQuery Foundation and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2016-05-20T17:23Z */ !function(t,n){"object"===i(e)&&"object"===i(e.exports)?e.exports=t.document?n(t,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return n(e)}:n(t)}("undefined"!=typeof window?window:void 0,function(o,s){function a(e){var t=!!e&&"length"in e&&e.length,n=ce.type(e);return"function"!==n&&!ce.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function u(e,t,n){if(ce.isFunction(t))return ce.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return ce.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(be.test(t))return ce.filter(t,e,n);t=ce.filter(t,e)}return ce.grep(e,function(e){return ie.call(t,e)>-1!==n})}function c(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function l(e){var t={};return ce.each(e.match(Te)||[],function(e,n){t[n]=!0}),t}function f(){ee.removeEventListener("DOMContentLoaded",f),o.removeEventListener("load",f),ce.ready()}function h(){this.expando=ce.expando+h.uid++}function d(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Ne,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:Oe.test(n)?ce.parseJSON(n):n)}catch(e){}je.set(e,t,n)}else n=void 0;return n}function p(e,t,n,r){var i,o=1,s=20,a=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=a(),c=n&&n[3]||(ce.cssNumber[t]?"":"px"),l=(ce.cssNumber[t]||"px"!==c&&+u)&&Me.exec(ce.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do{o=o||".5",l/=o,ce.style(e,t,l+c)}while(o!==(o=a()/u)&&1!==o&&--s)}return n&&(l=+l||+u||0,i=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=i)),i}function v(e,t){var n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&ce.nodeName(e,t)?ce.merge([e],n):n}function y(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(c=ce.contains(o.ownerDocument,o),s=v(f.appendChild(o),"script"),c&&y(s),n)for(l=0;o=s[l++];)Fe.test(o.type||"")&&n.push(o);return f}function m(){return!0}function b(){return!1}function w(){try{return ee.activeElement}catch(e){}}function x(e,t,n,r,o,s){var a,u;if("object"===(void 0===t?"undefined":i(t))){"string"!=typeof n&&(r=r||n,n=void 0);for(u in t)x(e,u,n,r,t[u],s);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),!1===o)o=b;else if(!o)return e;return 1===s&&(a=o,o=function(e){return ce().off(e),a.apply(this,arguments)},o.guid=a.guid||(a.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,o,r,n)})}function E(e,t){return ce.nodeName(e,"table")&&ce.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function S(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function T(e){var t=Xe.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _(e,t){var n,r,i,o,s,a,u,c;if(1===t.nodeType){if(ke.hasData(e)&&(o=ke.access(e),s=ke.set(t,o),c=o.events)){delete s.handle,s.events={};for(i in c)for(n=0,r=c[i].length;n1&&"string"==typeof d&&!ue.checkClone&&ze.test(d))return e.each(function(i){var o=e.eq(i);p&&(t[0]=d.call(this,i,o.html())),C(o,t,n,r)});if(f&&(i=g(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=ce.map(v(i,"script"),S),a=s.length;l")).appendTo(t.documentElement),t=Je[0].contentDocument,t.write(),t.close(),n=j(e,t),Je.detach()),Ye[e]=n),n}function N(e,t,n){var r,i,o,s,a=e.style;return n=n||Ze(e),s=n?n.getPropertyValue(t)||n[t]:void 0,""!==s&&void 0!==s||ce.contains(e.ownerDocument,e)||(s=ce.style(e,t)),n&&!ue.pixelMarginRight()&&Ke.test(s)&&Qe.test(t)&&(r=a.width,i=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=r,a.minWidth=i,a.maxWidth=o),void 0!==s?s+"":s}function R(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function M(e){if(e in st)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=ot.length;n--;)if((e=ot[n]+t)in st)return e}function D(e,t,n){var r=Me.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function L(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;o<4;o+=2)"margin"===n&&(s+=ce.css(e,n+De[o],!0,i)),r?("content"===n&&(s-=ce.css(e,"padding"+De[o],!0,i)),"margin"!==n&&(s-=ce.css(e,"border"+De[o]+"Width",!0,i))):(s+=ce.css(e,"padding"+De[o],!0,i),"padding"!==n&&(s+=ce.css(e,"border"+De[o]+"Width",!0,i)));return s}function q(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Ze(e),s="border-box"===ce.css(e,"boxSizing",!1,o);if(i<=0||null==i){if(i=N(e,t,o),(i<0||null==i)&&(i=e.style[t]),Ke.test(i))return i;r=s&&(ue.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+L(e,t,n||(s?"border":"content"),r,o)+"px"}function I(e,t){for(var n,r,i,o=[],s=0,a=e.length;s=0&&n=0},isPlainObject:function(e){var t;if("object"!==ce.type(e)||e.nodeType||ce.isWindow(e))return!1;if(e.constructor&&!ae.call(e,"constructor")&&!ae.call(e.constructor.prototype||{},"isPrototypeOf"))return!1;for(t in e);return void 0===t||ae.call(e,t)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+"":"object"===(void 0===e?"undefined":i(e))||"function"==typeof e?oe[se.call(e)]||"object":void 0===e?"undefined":i(e)},globalEval:function(e){var t,n=eval;(e=ce.trim(e))&&(1===e.indexOf("use strict")?(t=ee.createElement("script"),t.text=e,ee.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(fe,"ms-").replace(he,de)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var n,r=0;if(a(e))for(n=e.length;rw.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[I]=!0,e}function i(e){var t=O.createElement("div");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)w.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||U)-(~e.sourceIndex||U);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),s=o.length;s--;)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}function u(e){return e&&void 0!==e.getElementsByTagName&&e}function c(){}function l(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function d(e,n,r){for(var i=0,o=n.length;i-1&&(r[c]=!(s[c]=f))}}else b=p(b===s?b.splice(y,b.length):b),o?o(null,s,b,u):Y.apply(s,b)})}function y(e){for(var t,n,r,i=e.length,o=w.relative[e[0].type],s=o||w.relative[" "],a=o?1:0,u=f(function(e){return e===t},s,!0),c=f(function(e){return K(t,e)>-1},s,!0),d=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,i}];a1&&h(d),a>1&&l(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(oe,"$1"),n,a0,o=e.length>0,s=function(r,s,a,u,c){var l,f,h,d=0,v="0",y=r&&[],g=[],m=A,b=r||o&&w.find.TAG("*",c),x=P+=null==m?1:Math.random()||.1,E=b.length;for(c&&(A=s===O||s||c);v!==E&&null!=(l=b[v]);v++){if(o&&l){for(f=0,s||l.ownerDocument===O||(j(l),a=!R);h=e[f++];)if(h(l,s||O,a)){u.push(l);break}c&&(P=x)}i&&((l=!h&&l)&&d--,r&&y.push(l))}if(d+=v,i&&v!==d){for(f=0;h=n[f++];)h(y,g,s,a);if(r){if(d>0)for(;v--;)y[v]||g[v]||(g[v]=G.call(u));g=p(g)}Y.apply(u,g),c&&!r&&g.length>0&&d+n.length>1&&t.uniqueSort(u)}return c&&(P=x,A=m),y};return i?r(s):s}var m,b,w,x,E,S,T,_,A,C,k,j,O,N,R,M,D,L,q,I="sizzle"+1*new Date,F=e.document,P=0,$=0,H=n(),W=n(),B=n(),V=function(e,t){return e===t&&(k=!0),0},U=1<<31,z={}.hasOwnProperty,X=[],G=X.pop,J=X.push,Y=X.push,Q=X.slice,K=function(e,t){for(var n=0,r=e.length;n+~]|"+ee+")"+ee+"*"),ue=new RegExp("="+ee+"*([^\\]'\"]*?)"+ee+"*\\]","g"),ce=new RegExp(re),le=new RegExp("^"+te+"$"),fe={ID:new RegExp("^#("+te+")"),CLASS:new RegExp("^\\.("+te+")"),TAG:new RegExp("^("+te+"|[*])"),ATTR:new RegExp("^"+ne),PSEUDO:new RegExp("^"+re),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ee+"*(even|odd|(([+-]|)(\\d*)n|)"+ee+"*(?:([+-]|)"+ee+"*(\\d+)|))"+ee+"*\\)|)","i"),bool:new RegExp("^(?:"+Z+")$","i"),needsContext:new RegExp("^"+ee+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ee+"*((?:-\\d)?\\d*)"+ee+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,de=/^h\d$/i,pe=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,ge=/'|\\/g,me=new RegExp("\\\\([\\da-f]{1,6}"+ee+"?|("+ee+")|.)","ig"),be=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},we=function(){j()};try{Y.apply(X=Q.call(F.childNodes),F.childNodes),X[F.childNodes.length].nodeType}catch(e){Y={apply:X.length?function(e,t){J.apply(e,Q.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}b=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},j=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:F;return r!==O&&9===r.nodeType&&r.documentElement?(O=r,N=O.documentElement,R=!E(O),(n=O.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",we,!1):n.attachEvent&&n.attachEvent("onunload",we)),b.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),b.getElementsByTagName=i(function(e){return e.appendChild(O.createComment("")),!e.getElementsByTagName("*").length}),b.getElementsByClassName=pe.test(O.getElementsByClassName),b.getById=i(function(e){return N.appendChild(e).id=I,!O.getElementsByName||!O.getElementsByName(I).length}),b.getById?(w.find.ID=function(e,t){if(void 0!==t.getElementById&&R){var n=t.getElementById(e);return n?[n]:[]}},w.filter.ID=function(e){var t=e.replace(me,be);return function(e){return e.getAttribute("id")===t}}):(delete w.find.ID,w.filter.ID=function(e){var t=e.replace(me,be);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),w.find.TAG=b.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):b.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},w.find.CLASS=b.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&R)return t.getElementsByClassName(e)},D=[],M=[],(b.qsa=pe.test(O.querySelectorAll))&&(i(function(e){N.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&M.push("[*^$]="+ee+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||M.push("\\["+ee+"*(?:value|"+Z+")"),e.querySelectorAll("[id~="+I+"-]").length||M.push("~="),e.querySelectorAll(":checked").length||M.push(":checked"),e.querySelectorAll("a#"+I+"+*").length||M.push(".#.+[+~]")}),i(function(e){var t=O.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&M.push("name"+ee+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||M.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),M.push(",.*:")})),(b.matchesSelector=pe.test(L=N.matches||N.webkitMatchesSelector||N.mozMatchesSelector||N.oMatchesSelector||N.msMatchesSelector))&&i(function(e){b.disconnectedMatch=L.call(e,"div"),L.call(e,"[s!='']:x"),D.push("!=",re)}),M=M.length&&new RegExp(M.join("|")),D=D.length&&new RegExp(D.join("|")),t=pe.test(N.compareDocumentPosition),q=t||pe.test(N.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return k=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!b.sortDetached&&t.compareDocumentPosition(e)===n?e===O||e.ownerDocument===F&&q(F,e)?-1:t===O||t.ownerDocument===F&&q(F,t)?1:C?K(C,e)-K(C,t):0:4&n?-1:1)}:function(e,t){if(e===t)return k=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],u=[t];if(!i||!o)return e===O?-1:t===O?1:i?-1:o?1:C?K(C,e)-K(C,t):0;if(i===o)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===F?-1:u[r]===F?1:0},O):O},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==O&&j(e),n=n.replace(ue,"='$1']"),b.matchesSelector&&R&&!B[n+" "]&&(!D||!D.test(n))&&(!M||!M.test(n)))try{var r=L.call(e,n);if(r||b.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,O,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==O&&j(e),q(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==O&&j(e);var n=w.attrHandle[t.toLowerCase()],r=n&&z.call(w.attrHandle,t.toLowerCase())?n(e,t,!R):void 0;return void 0!==r?r:b.attributes||!R?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(k=!b.detectDuplicates,C=!b.sortStable&&e.slice(0),e.sort(V),k){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return C=null,e},x=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=x(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=x(t);return n},w=t.selectors={cacheLength:50,createPseudo:r,match:fe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(me,be),e[3]=(e[3]||e[4]||e[5]||"").replace(me,be),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return fe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&ce.test(n)&&(t=S(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(me,be).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=H[e+" "];return t||(t=new RegExp("(^|"+ee+")"+e+"("+ee+"|$)"))&&H(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ie," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,h,d,p,v=o!==s?"nextSibling":"previousSibling",y=t.parentNode,g=a&&t.nodeName.toLowerCase(),m=!u&&!a,b=!1;if(y){if(o){for(;v;){for(h=t;h=h[v];)if(a?h.nodeName.toLowerCase()===g:1===h.nodeType)return!1;p=v="only"===e&&!p&&"nextSibling"}return!0}if(p=[s?y.firstChild:y.lastChild],s&&m){for(h=y,f=h[I]||(h[I]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),c=l[e]||[],d=c[0]===P&&c[1],b=d&&c[2],h=d&&y.childNodes[d];h=++d&&h&&h[v]||(b=d=0)||p.pop();)if(1===h.nodeType&&++b&&h===t){l[e]=[P,d,b];break}}else if(m&&(h=t,f=h[I]||(h[I]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),c=l[e]||[],d=c[0]===P&&c[1],b=d),!1===b)for(;(h=++d&&h&&h[v]||(b=d=0)||p.pop())&&((a?h.nodeName.toLowerCase()!==g:1!==h.nodeType)||!++b||(m&&(f=h[I]||(h[I]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),l[e]=[P,b]),h!==t)););return(b-=i)===r||b%r==0&&b/r>=0}}},PSEUDO:function(e,n){var i,o=w.pseudos[e]||w.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[I]?o(n):o.length>1?(i=[e,e,"",n],w.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),s=i.length;s--;)r=K(e,i[s]),e[r]=!(t[r]=i[s])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=T(e.replace(oe,"$1"));return i[I]?r(function(e,t,n,r){for(var o,s=i(e,null,r,[]),a=e.length;a--;)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(me,be),function(t){return(t.textContent||t.innerText||x(t)).indexOf(e)>-1}}),lang:r(function(e){return le.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(me,be).toLowerCase(),function(t){var n;do{if(n=R?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-")}while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===N},focus:function(e){return e===O.activeElement&&(!O.hasFocus||O.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return!1===e.disabled},disabled:function(e){return!0===e.disabled},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!w.pseudos.empty(e)},header:function(e){return de.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:a(function(){return[0]}),last:a(function(e,t){return[t-1]}),eq:a(function(e,t,n){return[n<0?n+t:n]}),even:a(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:a(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=o[0]).type&&b.getById&&9===t.nodeType&&R&&w.relative[o[1].type]){if(!(t=(w.find.ID(s.matches[0].replace(me,be),t)||[])[0]))return n;f&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=fe.needsContext.test(e)?0:o.length;i--&&(s=o[i],!w.relative[a=s.type]);)if((c=w.find[a])&&(r=c(s.matches[0].replace(me,be),ye.test(o[0].type)&&u(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&l(o)))return Y.apply(n,r),n;break}}return(f||T(e,h))(r,t,!R,n,!t||ye.test(e)&&u(t.parentNode)||t),n},b.sortStable=I.split("").sort(V).join("")===I,b.detectDuplicates=!!k,j(),b.sortDetached=i(function(e){return 1&e.compareDocumentPosition(O.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),b.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(Z,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(o);ce.find=pe,ce.expr=pe.selectors,ce.expr[":"]=ce.expr.pseudos,ce.uniqueSort=ce.unique=pe.uniqueSort,ce.text=pe.getText,ce.isXMLDoc=pe.isXML,ce.contains=pe.contains;var ve=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},ye=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},ge=ce.expr.match.needsContext,me=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,be=/^.[^:#\[\.,]*$/;ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n=this.length,r=[],i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t1?ce.unique(r):r),r.selector=this.selector?this.selector+" "+e:e,r},filter:function(e){return this.pushStack(u(this,e||[],!1))},not:function(e){return this.pushStack(u(this,e||[],!0))},is:function(e){return!!u(this,"string"==typeof e&&ge.test(e)?ce(e):e||[],!1).length}});var we,xe=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||we,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:xe.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:ee,!0)),me.test(r[1])&&ce.isPlainObject(t))for(r in t)ce.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=ee.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=ee,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):ce.isFunction(e)?void 0!==n.ready?n.ready(e):e(ce):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),ce.makeArray(e,this))}).prototype=ce.fn,we=ce(ee);var Ee=/^(?:parents|prev(?:Until|All))/,Se={children:!0,contents:!0,next:!0,prev:!0};ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?ie.call(ce(e),this[0]):ie.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return ve(e,"parentNode")},parentsUntil:function(e,t,n){return ve(e,"parentNode",n)},next:function(e){return c(e,"nextSibling")},prev:function(e){return c(e,"previousSibling")},nextAll:function(e){return ve(e,"nextSibling")},prevAll:function(e){return ve(e,"previousSibling")},nextUntil:function(e,t,n){return ve(e,"nextSibling",n)},prevUntil:function(e,t,n){return ve(e,"previousSibling",n)},siblings:function(e){return ye((e.parentNode||{}).firstChild,e)},children:function(e){return ye(e.firstChild)},contents:function(e){return e.contentDocument||ce.merge([],e.childNodes)}},function(e,t){ce.fn[e]=function(n,r){var i=ce.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=ce.filter(r,i)),this.length>1&&(Se[e]||ce.uniqueSort(i),Ee.test(e)&&i.reverse()),this.pushStack(i)}});var Te=/\S+/g;ce.Callbacks=function(e){e="string"==typeof e?l(e):ce.extend({},e);var t,n,r,i,o=[],s=[],a=-1,u=function(){for(i=e.once,r=t=!0;s.length;a=-1)for(n=s.shift();++a-1;)o.splice(n,1),n<=a&&a--}),this},has:function(e){return e?ce.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=s=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=s=[],n||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||u()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},ce.extend({Deferred:function(e){var t=[["resolve","done",ce.Callbacks("once memory"),"resolved"],["reject","fail",ce.Callbacks("once memory"),"rejected"],["notify","progress",ce.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return ce.Deferred(function(n){ce.each(t,function(t,o){var s=ce.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&ce.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?ce.extend(e,r):r}},i={};return r.pipe=r.then,ce.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=te.call(arguments),s=o.length,a=1!==s||e&&ce.isFunction(e.promise)?s:0,u=1===a?e:ce.Deferred(),c=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?te.call(arguments):i,r===t?u.notifyWith(n,r):--a||u.resolveWith(n,r)}};if(s>1)for(t=new Array(s),n=new Array(s),r=new Array(s);i0||(_e.resolveWith(ee,[ce]),ce.fn.triggerHandler&&(ce(ee).triggerHandler("ready"),ce(ee).off("ready"))))}}),ce.ready.promise=function(e){return _e||(_e=ce.Deferred(),"complete"===ee.readyState||"loading"!==ee.readyState&&!ee.documentElement.doScroll?o.setTimeout(ce.ready):(ee.addEventListener("DOMContentLoaded",f),o.addEventListener("load",f))),_e.promise(e)},ce.ready.promise();var Ae=function e(t,n,r,i,o,s,a){var u=0,c=t.length,l=null==r;if("object"===ce.type(r)){o=!0;for(u in r)e(t,n,u,r[u],!0,s,a)}else if(void 0!==i&&(o=!0,ce.isFunction(i)||(a=!0),l&&(a?(n.call(t,i),n=null):(l=n,n=function(e,t,n){return l.call(ce(e),n)})),n))for(;u-1&&void 0!==n&&je.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){je.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=ke.get(e,t),n&&(!r||ce.isArray(n)?r=ke.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t),s=function(){ce.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return ke.get(e,n)||ke.access(e,n,{empty:ce.Callbacks("once memory").add(function(){ke.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length",""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};Pe.optgroup=Pe.option,Pe.tbody=Pe.tfoot=Pe.colgroup=Pe.caption=Pe.thead,Pe.th=Pe.td;var $e=/<|&#?\w+;/;!function(){var e=ee.createDocumentFragment(),t=e.appendChild(ee.createElement("div")),n=ee.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),ue.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",ue.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var He=/^key/,We=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Be=/^([^.]*)(?:\.(.+)|)/;ce.event={global:{},add:function(e,t,n,r,i){var o,s,a,u,c,l,f,h,d,p,v,y=ke.get(e);if(y)for(n.handler&&(o=n,n=o.handler,i=o.selector),n.guid||(n.guid=ce.guid++),(u=y.events)||(u=y.events={}),(s=y.handle)||(s=y.handle=function(t){return void 0!==ce&&ce.event.triggered!==t.type?ce.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(Te)||[""],c=t.length;c--;)a=Be.exec(t[c])||[],d=v=a[1],p=(a[2]||"").split(".").sort(),d&&(f=ce.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=ce.event.special[d]||{},l=ce.extend({type:d,origType:v,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:p.join(".")},o),(h=u[d])||(h=u[d]=[],h.delegateCount=0,f.setup&&!1!==f.setup.call(e,r,p,s)||e.addEventListener&&e.addEventListener(d,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,l):h.push(l),ce.event.global[d]=!0)},remove:function(e,t,n,r,i){var o,s,a,u,c,l,f,h,d,p,v,y=ke.hasData(e)&&ke.get(e);if(y&&(u=y.events)){for(t=(t||"").match(Te)||[""],c=t.length;c--;)if(a=Be.exec(t[c])||[],d=v=a[1],p=(a[2]||"").split(".").sort(),d){for(f=ce.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,h=u[d]||[],a=a[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=h.length;o--;)l=h[o],!i&&v!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(h.splice(o,1),l.selector&&h.delegateCount--,f.remove&&f.remove.call(e,l));s&&!h.length&&(f.teardown&&!1!==f.teardown.call(e,p,y.handle)||ce.removeEvent(e,d,y.handle),delete u[d])}else for(d in u)ce.event.remove(e,d+t[c],n,r,!0);ce.isEmptyObject(u)&&ke.remove(e,"handle events")}},dispatch:function(e){e=ce.event.fix(e);var t,n,r,i,o,s=[],a=te.call(arguments),u=(ke.get(this,"events")||{})[e.type]||[],c=ce.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,e)){for(s=ce.event.handlers.call(this,e,u),t=0;(i=s[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,void 0!==(r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a))&&!1===(e.result=r)&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&(!0!==u.disabled||"click"!==e.type)){for(r=[],n=0;n-1:ce.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return a]*)\/>/gi,Ue=/\s*$/g;ce.extend({htmlPrefilter:function(e){return e.replace(Ve,"<$1>")},clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=ce.contains(e.ownerDocument,e);if(!(ue.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(s=v(a),o=v(e),r=0,i=o.length;r0&&y(s,!u&&v(e,"script")),a},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if(Ce(n)){if(t=n[ke.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[ke.expando]=void 0}n[je.expando]&&(n[je.expando]=void 0)}}}),ce.fn.extend({domManip:C,detach:function(e){return k(this,e,!0)},remove:function(e){return k(this,e)},text:function(e){return Ae(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return C(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){E(this,e).appendChild(e)}})},prepend:function(){return C(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=E(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return C(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return C(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(v(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return Ae(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ue.test(e)&&!Pe[(Ie.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n1)},show:function(){return I(this,!0)},hide:function(){return I(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Le(this)?ce(this).show():ce(this).hide()})}}),ce.Tween=F,F.prototype={constructor:F,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?"":"px")},cur:function(){var e=F.propHooks[this.prop];return e&&e.get?e.get(this):F.propHooks._default.get(this)},run:function(e){var t,n=F.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):F.propHooks._default.set(this),this}},F.prototype.init.prototype=F.prototype,F.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[ce.cssProps[e.prop]]&&!ce.cssHooks[e.prop]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}},F.propHooks.scrollTop=F.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},ce.fx=F.prototype.init,ce.fx.step={};var at,ut,ct=/^(?:toggle|show|hide)$/,lt=/queueHooks$/;ce.Animation=ce.extend(V,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return p(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){ce.isFunction(e)?(t=e,e=["*"]):e=e.match(Te);for(var n,r=0,i=e.length;r1)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(t=t.toLowerCase(),i=ce.attrHooks[t]||(ce.expr.match.bool.test(t)?ft:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=ce.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!ue.radioValue&&"radio"===t&&ce.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(Te);if(o&&1===e.nodeType)for(;n=o[i++];)r=ce.propFix[n]||n,ce.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)}}),ft={set:function(e,t,n){return!1===t?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||ce.find.attr;ht[t]=function(e,t,r){var i,o;return r||(o=ht[t],ht[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,ht[t]=o),i}});var dt=/^(?:input|select|textarea|button)$/i,pt=/^(?:a|area)$/i;ce.fn.extend({prop:function(e,t){return Ae(this,ce.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,"tabindex");return t?parseInt(t,10):dt.test(e.nodeName)||pt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),ue.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ce.propFix[this.toLowerCase()]=this});var vt=/[\t\r\n\f]/g;ce.fn.extend({addClass:function(e){var t,n,r,i,o,s,a,u=0;if(ce.isFunction(e))return this.each(function(t){ce(this).addClass(e.call(this,t,U(this)))});if("string"==typeof e&&e)for(t=e.match(Te)||[];n=this[u++];)if(i=U(n),r=1===n.nodeType&&(" "+i+" ").replace(vt," ")){for(s=0;o=t[s++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");a=ce.trim(r),i!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,i,o,s,a,u=0;if(ce.isFunction(e))return this.each(function(t){ce(this).removeClass(e.call(this,t,U(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(Te)||[];n=this[u++];)if(i=U(n),r=1===n.nodeType&&(" "+i+" ").replace(vt," ")){for(s=0;o=t[s++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");a=ce.trim(r),i!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=void 0===e?"undefined":i(e);return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):ce.isFunction(e)?this.each(function(n){ce(this).toggleClass(e.call(this,n,U(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=ce(this),o=e.match(Te)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=U(this),t&&ke.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":ke.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+U(n)+" ").replace(vt," ").indexOf(t)>-1)return!0;return!1}});var yt=/\r/g,gt=/[\x20\t\r\n\f]+/g;ce.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=ce.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,ce(this).val()):e,null==i?i="":"number"==typeof i?i+="":ce.isArray(i)&&(i=ce.map(i,function(e){return null==e?"":e+""})),(t=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return(t=ce.valHooks[i.type]||ce.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(yt,""):null==n?"":n)}}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,"value");return null!=t?t:ce.trim(ce.text(e)).replace(gt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,s=o?null:[],a=o?i+1:r.length,u=i<0?a:o?i:0;u-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each(["radio","checkbox"],function(){ce.valHooks[this]={set:function(e,t){if(ce.isArray(t))return e.checked=ce.inArray(ce(e).val(),t)>-1}},ue.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var mt=/^(?:focusinfocus|focusoutblur)$/;ce.extend(ce.event,{trigger:function(e,t,n,r){var s,a,u,c,l,f,h,d=[n||ee],p=ae.call(e,"type")?e.type:e,v=ae.call(e,"namespace")?e.namespace.split("."):[];if(a=u=n=n||ee,3!==n.nodeType&&8!==n.nodeType&&!mt.test(p+ce.event.triggered)&&(p.indexOf(".")>-1&&(v=p.split("."),p=v.shift(),v.sort()),l=p.indexOf(":")<0&&"on"+p,e=e[ce.expando]?e:new ce.Event(p,"object"===(void 0===e?"undefined":i(e))&&e),e.isTrigger=r?2:3,e.namespace=v.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+v.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:ce.makeArray(t,[e]),h=ce.event.special[p]||{},r||!h.trigger||!1!==h.trigger.apply(n,t))){if(!r&&!h.noBubble&&!ce.isWindow(n)){for(c=h.delegateType||p,mt.test(c+p)||(a=a.parentNode);a;a=a.parentNode)d.push(a),u=a;u===(n.ownerDocument||ee)&&d.push(u.defaultView||u.parentWindow||o)}for(s=0;(a=d[s++])&&!e.isPropagationStopped();)e.type=s>1?c:h.bindType||p,f=(ke.get(a,"events")||{})[e.type]&&ke.get(a,"handle"),f&&f.apply(a,t),(f=l&&a[l])&&f.apply&&Ce(a)&&(e.result=f.apply(a,t),!1===e.result&&e.preventDefault());return e.type=p,r||e.isDefaultPrevented()||h._default&&!1!==h._default.apply(d.pop(),t)||!Ce(n)||l&&ce.isFunction(n[p])&&!ce.isWindow(n)&&(u=n[l],u&&(n[l]=null),ce.event.triggered=p,n[p](),ce.event.triggered=void 0,u&&(n[l]=u)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}}),ce.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){ce.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),ce.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),ue.focusin="onfocusin"in o,ue.focusin||ce.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){ce.event.simulate(t,e.target,ce.event.fix(e))};ce.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=ke.access(r,t);i||r.addEventListener(e,n,!0),ke.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=ke.access(r,t)-1;i?ke.access(r,t,i):(r.removeEventListener(e,n,!0),ke.remove(r,t))}}});var bt=o.location,wt=ce.now(),xt=/\?/;ce.parseJSON=function(e){return JSON.parse(e+"")},ce.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new o.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||ce.error("Invalid XML: "+e),t};var Et=/#.*$/,St=/([?&])_=[^&]*/,Tt=/^(.*?):[ \t]*([^\r\n]*)$/gm,_t=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,At=/^(?:GET|HEAD)$/,Ct=/^\/\//,kt={},jt={},Ot="*/".concat("*"),Nt=ee.createElement("a");Nt.href=bt.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:_t.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ot,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":ce.parseJSON,"text xml":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?G(G(e,ce.ajaxSettings),t):G(ce.ajaxSettings,e)},ajaxPrefilter:z(kt),ajaxTransport:z(jt),ajax:function(e,t){function n(e,t,n,i){var u,l,h,b,w,E=t;2!==x&&(x=2,c&&o.clearTimeout(c),r=void 0,a=i||"",S.readyState=e>0?4:0,u=e>=200&&e<300||304===e,n&&(b=J(d,S,n)),b=Y(d,b,S,u),u?(d.ifModified&&(w=S.getResponseHeader("Last-Modified"),w&&(ce.lastModified[s]=w),(w=S.getResponseHeader("etag"))&&(ce.etag[s]=w)),204===e||"HEAD"===d.type?E="nocontent":304===e?E="notmodified":(E=b.state,l=b.data,h=b.error,u=!h)):(h=E,!e&&E||(E="error",e<0&&(e=0))),S.status=e,S.statusText=(t||E)+"",u?y.resolveWith(p,[l,E,S]):y.rejectWith(p,[S,E,h]),S.statusCode(m),m=void 0,f&&v.trigger(u?"ajaxSuccess":"ajaxError",[S,d,u?l:h]),g.fireWith(p,[S,E]),f&&(v.trigger("ajaxComplete",[S,d]),--ce.active||ce.event.trigger("ajaxStop")))}"object"===(void 0===e?"undefined":i(e))&&(t=e,e=void 0),t=t||{};var r,s,a,u,c,l,f,h,d=ce.ajaxSetup({},t),p=d.context||d,v=d.context&&(p.nodeType||p.jquery)?ce(p):ce.event,y=ce.Deferred(),g=ce.Callbacks("once memory"),m=d.statusCode||{},b={},w={},x=0,E="canceled",S={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!u)for(u={};t=Tt.exec(a);)u[t[1].toLowerCase()]=t[2];t=u[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=w[n]=w[n]||e,b[e]=t),this},overrideMimeType:function(e){return x||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(x<2)for(t in e)m[t]=[m[t],e[t]];else S.always(e[S.status]);return this},abort:function(e){var t=e||E;return r&&r.abort(t),n(0,t),this}};if(y.promise(S).complete=g.add,S.success=S.done,S.error=S.fail,d.url=((e||d.url||bt.href)+"").replace(Et,"").replace(Ct,bt.protocol+"//"),d.type=t.method||t.type||d.method||d.type,d.dataTypes=ce.trim(d.dataType||"*").toLowerCase().match(Te)||[""],null==d.crossDomain){l=ee.createElement("a");try{l.href=d.url,l.href=l.href,d.crossDomain=Nt.protocol+"//"+Nt.host!=l.protocol+"//"+l.host}catch(e){d.crossDomain=!0}}if(d.data&&d.processData&&"string"!=typeof d.data&&(d.data=ce.param(d.data,d.traditional)),X(kt,d,t,S),2===x)return S;f=ce.event&&d.global,f&&0==ce.active++&&ce.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!At.test(d.type),s=d.url,d.hasContent||(d.data&&(s=d.url+=(xt.test(s)?"&":"?")+d.data,delete d.data),!1===d.cache&&(d.url=St.test(s)?s.replace(St,"$1_="+wt++):s+(xt.test(s)?"&":"?")+"_="+wt++)),d.ifModified&&(ce.lastModified[s]&&S.setRequestHeader("If-Modified-Since",ce.lastModified[s]),ce.etag[s]&&S.setRequestHeader("If-None-Match",ce.etag[s])),(d.data&&d.hasContent&&!1!==d.contentType||t.contentType)&&S.setRequestHeader("Content-Type",d.contentType),S.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Ot+"; q=0.01":""):d.accepts["*"]);for(h in d.headers)S.setRequestHeader(h,d.headers[h]);if(d.beforeSend&&(!1===d.beforeSend.call(p,S,d)||2===x))return S.abort();E="abort";for(h in{success:1,error:1,complete:1})S[h](d[h]);if(r=X(jt,d,t,S)){if(S.readyState=1,f&&v.trigger("ajaxSend",[S,d]),2===x)return S;d.async&&d.timeout>0&&(c=o.setTimeout(function(){S.abort("timeout")},d.timeout));try{x=1,r.send(b,n)}catch(e){if(!(x<2))throw e;n(-1,e)}}else n(-1,"No Transport");return S},getJSON:function(e,t,n){return ce.get(e,t,n,"json")},getScript:function(e,t){return ce.get(e,void 0,t,"script")}}),ce.each(["get","post"],function(e,t){ce[t]=function(e,n,r,i){return ce.isFunction(n)&&(i=i||r,r=n,n=void 0),ce.ajax(ce.extend({url:e,type:t,dataType:i,data:n,success:r},ce.isPlainObject(e)&&e))}}),ce._evalUrl=function(e){return ce.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},ce.fn.extend({wrapAll:function(e){var t;return ce.isFunction(e)?this.each(function(t){ce(this).wrapAll(e.call(this,t))}):(this[0]&&(t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return ce.isFunction(e)?this.each(function(t){ce(this).wrapInner(e.call(this,t))}):this.each(function(){var t=ce(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=ce.isFunction(e);return this.each(function(n){ce(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){ce.nodeName(this,"body")||ce(this).replaceWith(this.childNodes)}).end()}}),ce.expr.filters.hidden=function(e){return!ce.expr.filters.visible(e)},ce.expr.filters.visible=function(e){return e.offsetWidth>0||e.offsetHeight>0||e.getClientRects().length>0};var Rt=/%20/g,Mt=/\[\]$/,Dt=/\r?\n/g,Lt=/^(?:submit|button|image|reset|file)$/i,qt=/^(?:input|select|textarea|keygen)/i;ce.param=function(e,t){var n,r=[],i=function(e,t){t=ce.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=ce.ajaxSettings&&ce.ajaxSettings.traditional),ce.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(Rt,"+")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,"elements");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(":disabled")&&qt.test(this.nodeName)&&!Lt.test(e)&&(this.checked||!qe.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:ce.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Dt,"\r\n")}}):{name:t.name,value:n.replace(Dt,"\r\n")}}).get()}}),ce.ajaxSettings.xhr=function(){try{return new o.XMLHttpRequest}catch(e){}};var It={0:200,1223:204},Ft=ce.ajaxSettings.xhr();ue.cors=!!Ft&&"withCredentials"in Ft,ue.ajax=Ft=!!Ft,ce.ajaxTransport(function(e){var t,n;if(ue.cors||Ft&&!e.crossDomain)return{send:function(r,i){var s,a=e.xhr();if(a.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(s in e.xhrFields)a[s]=e.xhrFields[s];e.mimeType&&a.overrideMimeType&&a.overrideMimeType(e.mimeType),e.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(s in r)a.setRequestHeader(s,r[s]);t=function(e){return function(){t&&(t=n=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?i(0,"error"):i(a.status,a.statusText):i(It[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=t(),n=a.onerror=t("error"),void 0!==a.onabort?a.onabort=n:a.onreadystatechange=function(){4===a.readyState&&o.setTimeout(function(){t&&n()})},t=t("abort");try{a.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}}),ce.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),ce.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=ce("
================================================ FILE: examples/bind/main.js ================================================ import Woowahan from '../../index'; import HelloView from './hello-view'; import { TextDecoPlugin } from './plugin'; global.$ = global.jQuery = Woowahan.$; var app = new Woowahan(); app.use(Woowahan.Plugin('deco', TextDecoPlugin)); app.start({ url: '/', container: '#content', view: HelloView }); ================================================ FILE: examples/bind/package.json ================================================ { "name": "helloworld", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "build": "gulp build", "demo-server": "node ./node_modules/http-server/bin/http-server dist" }, "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^6.0.1", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-sass": "^2.3.1", "gulp-size": "^1.2.0", "gulp-stylus": "^2.0.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.3", "handlebars-loader": "^1.1.4", "http-server": "^0.9.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "request": "^2.72.0", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^2.1.1" }, "dependencies": { "bootstrap": "^3.3.7" } } ================================================ FILE: examples/bind/plugin/index.js ================================================ export const TextDecoPlugin = (element, value) => { const text = $(element).text(); $(element).text(text === '없음' ? '없는 항목입니다.' : `+ ${text} +`); }; ================================================ FILE: examples/bind/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; module.exports = { debug : true, devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.hbs$/, exclude: /node_modules/, loader: 'handlebars-loader'} ] } }; ================================================ FILE: examples/collection/.babelrc ================================================ { "presets": ["es2015"] } ================================================ FILE: examples/collection/collection-first.js ================================================ import Woowahan from '../../index'; const RowView = Woowahan.ItemView.create('RowView', { template: '
  • ', viewDidMount($el) { $el.text(this.getModel('name')); } }); export default Woowahan.CollectionView.create('CollectionViewFirst', { template: '
      ', rowContainer: '#rowContainer', rowView: RowView, viewDidMount() { this.reload(this.getModel('items'), { uid: 'name' }); }, viewWillUnmount() { this.reload(); } }); ================================================ FILE: examples/collection/collection-second.js ================================================ import Woowahan from '../../index'; const RowItemView = Woowahan.CollectionView.create('RowItemView', { template: '
    • ', viewDidMount($el) { $el.text(this.getModel('name')); } }); const RowItemListView = Woowahan.CollectionView.create('RowItemListView', { template: '
        ', rowContainer: '.rowItemContainer', rowView: RowItemView, viewDidMount() { this.reload(this.getModel('list')); } }); const RowView = Woowahan.ItemView.create('RowView', { template: '
      • ', viewDidMount($el) { const model = this.getModel(); $el.find('.itemName').text(model.name); this.updateView('.subItemContainer', RowItemListView, { list: model.sub }); } }); export default Woowahan.CollectionView.create('CollectionViewSecond', { template: '
          ', rowContainer: '#rowContainer', rowView: RowView, viewDidMount() { this.reload(this.getModel('items'), { uid: 'name' }); }, viewWillUnmount() { this.reload(); } }); ================================================ FILE: examples/collection/gulpfile.js ================================================ var path = require('path'); var _ = require('lodash'); var gulp = require('gulp'); var del = require('del'); var $ = require('gulp-load-plugins')({ pattern: '*' }); var webpackConfig = require('./webpack.config.js'); gulp.task('scripts', () => { return gulp.src(webpackConfig.entry) .pipe($.webpackStream(webpackConfig)) .pipe(gulp.dest(path.resolve(__dirname, 'dist', 'js'))) .pipe($.size({ title : 'js' })) .pipe($.size()); }); gulp.task('html', () => { return gulp.src(path.resolve(__dirname, 'index.html')) .pipe(gulp.dest(path.resolve(__dirname, 'dist'))) .pipe($.size({ title : 'html' })); }); gulp.task('clean', (cb) => { del(['dist'], cb); }); gulp.task('default', ['clean'], () => gulp.start('build')); gulp.task('build', ['clean'], () => gulp.start(['scripts', 'html'])); ================================================ FILE: examples/collection/hello-view.js ================================================ import Woowahan from '../../index'; import CollectionFirst from './collection-first'; import CollectionSecond from './collection-second'; export default Woowahan.View.create('Hello', { template: '

          Hello, WoowahanJs

          ', firstItems: [ { name: 'firstItem0' }, { name: 'firstItem1' }, { name: 'firstItem2' }, { name: 'firstItem3' }, { name: 'firstItem4' } ], secondItems: [ { name: 'secondItem0', sub: [{ name: 'secondSubItem' }] }, { name: 'secondItem1', sub: [{ name: 'secondSubItem' }] }, { name: 'secondItem2', sub: [{ name: 'secondSubItem' }] }, { name: 'secondItem3', sub: [{ name: 'secondSubItem' }] }, { name: 'secondItem4', sub: [{ name: 'secondSubItem' }] }, ], events: { 'click #btnUpdateFirst': 'onClickUpdateFirst', 'click #btnUpdateSecond': 'onClickUpdateSecond' }, viewDidMount() { this.collectionFirst = this.updateView('#collectionFirst', CollectionFirst, { items: this.firstItems }); this.collectionSecond = this.updateView('#collectionSecond', CollectionSecond, { items: this.secondItems }); }, onClickUpdateFirst() { this.firstItems = this.collectionFirst.getCollection(); this.firstItems.push({ name: `firstItem${this.firstItems.length}` }); this.updateView('#collectionFirst', CollectionFirst, { items: this.firstItems }); }, onClickUpdateSecond() { this.secondItems = this.collectionSecond.getCollection(); this.secondItems.push({ name: `secondItem${this.secondItems.length}`, sub: [{ name: 'secondSubItem' }] }); this.updateView('#collectionSecond', CollectionSecond, { items: this.secondItems }); } }); ================================================ FILE: examples/collection/index.html ================================================ WoowahanJS
          ================================================ FILE: examples/collection/main.js ================================================ import Woowahan from '../../index'; import HelloView from './hello-view'; global.$ = global.jQuery = Woowahan.$; var app = new Woowahan(); app.start({ url: '/', container: '#content', view: HelloView }); ================================================ FILE: examples/collection/package.json ================================================ { "name": "helloworld", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "build": "gulp build", "demo-server": "node ./node_modules/http-server/bin/http-server dist" }, "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^6.0.1", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-sass": "^2.3.1", "gulp-size": "^1.2.0", "gulp-stylus": "^2.0.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.3", "handlebars-loader": "^1.1.4", "http-server": "^0.9.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "request": "^2.72.0", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^2.1.1" }, "dependencies": {} } ================================================ FILE: examples/collection/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; module.exports = { debug : true, devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' } ] } }; ================================================ FILE: examples/domrefs/.babelrc ================================================ { "presets": ["es2015"] } ================================================ FILE: examples/domrefs/gulpfile.js ================================================ var path = require('path'); var _ = require('lodash'); var gulp = require('gulp'); var del = require('del'); var $ = require('gulp-load-plugins')({ pattern: '*' }); var webpackConfig = require('./webpack.config.js'); gulp.task('scripts', () => { return gulp.src(webpackConfig.entry) .pipe($.webpackStream(webpackConfig)) .pipe(gulp.dest(path.resolve(__dirname, 'dist', 'js'))) .pipe($.size({ title : 'js' })) .pipe($.size()); }); gulp.task('html', () => { return gulp.src(path.resolve(__dirname, 'index.html')) .pipe(gulp.dest(path.resolve(__dirname, 'dist'))) .pipe($.size({ title : 'html' })); }); gulp.task('lib', () => { gulp.src(['node_modules/bootstrap/dist/**/*']) .pipe($.size({ title : 'lib:js/css folder structure' })) .pipe(gulp.dest(path.resolve(__dirname, 'dist'))); }); gulp.task('clean', (cb) => { del(['dist'], cb); }); gulp.task('default', ['clean'], () => gulp.start('build')); gulp.task('build', ['clean'], () => gulp.start(['scripts', 'lib', 'html'])); ================================================ FILE: examples/domrefs/index.html ================================================ WoowahanJS ================================================ FILE: examples/domrefs/main-view.hbs ================================================

          뷰의 DOM 참조

          다른 뷰
          ================================================ FILE: examples/domrefs/main-view.js ================================================ import Woowahan from '../../index'; import Template from './main-view.hbs'; const peopleColors = [ { color: 'white', country: '미국' }, { color: 'white', country: '영국' }, { color: 'white', country: '프랑스' }, { color: 'white', country: '독일' }, { color: 'yellow', country: '한국' }, { color: 'yellow', country: '중국' }, { color: 'yellow', country: '일본' }, { color: 'black', country: '캐냐' }, { color: 'black', country: '우간다' }, { color: 'black', country: '남아프리카공화국' }, { color: 'white', country: '러시아' } ]; export default Woowahan.View.create('MainView', { template: Template, events: { 'click .btn-toggle': 'onToggle', 'click .btn-check-value': 'onCheckValue', 'click .btn-update-view': 'onUpdateView', 'change select[name=skinColor]': 'onChangeSkinColor' }, viewDidMount() { // console.log(this.refs); }, onChangeSkinColor(event) { this.setModel({ peopleColor: peopleColors.filter(p => p.color == event.target.value).map(p => ({ label: p.country, value: p.color })) }); $(this.refs.peopleColor).css('background-color', event.target.value); }, onToggle() { $(this.refs.alertMessage).toggle(); }, onUpdateView() { this.updateView(); } }); ================================================ FILE: examples/domrefs/main.js ================================================ import Woowahan from '../../index'; import MainView from './main-view'; global.$ = global.jQuery = Woowahan.$; var OtherView = Woowahan.View.create('OtherView', { template: '

          Other View

          ' }); var app = new Woowahan(); app.start({ url: '/', container: 'body', view: MainView, pages: [ { url: 'other', view: OtherView } ] }); ================================================ FILE: examples/domrefs/package.json ================================================ { "name": "domrefs", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "build": "gulp", "demo-server": "node ./node_modules/http-server/bin/http-server dist" }, "author": "", "license": "MIT", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^6.0.1", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-sass": "^2.3.1", "gulp-size": "^1.2.0", "gulp-stylus": "^2.0.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.3", "handlebars-loader": "^1.1.4", "http-server": "^0.9.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "request": "^2.72.0", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^2.1.1" }, "dependencies": { "bootstrap": "^3.3.7" } } ================================================ FILE: examples/domrefs/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; module.exports = { debug : true, devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.hbs$/, exclude: /node_modules/, loader: 'handlebars-loader'} ] } }; ================================================ FILE: examples/hello-yarn/README.md ================================================ # hello-yarn [Yarn](https://yarnpkg.com/) 설치: ``` $ npm install -g yarn ``` 개발 도구 설치: ``` $ yarn add --dev webpack webpack-dev-server@2 ``` WoowahanJS 설치: ``` $ yarn add woowahan ``` [webpack-dev-server](https://webpack.js.org/guides/development/#webpack-dev-server) 실행: ``` $ yarn run webpack-dev-server ``` 또는 `package.json`에 개발 서버를 실행하는 스크립트 추가: ```json "scripts": { "start": "webpack-dev-server" } ``` ``` $ yarn start ``` 웹 브라우저로 확인: ``` $ open http://localhost:8080/ ``` ================================================ FILE: examples/hello-yarn/app/hello-view.js ================================================ import Woowahan from '../../../index'; export default Woowahan.View.create('Hello', { template: '

          Hello, WoowahanJS

          ' }); ================================================ FILE: examples/hello-yarn/app/index.js ================================================ import Woowahan from '../../../index'; import HelloView from './hello-view'; const app = new Woowahan(); app.start({ url: '/', container: '#app', view: HelloView }); ================================================ FILE: examples/hello-yarn/index.html ================================================ WoowahanJS
          ================================================ FILE: examples/hello-yarn/package.json ================================================ { "scripts": { "start": "webpack-dev-server" }, "devDependencies": { "webpack": "^2.3.2", "webpack-dev-server": "^2.4.2" }, "dependencies": {} } ================================================ FILE: examples/hello-yarn/webpack.config.js ================================================ module.exports = { entry: './app/index.js', output: { filename: 'bundle.js', path: __dirname } }; ================================================ FILE: examples/helloworld/.babelrc ================================================ { "presets": ["es2015"] } ================================================ FILE: examples/helloworld/gulpfile.js ================================================ var path = require('path'); var _ = require('lodash'); var gulp = require('gulp'); var del = require('del'); var $ = require('gulp-load-plugins')({ pattern: '*' }); var webpackConfig = require('./webpack.config.js'); gulp.task('scripts', () => { return gulp.src(webpackConfig.entry) .pipe($.webpackStream(webpackConfig)) .pipe(gulp.dest(path.resolve(__dirname, 'dist', 'js'))) .pipe($.size({ title : 'js' })) .pipe($.size()); }); gulp.task('html', () => { return gulp.src(path.resolve(__dirname, 'index.html')) .pipe(gulp.dest(path.resolve(__dirname, 'dist'))) .pipe($.size({ title : 'html' })); }); gulp.task('clean', (cb) => { del(['dist'], cb); }); gulp.task('default', ['clean'], () => gulp.start('build')); gulp.task('build', ['clean'], () => gulp.start(['scripts', 'html'])); ================================================ FILE: examples/helloworld/hello-view.js ================================================ import Woowahan from '../../index'; export default Woowahan.View.create('Hello', { template: '

          Hello, WoowahanJs

          ' }); ================================================ FILE: examples/helloworld/index.html ================================================ WoowahanJS
          ================================================ FILE: examples/helloworld/main.js ================================================ import Woowahan from '../../index'; import HelloView from './hello-view'; global.$ = global.jQuery = Woowahan.$; var app = new Woowahan(); app.start({ url: '/', container: '#content', view: HelloView }); ================================================ FILE: examples/helloworld/package.json ================================================ { "name": "helloworld", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "build": "gulp build", "demo-server": "node ./node_modules/http-server/bin/http-server dist" }, "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^6.0.1", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-sass": "^2.3.1", "gulp-size": "^1.2.0", "gulp-stylus": "^2.0.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.3", "handlebars-loader": "^1.1.4", "http-server": "^0.9.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "request": "^2.72.0", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^2.1.1" }, "dependencies": {} } ================================================ FILE: examples/helloworld/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; module.exports = { debug : true, devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' } ] } }; ================================================ FILE: examples/listview/.babelrc ================================================ { "presets": ["es2015"] } ================================================ FILE: examples/listview/action/index.js ================================================ export const FETCH_USERS = 'FETCH_USERS'; export const FETCH_ONE_USER = 'FETCH_ONE_USER'; ================================================ FILE: examples/listview/global.config.js ================================================ export default { Request: { Timeout: 3000 } }; ================================================ FILE: examples/listview/gulpfile.js ================================================ var path = require('path'); var _ = require('lodash'); var gulp = require('gulp'); var del = require('del'); var $ = require('gulp-load-plugins')({ pattern: '*' }); var environment = $.util.env.type || 'development'; var isProduction = environment === 'production'; var webpackConfig = require('./webpack.config.js')[environment]; var port = $.util.env.port || 1337; var src = 'app'; var dist = 'dist'; var buildTaskPack = ['lib', 'html', 'scripts']; var autoprefixerBrowsers = [ 'ie >= 9', 'ie_mob >= 10', 'ff >= 30', 'chrome >= 34', 'safari >= 6', 'opera >= 23', 'ios >= 6', 'android >= 4.4', 'bb >= 10' ]; const notifyEnable = process.platform == 'darwin'; gulp.task('scripts', () => { return gulp.src(webpackConfig.entry) .pipe($.if(notifyEnable, $.plumber({errorHandler: $.notify.onError("Error: <%= error.message" + " %>")}))) .pipe($.webpackStream(webpackConfig)) .pipe(gulp.dest(path.resolve(__dirname, dist, 'js'))) .pipe($.size({ title : 'js' })) .pipe($.size()) .pipe($.if(notifyEnable, $.notify('Complete scripts'))); }); gulp.task('html', () => { return gulp.src(path.resolve('./', 'index.html')) .pipe(gulp.dest(path.resolve(__dirname, dist))) .pipe($.size({ title : 'html' })); }); gulp.task('lib', () => { gulp.src(['node_modules/bootstrap/dist/**/*']) .pipe($.size({ title : 'lib:js/css folder structure' })) .pipe(gulp.dest(dist)); gulp.src([ 'node_modules/jquery/dist/*', 'node_modules/handlebars/dist/handlebars.min.js' ]) .pipe($.size({ title : 'lib:flat folder structure' })) .pipe(gulp.dest(dist+'/js')); }); gulp.task('clean', (cb) => { del([dist], cb); }); gulp.task('default', ['build']); gulp.task('build', ['clean'], () => gulp.start(buildTaskPack)); ================================================ FILE: examples/listview/index.html ================================================ WoowahanJS
          ================================================ FILE: examples/listview/main.js ================================================ import Woowahan from '../../index'; import Users from './reducer/users'; import OneUser from './reducer/one-user'; import LayoutView from './view/layout'; import WelcomeView from './view/welcome'; import UsersView from './view/users'; import UserDetailView from './view/users/user-detail'; global.$ = global.jQuery = Woowahan.$; const app = new Woowahan(); app.use(Users); app.use(OneUser); app.use(Woowahan.Layout('#app', LayoutView)); app.start({ url: '/', container: '.content', layout: 'LayoutView', view: WelcomeView, pages: [ { url: '/users', view: UsersView }, { url: '/users/:name', view: UserDetailView, routeName: 'UserDetailView' } ] }); ================================================ FILE: examples/listview/package.json ================================================ { "name": "listview", "version": "0.1.3", "description": "", "main": "main.js", "scripts": { "build": "gulp build", "demo-server": "node ./server/demo.js" }, "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^6.0.1", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-sass": "^2.3.1", "gulp-size": "^1.2.0", "gulp-stylus": "^2.0.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.3", "handlebars-loader": "^1.1.4", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "request": "^2.72.0", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^2.1.1" }, "dependencies": { "bootstrap": "^3.3.6" } } ================================================ FILE: examples/listview/plugin.config.js ================================================ import text from './plugin/text'; export { text }; ================================================ FILE: examples/listview/reducer/core-reducer.js ================================================ import Woowahan from '../../../index'; export default Woowahan.Reducer.extend({ onFail(jqXHR, textStatus, message) { console.log(`${this.actionName}:: [${textStatus}] ${message}!`); } }); ================================================ FILE: examples/listview/reducer/one-user.js ================================================ import CoreReducer from './core-reducer'; import { FETCH_ONE_USER } from '../action'; var OneUser = CoreReducer.create(FETCH_ONE_USER, function(options) { this.onSuccess = function(response) { this.finish(response); }; this.getData('/users/' + options.id); }); export default OneUser; ================================================ FILE: examples/listview/reducer/users.js ================================================ import CoreReducer from './core-reducer'; import { FETCH_USERS } from '../action'; var Users = CoreReducer.create(FETCH_USERS, function(options) { this.onSuccess = function(response) { this.finish(response); }; this.getData(`/users?p=${options.page || 1}`); }); export default Users; ================================================ FILE: examples/listview/server/data/users.json ================================================ [ { "id": 0, "name": "Stephanie Cabrera", "age": 23, "gender": "female", "company": "Waab", "joindate": "2014-34-24", "email": "stephaniecabrera@waab.com", "phone": "(887) 421-2689", "country": "Greenland" }, { "id": 1, "name": "Knox Stark", "age": 58, "gender": "male", "company": "Austech", "joindate": "2015-20-28", "email": "knoxstark@austech.com", "phone": "(818) 504-2362", "country": "Guinea-Bissau" }, { "id": 2, "name": "Muriel Buckner", "age": 55, "gender": "female", "company": "Equitox", "joindate": "2016-33-10", "email": "murielbuckner@equitox.com", "phone": "(896) 538-2888", "country": "Spain" }, { "id": 3, "name": "Dennis Rodriguez", "age": 49, "gender": "male", "company": "Empirica", "joindate": "2013-16-04", "email": "dennisrodriguez@empirica.com", "phone": "(976) 499-3941", "country": "Namibia" }, { "id": 4, "name": "Michael Potts", "age": 39, "gender": "male", "company": "Lumbrex", "joindate": "2015-07-06", "email": "michaelpotts@lumbrex.com", "phone": "(990) 471-3765", "country": "US Minor Outlying Islands" }, { "id": 5, "name": "Candy Wolfe", "age": 35, "gender": "female", "company": "Bleeko", "joindate": "2014-38-02", "email": "candywolfe@bleeko.com", "phone": "(899) 583-3039", "country": "Syria" }, { "id": 6, "name": "Moses Romero", "age": 35, "gender": "male", "company": "Bovis", "joindate": "2014-26-20", "email": "mosesromero@bovis.com", "phone": "(850) 491-3967", "country": "East Timor" }, { "id": 7, "name": "Deana Hammond", "age": 38, "gender": "female", "company": "Turnabout", "joindate": "2014-33-01", "email": "deanahammond@turnabout.com", "phone": "(880) 457-3930", "country": "Samoa" }, { "id": 8, "name": "Tanner Talley", "age": 24, "gender": "male", "company": "Codax", "joindate": "2012-17-11", "email": "tannertalley@codax.com", "phone": "(893) 451-3322", "country": "Vanuatu" }, { "id": 9, "name": "Mcdowell Hayden", "age": 39, "gender": "male", "company": "Capscreen", "joindate": "2014-59-15", "email": "mcdowellhayden@capscreen.com", "phone": "(917) 402-3231", "country": "Turkmenistan" }, { "id": 10, "name": "Kirsten Wells", "age": 44, "gender": "female", "company": "Goko", "joindate": "2012-07-28", "email": "kirstenwells@goko.com", "phone": "(956) 539-3032", "country": "Seychelles" }, { "id": 11, "name": "Mccormick Burke", "age": 33, "gender": "male", "company": "Nikuda", "joindate": "2012-40-24", "email": "mccormickburke@nikuda.com", "phone": "(813) 414-3886", "country": "Sierra Leone" }, { "id": 12, "name": "Nixon Lee", "age": 26, "gender": "male", "company": "Kengen", "joindate": "2013-56-07", "email": "nixonlee@kengen.com", "phone": "(855) 492-3945", "country": "Saudi Arabia" }, { "id": 13, "name": "Carissa Kaufman", "age": 29, "gender": "female", "company": "Unia", "joindate": "2013-09-03", "email": "carissakaufman@unia.com", "phone": "(825) 568-2572", "country": "Tuvalu" }, { "id": 14, "name": "Molly Poole", "age": 40, "gender": "female", "company": "Conjurica", "joindate": "2015-29-15", "email": "mollypoole@conjurica.com", "phone": "(916) 474-2936", "country": "S. Georgia and S. Sandwich Isls." }, { "id": 0, "name": "Stephanie Cabrera", "age": 23, "gender": "female", "company": "Waab", "joindate": "2014-34-24", "email": "stephaniecabrera@waab.com", "phone": "(887) 421-2689", "country": "Greenland" }, { "id": 1, "name": "Knox Stark", "age": 58, "gender": "male", "company": "Austech", "joindate": "2015-20-28", "email": "knoxstark@austech.com", "phone": "(818) 504-2362", "country": "Guinea-Bissau" }, { "id": 2, "name": "Muriel Buckner", "age": 55, "gender": "female", "company": "Equitox", "joindate": "2016-33-10", "email": "murielbuckner@equitox.com", "phone": "(896) 538-2888", "country": "Spain" }, { "id": 3, "name": "Dennis Rodriguez", "age": 49, "gender": "male", "company": "Empirica", "joindate": "2013-16-04", "email": "dennisrodriguez@empirica.com", "phone": "(976) 499-3941", "country": "Namibia" }, { "id": 4, "name": "Michael Potts", "age": 39, "gender": "male", "company": "Lumbrex", "joindate": "2015-07-06", "email": "michaelpotts@lumbrex.com", "phone": "(990) 471-3765", "country": "US Minor Outlying Islands" }, { "id": 5, "name": "Candy Wolfe", "age": 35, "gender": "female", "company": "Bleeko", "joindate": "2014-38-02", "email": "candywolfe@bleeko.com", "phone": "(899) 583-3039", "country": "Syria" }, { "id": 6, "name": "Moses Romero", "age": 35, "gender": "male", "company": "Bovis", "joindate": "2014-26-20", "email": "mosesromero@bovis.com", "phone": "(850) 491-3967", "country": "East Timor" }, { "id": 7, "name": "Deana Hammond", "age": 38, "gender": "female", "company": "Turnabout", "joindate": "2014-33-01", "email": "deanahammond@turnabout.com", "phone": "(880) 457-3930", "country": "Samoa" }, { "id": 8, "name": "Tanner Talley", "age": 24, "gender": "male", "company": "Codax", "joindate": "2012-17-11", "email": "tannertalley@codax.com", "phone": "(893) 451-3322", "country": "준호나라" }, { "id": 9, "name": "Mcdowell Hayden", "age": 39, "gender": "male", "company": "Capscreen", "joindate": "2014-59-15", "email": "mcdowellhayden@capscreen.com", "phone": "(917) 402-3231", "country": "Turkmenistan" }, { "id": 10, "name": "Kirsten Wells", "age": 44, "gender": "female", "company": "Goko", "joindate": "2012-07-28", "email": "kirstenwells@goko.com", "phone": "(956) 539-3032", "country": "Seychelles" }, { "id": 11, "name": "Mccormick Burke", "age": 33, "gender": "male", "company": "준호네", "joindate": "2012-40-24", "email": "mccormickburke@nikuda.com", "phone": "(813) 414-3886", "country": "Sierra Leone" }, { "id": 12, "name": "Nixon Lee", "age": 26, "gender": "male", "company": "Kengen", "joindate": "2013-56-07", "email": "nixonlee@kengen.com", "phone": "(855) 492-3945", "country": "Saudi Arabia" }, { "id": 13, "name": "Carissa Kaufman", "age": 29, "gender": "female", "company": "Unia", "joindate": "2013-09-03", "email": "carissakaufman@unia.com", "phone": "(825) 568-2572", "country": "Tuvalu" }, { "id": 14, "name": "준호", "age": 40, "gender": "female", "company": "Conjurica", "joindate": "2015-29-15", "email": "mollypoole@conjurica.com", "phone": "(916) 474-2936", "country": "S. Georgia and S. Sandwich Isls." }, { "id": 15, "name": "Howell Barry", "age": 57, "gender": "male", "company": "Zolarity", "joindate": "2014-54-08", "email": "howellbarry@zolarity.com", "phone": "(993) 515-2963", "country": "Guinea" }, { "id": 16, "name": "Brittany Burris", "age": 52, "gender": "female", "company": "Viagreat", "joindate": "2012-43-05", "email": "brittanyburris@viagreat.com", "phone": "(996) 507-2351", "country": "Austria" }, { "id": 17, "name": "Farley Riley", "age": 25, "gender": "male", "company": "Sonique", "joindate": "2015-47-26", "email": "farleyriley@sonique.com", "phone": "(908) 406-3968", "country": "Korea (South)" }, { "id": 18, "name": "Berg Blair", "age": 40, "gender": "male", "company": "Translink", "joindate": "2015-39-27", "email": "bergblair@translink.com", "phone": "(954) 555-3378", "country": "Armenia" }, { "id": 19, "name": "Key Buckley", "age": 51, "gender": "male", "company": "Zensus", "joindate": "2013-46-02", "email": "keybuckley@zensus.com", "phone": "(893) 444-3993", "country": "Portugal" }, { "id": 20, "name": "Shelly Finch", "age": 32, "gender": "female", "company": "Oronoko", "joindate": "2013-50-12", "email": "shellyfinch@oronoko.com", "phone": "(859) 428-3428", "country": "Luxembourg" }, { "id": 21, "name": "Jody Knight", "age": 55, "gender": "female", "company": "Cyclonica", "joindate": "2012-30-25", "email": "jodyknight@cyclonica.com", "phone": "(815) 600-2262", "country": "Cambodia" }, { "id": 22, "name": "Baxter Wright", "age": 51, "gender": "male", "company": "Bugsall", "joindate": "2015-02-28", "email": "baxterwright@bugsall.com", "phone": "(849) 585-3210", "country": "Rwanda" }, { "id": 23, "name": "Rosa Knox", "age": 35, "gender": "male", "company": "Centrexin", "joindate": "2014-14-01", "email": "rosaknox@centrexin.com", "phone": "(872) 590-2058", "country": "Denmark" }, { "id": 24, "name": "Zelma Greer", "age": 33, "gender": "female", "company": "Xylar", "joindate": "2015-19-16", "email": "zelmagreer@xylar.com", "phone": "(993) 536-2120", "country": "France, Metropolitan" }, { "id": 25, "name": "Crystal Mejia", "age": 23, "gender": "female", "company": "Acusage", "joindate": "2013-25-26", "email": "crystalmejia@acusage.com", "phone": "(807) 443-2370", "country": "St. Helena" }, { "id": 26, "name": "Tamara Ortega", "age": 40, "gender": "female", "company": "Olympix", "joindate": "2015-46-09", "email": "tamaraortega@olympix.com", "phone": "(872) 488-2822", "country": "Antigua and Barbuda" }, { "id": 27, "name": "Meredith Farrell", "age": 26, "gender": "female", "company": "Visalia", "joindate": "2013-53-02", "email": "meredithfarrell@visalia.com", "phone": "(995) 535-3742", "country": "Uzbekistan" }, { "id": 28, "name": "Phelps Simmons", "age": 44, "gender": "male", "company": "Adornica", "joindate": "2014-40-24", "email": "phelpssimmons@adornica.com", "phone": "(931) 581-2192", "country": "Canada" }, { "id": 29, "name": "Nichols Mcclain", "age": 29, "gender": "male", "company": "Eclipsent", "joindate": "2015-38-18", "email": "nicholsmcclain@eclipsent.com", "phone": "(960) 405-3743", "country": "Lithuania" }, { "id": 30, "name": "Sheila Allison", "age": 37, "gender": "female", "company": "Comcur", "joindate": "2014-30-18", "email": "sheilaallison@comcur.com", "phone": "(965) 440-3108", "country": "Gibraltar" }, { "id": 31, "name": "Colon Contreras", "age": 39, "gender": "male", "company": "Geekol", "joindate": "2015-54-16", "email": "coloncontreras@geekol.com", "phone": "(885) 576-3414", "country": "Aruba" }, { "id": 32, "name": "Margaret Santos", "age": 53, "gender": "female", "company": "Kneedles", "joindate": "2013-49-01", "email": "margaretsantos@kneedles.com", "phone": "(839) 460-2903", "country": "Kazakhstan" }, { "id": 33, "name": "Irwin Gentry", "age": 48, "gender": "male", "company": "Coash", "joindate": "2015-17-11", "email": "irwingentry@coash.com", "phone": "(841) 457-2927", "country": "Somalia" }, { "id": 34, "name": "Hays Sheppard", "age": 43, "gender": "male", "company": "Elentrix", "joindate": "2016-53-17", "email": "hayssheppard@elentrix.com", "phone": "(848) 476-3485", "country": "Belgium" }, { "id": 35, "name": "Burton Barton", "age": 60, "gender": "male", "company": "Ontality", "joindate": "2013-42-05", "email": "burtonbarton@ontality.com", "phone": "(921) 523-3331", "country": "Iraq" }, { "id": 36, "name": "Mcgowan Bush", "age": 35, "gender": "male", "company": "Digique", "joindate": "2015-41-18", "email": "mcgowanbush@digique.com", "phone": "(979) 432-3138", "country": "Cook Islands" }, { "id": 37, "name": "Mckinney Cox", "age": 45, "gender": "male", "company": "Realysis", "joindate": "2015-07-19", "email": "mckinneycox@realysis.com", "phone": "(923) 472-2928", "country": "Libya" }, { "id": 38, "name": "Violet Lang", "age": 55, "gender": "female", "company": "Isopop", "joindate": "2015-32-15", "email": "violetlang@isopop.com", "phone": "(921) 427-2591", "country": "Pitcairn" }, { "id": 39, "name": "Hoffman Reid", "age": 37, "gender": "male", "company": "Junipoor", "joindate": "2013-46-20", "email": "hoffmanreid@junipoor.com", "phone": "(947) 411-3489", "country": "Zambia" }, { "id": 40, "name": "Glenda Watkins", "age": 30, "gender": "female", "company": "Enormo", "joindate": "2013-47-05", "email": "glendawatkins@enormo.com", "phone": "(807) 480-3620", "country": "Thailand" }, { "id": 41, "name": "Cabrera Brennan", "age": 46, "gender": "male", "company": "Vitricomp", "joindate": "2016-05-06", "email": "cabrerabrennan@vitricomp.com", "phone": "(808) 440-3475", "country": "Antarctica" }, { "id": 42, "name": "Hewitt Simon", "age": 44, "gender": "male", "company": "Equicom", "joindate": "2012-39-02", "email": "hewittsimon@equicom.com", "phone": "(955) 423-2122", "country": "Albania" }, { "id": 43, "name": "Jan Graves", "age": 33, "gender": "female", "company": "Sloganaut", "joindate": "2013-59-12", "email": "jangraves@sloganaut.com", "phone": "(866) 519-3449", "country": "Grenada" }, { "id": 44, "name": "Julia Valentine", "age": 28, "gender": "female", "company": "Martgo", "joindate": "2015-45-20", "email": "juliavalentine@martgo.com", "phone": "(872) 477-3886", "country": "Sri Lanka" }, { "id": 45, "name": "Luann Preston", "age": 24, "gender": "female", "company": "Amtap", "joindate": "2014-52-11", "email": "luannpreston@amtap.com", "phone": "(996) 497-2347", "country": "Bahamas" }, { "id": 46, "name": "Sweet Velez", "age": 27, "gender": "male", "company": "Shepard", "joindate": "2016-56-30", "email": "sweetvelez@shepard.com", "phone": "(880) 506-2906", "country": "Bulgaria" }, { "id": 47, "name": "Jayne Gonzalez", "age": 49, "gender": "female", "company": "Netplax", "joindate": "2015-35-01", "email": "jaynegonzalez@netplax.com", "phone": "(942) 454-3019", "country": "French Southern Territories" }, { "id": 48, "name": "Maureen Rowland", "age": 59, "gender": "female", "company": "Quadeebo", "joindate": "2016-53-04", "email": "maureenrowland@quadeebo.com", "phone": "(935) 523-3034", "country": "Kuwait" }, { "id": 49, "name": "Adams Burnett", "age": 33, "gender": "male", "company": "Hairport", "joindate": "2012-37-01", "email": "adamsburnett@hairport.com", "phone": "(984) 599-3530", "country": "Philippines" }, { "id": 50, "name": "Ellis Hardin", "age": 37, "gender": "male", "company": "Keengen", "joindate": "2013-14-13", "email": "ellishardin@keengen.com", "phone": "(949) 576-2422", "country": "Tokelau" }, { "id": 51, "name": "Christensen Bright", "age": 51, "gender": "male", "company": "Magnina", "joindate": "2012-01-15", "email": "christensenbright@magnina.com", "phone": "(843) 479-3559", "country": "Mozambique" }, { "id": 52, "name": "Tracey Whitaker", "age": 60, "gender": "female", "company": "Melbacor", "joindate": "2012-50-20", "email": "traceywhitaker@melbacor.com", "phone": "(968) 509-2333", "country": "Slovenia" }, { "id": 53, "name": "Pruitt Whitehead", "age": 27, "gender": "male", "company": "Vendblend", "joindate": "2015-59-28", "email": "pruittwhitehead@vendblend.com", "phone": "(927) 586-3523", "country": "Brunei Darussalam" }, { "id": 54, "name": "Dorsey Dennis", "age": 46, "gender": "male", "company": "Suretech", "joindate": "2016-55-23", "email": "dorseydennis@suretech.com", "phone": "(920) 516-2778", "country": "Iceland" }, { "id": 55, "name": "Irma Barron", "age": 43, "gender": "female", "company": "Miraclis", "joindate": "2013-23-13", "email": "irmabarron@miraclis.com", "phone": "(958) 418-3066", "country": "Germany" }, { "id": 56, "name": "Parsons Carrillo", "age": 42, "gender": "male", "company": "Manglo", "joindate": "2012-39-13", "email": "parsonscarrillo@manglo.com", "phone": "(838) 432-3931", "country": "Guyana" }, { "id": 57, "name": "Marisa Arnold", "age": 58, "gender": "female", "company": "Collaire", "joindate": "2015-55-20", "email": "marisaarnold@collaire.com", "phone": "(884) 487-2679", "country": "United Arab Emirates" }, { "id": 58, "name": "Juarez Durham", "age": 45, "gender": "male", "company": "Mobildata", "joindate": "2016-18-18", "email": "juarezdurham@mobildata.com", "phone": "(870) 529-2941", "country": "Faroe Islands" }, { "id": 59, "name": "Marshall Mathis", "age": 51, "gender": "male", "company": "Centree", "joindate": "2016-54-01", "email": "marshallmathis@centree.com", "phone": "(928) 519-3569", "country": "Slovak Republic" }, { "id": 60, "name": "Garrett Cleveland", "age": 24, "gender": "male", "company": "Zenthall", "joindate": "2014-03-22", "email": "garrettcleveland@zenthall.com", "phone": "(973) 453-2632", "country": "Ukraine" }, { "id": 61, "name": "Ada Little", "age": 25, "gender": "female", "company": "Maineland", "joindate": "2014-49-14", "email": "adalittle@maineland.com", "phone": "(935) 522-3989", "country": "Venezuela" }, { "id": 62, "name": "Essie Villarreal", "age": 38, "gender": "female", "company": "Prosely", "joindate": "2013-10-21", "email": "essievillarreal@prosely.com", "phone": "(847) 482-2697", "country": "Uruguay" }, { "id": 63, "name": "Alston Combs", "age": 46, "gender": "male", "company": "Terrago", "joindate": "2015-41-04", "email": "alstoncombs@terrago.com", "phone": "(970) 457-3998", "country": "Mauritius" }, { "id": 64, "name": "Myrtle Owen", "age": 34, "gender": "female", "company": "Xymonk", "joindate": "2013-37-06", "email": "myrtleowen@xymonk.com", "phone": "(921) 401-3724", "country": "Turks and Caicos Islands" }, { "id": 65, "name": "Terra Joyner", "age": 53, "gender": "female", "company": "Asimiline", "joindate": "2014-12-17", "email": "terrajoyner@asimiline.com", "phone": "(832) 505-3464", "country": "Netherlands" }, { "id": 66, "name": "Morrison Byers", "age": 34, "gender": "male", "company": "Xixan", "joindate": "2012-34-03", "email": "morrisonbyers@xixan.com", "phone": "(948) 416-3038", "country": "Singapore" }, { "id": 67, "name": "Gloria Baker", "age": 34, "gender": "female", "company": "Oceanica", "joindate": "2016-32-02", "email": "gloriabaker@oceanica.com", "phone": "(980) 403-2003", "country": "Cyprus" }, { "id": 68, "name": "Karla Frederick", "age": 23, "gender": "female", "company": "Techade", "joindate": "2014-46-09", "email": "karlafrederick@techade.com", "phone": "(962) 417-2814", "country": "Macedonia" }, { "id": 69, "name": "Roberson Wilson", "age": 47, "gender": "male", "company": "Twiggery", "joindate": "2016-43-20", "email": "robersonwilson@twiggery.com", "phone": "(908) 468-2344", "country": "Heard and McDonald Islands" }, { "id": 70, "name": "Tiffany French", "age": 28, "gender": "female", "company": "Elita", "joindate": "2014-59-27", "email": "tiffanyfrench@elita.com", "phone": "(978) 492-3070", "country": "Iran" }, { "id": 71, "name": "Marta Oneil", "age": 43, "gender": "female", "company": "Quilm", "joindate": "2014-25-27", "email": "martaoneil@quilm.com", "phone": "(962) 484-3429", "country": "Ecuador" }, { "id": 72, "name": "Williamson York", "age": 42, "gender": "male", "company": "Balooba", "joindate": "2014-02-23", "email": "williamsonyork@balooba.com", "phone": "(875) 519-2797", "country": "Dominican Republic" }, { "id": 73, "name": "Hensley Cannon", "age": 43, "gender": "male", "company": "Extragen", "joindate": "2012-16-20", "email": "hensleycannon@extragen.com", "phone": "(880) 521-3890", "country": "Bosnia and Herzegovina" }, { "id": 74, "name": "Yesenia Larsen", "age": 56, "gender": "female", "company": "Niquent", "joindate": "2016-43-29", "email": "yesenialarsen@niquent.com", "phone": "(840) 433-2803", "country": "Bhutan" }, { "id": 75, "name": "Jordan Acevedo", "age": 50, "gender": "male", "company": "Lingoage", "joindate": "2013-50-10", "email": "jordanacevedo@lingoage.com", "phone": "(834) 476-2553", "country": "Montserrat" }, { "id": 76, "name": "Fields Mayer", "age": 55, "gender": "male", "company": "Volax", "joindate": "2013-59-06", "email": "fieldsmayer@volax.com", "phone": "(862) 561-2061", "country": "Hungary" }, { "id": 77, "name": "Cassandra Patel", "age": 37, "gender": "female", "company": "Spacewax", "joindate": "2014-02-13", "email": "cassandrapatel@spacewax.com", "phone": "(896) 485-3036", "country": "Yemen" }, { "id": 78, "name": "Alejandra Koch", "age": 28, "gender": "female", "company": "Accusage", "joindate": "2013-36-13", "email": "alejandrakoch@accusage.com", "phone": "(839) 461-3864", "country": "South Africa" }, { "id": 79, "name": "Leola Ayala", "age": 54, "gender": "female", "company": "Anarco", "joindate": "2015-24-03", "email": "leolaayala@anarco.com", "phone": "(933) 468-3596", "country": "Madagascar" }, { "id": 80, "name": "Sharron Alvarado", "age": 23, "gender": "female", "company": "Flyboyz", "joindate": "2014-44-05", "email": "sharronalvarado@flyboyz.com", "phone": "(965) 485-2512", "country": "Costa Rica" }, { "id": 81, "name": "Bartlett Mcpherson", "age": 45, "gender": "male", "company": "Emtrak", "joindate": "2016-24-09", "email": "bartlettmcpherson@emtrak.com", "phone": "(912) 430-3338", "country": "Taiwan" }, { "id": 82, "name": "Adele Singleton", "age": 55, "gender": "female", "company": "Ecratic", "joindate": "2015-31-12", "email": "adelesingleton@ecratic.com", "phone": "(928) 483-3446", "country": "Ireland" }, { "id": 83, "name": "Ramos Bauer", "age": 56, "gender": "male", "company": "Eternis", "joindate": "2016-17-19", "email": "ramosbauer@eternis.com", "phone": "(956) 535-3059", "country": "Papua New Guinea" }, { "id": 84, "name": "Jacqueline Melton", "age": 48, "gender": "female", "company": "Kidgrease", "joindate": "2014-45-14", "email": "jacquelinemelton@kidgrease.com", "phone": "(928) 533-2580", "country": "Kyrgyzstan" }, { "id": 85, "name": "Craft Harrington", "age": 55, "gender": "male", "company": "Bunga", "joindate": "2013-08-06", "email": "craftharrington@bunga.com", "phone": "(974) 511-2984", "country": "United States" }, { "id": 86, "name": "Petersen Carpenter", "age": 29, "gender": "male", "company": "Applideck", "joindate": "2014-11-16", "email": "petersencarpenter@applideck.com", "phone": "(987) 597-3066", "country": "Fiji" }, { "id": 87, "name": "Conway Roy", "age": 52, "gender": "male", "company": "Immunics", "joindate": "2016-47-27", "email": "conwayroy@immunics.com", "phone": "(837) 576-3158", "country": "Trinidad and Tobago" }, { "id": 88, "name": "Rosetta Herman", "age": 26, "gender": "female", "company": "Hopeli", "joindate": "2013-10-22", "email": "rosettaherman@hopeli.com", "phone": "(976) 483-2243", "country": "Israel" }, { "id": 89, "name": "Riggs Cruz", "age": 47, "gender": "male", "company": "Zorromop", "joindate": "2016-40-26", "email": "riggscruz@zorromop.com", "phone": "(889) 550-2149", "country": "French Guiana" }, { "id": 90, "name": "Benson Hickman", "age": 58, "gender": "male", "company": "Geofarm", "joindate": "2016-54-01", "email": "bensonhickman@geofarm.com", "phone": "(922) 424-3209", "country": "Moldova" }, { "id": 91, "name": "Mitchell Sharpe", "age": 47, "gender": "male", "company": "Frolix", "joindate": "2014-31-02", "email": "mitchellsharpe@frolix.com", "phone": "(936) 441-2513", "country": "Croatia (Hrvatska)" }, { "id": 92, "name": "Barbra Montoya", "age": 29, "gender": "female", "company": "Lunchpad", "joindate": "2015-43-09", "email": "barbramontoya@lunchpad.com", "phone": "(942) 494-3513", "country": "Honduras" }, { "id": 93, "name": "Martinez Gilmore", "age": 58, "gender": "male", "company": "Keeg", "joindate": "2013-10-22", "email": "martinezgilmore@keeg.com", "phone": "(859) 476-2983", "country": "Djibouti" }, { "id": 94, "name": "Nona Velazquez", "age": 49, "gender": "female", "company": "Krag", "joindate": "2014-34-13", "email": "nonavelazquez@krag.com", "phone": "(962) 499-3561", "country": "Azerbaijan" }, { "id": 95, "name": "Lenore Andrews", "age": 36, "gender": "female", "company": "Netbook", "joindate": "2014-28-29", "email": "lenoreandrews@netbook.com", "phone": "(908) 476-2123", "country": "Bangladesh" }, { "id": 96, "name": "Santos Kennedy", "age": 39, "gender": "male", "company": "Rodeology", "joindate": "2016-02-09", "email": "santoskennedy@rodeology.com", "phone": "(938) 534-3227", "country": "Dominica" }, { "id": 97, "name": "Irene Morton", "age": 31, "gender": "female", "company": "Polaria", "joindate": "2013-50-03", "email": "irenemorton@polaria.com", "phone": "(896) 464-3525", "country": "Algeria" }, { "id": 98, "name": "Neva Sellers", "age": 34, "gender": "female", "company": "Lyrichord", "joindate": "2012-22-30", "email": "nevasellers@lyrichord.com", "phone": "(878) 459-3540", "country": "Eritrea" }, { "id": 99, "name": "Yang Clark", "age": 56, "gender": "male", "company": "Zilladyne", "joindate": "2013-24-13", "email": "yangclark@zilladyne.com", "phone": "(993) 439-2979", "country": "Wallis and Futuna Islands" }, { "id": 0, "name": "Stephanie Cabrera", "age": 23, "gender": "female", "company": "Waab", "joindate": "2014-34-24", "email": "stephaniecabrera@waab.com", "phone": "(887) 421-2689", "country": "Greenland" }, { "id": 1, "name": "Knox Stark", "age": 58, "gender": "male", "company": "Austech", "joindate": "2015-20-28", "email": "knoxstark@austech.com", "phone": "(818) 504-2362", "country": "Guinea-Bissau" }, { "id": 2, "name": "Muriel Buckner", "age": 55, "gender": "female", "company": "Equitox", "joindate": "2016-33-10", "email": "murielbuckner@equitox.com", "phone": "(896) 538-2888", "country": "Spain" } ] ================================================ FILE: examples/listview/server/demo.js ================================================ var path = require('path'); var express = require('express'); var morgan = require('morgan'); var app = express(); var users = require(path.resolve(__dirname, 'data/users.json')); const port = process.env.PORT || 4000; app.use(morgan('dev')); app.use(express.static('dist')); app.get('/users', (req, res) => { var page = +(req.query.p || 1); var limit = +(req.query.l || 15); var resultSet = []; for(var start=(page-1)*limit, i=0; i res.json(users.find(user => user.id == +req.params.id))); app.listen(port, () => { console.log('ready %s', port); }); ================================================ FILE: examples/listview/server/proxy.js ================================================ var format = require('util').format; var express = require('express'); var morgan = require('morgan'); var request = require('request'); var fs = require('fs'); var path = require('path'); var md5 = require('md5'); var app = express(); const realHost = 'http://api-server.com'; const port = process.env.PORT || 4000; const mock = JSON.parse(process.env.MOCK || false); function saveCached(url, body) { var cachePath = path.resolve(__dirname, '.cache'); var cacheFile = md5(url); if (!fs.existsSync(cachePath)) { fs.mkdirSync(cachePath); } fs.writeFile(path.resolve(cachePath, format('%s.json', cacheFile)), body); } function getCached(url) { var cachePath = path.resolve(__dirname, '.cache'); var cacheFile = md5(url); if (fs.existsSync(path.resolve(cachePath, cacheFile+'.json'))) { return require('./.cache/'+cacheFile+'.json'); } return {}; } app.use(morgan('dev')); app.use(express.static('dist')); app.get('*', (req, res) => { if (mock) { res.json(getCached(req.url)); } else { request(format('%s%s', realHost, req.url), (err, response, body) => { saveCached(req.url, body); }).pipe(res); } }); app.listen(port, () => { console.log('ready %s (mock:%s)', port, mock); }); ================================================ FILE: examples/listview/view/control/pager.hbs ================================================ ================================================ FILE: examples/listview/view/control/pager.js ================================================ import Woowahan from '../../../../index'; import Template from './pager.hbs'; export default Woowahan.View.create('Pager', { namespace: 'View:Control:Pager', tagName: 'nav', template: Template, events: { 'click a[data-page]': 'onPaging' }, initialize(model) { this.setModel(model); this.super(); }, viewWillMount(renderData) { const numOfRows = renderData.numOfRows; const currentPage = renderData.currentPage; // 10 const total = renderData.total; const totalPage = Math.ceil(total / numOfRows); let start = parseInt((currentPage - 1) / 10) * 10; let count = Math.min(10, totalPage - start); renderData.prevPage = start - 9; renderData.nextPage = start + 11; const numbers = Array.from({ length: count }, () => { return { num: ++start, active: currentPage == start } }); renderData.prev = currentPage > 10; renderData.numbers = numbers; renderData.next = count == 10; return renderData; }, onPaging(event) { this.dispatch(Woowahan.Event.create('paging', +$(event.currentTarget).data('page'))); return false; } }); ================================================ FILE: examples/listview/view/layout.hbs ================================================
          ================================================ FILE: examples/listview/view/layout.js ================================================ import Woowahan from '../../../index'; import Template from './layout.hbs'; export default Woowahan.View.create('LayoutView', { className: 'container', template: Template, initialize() { this.super(); } }); ================================================ FILE: examples/listview/view/not-found.js ================================================ import { CoreView } from '../core'; export default CoreView.extend({ template: 'Empty Page', initialize() { this.super(); } }); ================================================ FILE: examples/listview/view/users/index.hbs ================================================

          사용자 목록

          이름 성별 나이 국적 회사 이메일 가입일 전화번호
          ================================================ FILE: examples/listview/view/users/index.js ================================================ import Woowahan from '../../../../index'; import { FETCH_USERS, FETCH_ONE_USER } from '../../action'; import Template from './index.hbs'; import User from './user'; import Pager from '../control/pager'; export default Woowahan.CollectionView.create('Users', { rowContainer: '.list > tbody', rowView: User, template: Template, events: { 'click [data-action=refresh]': 'onRefresh', '@paging .pager-container': 'onPaging' }, initialize() { this.setModel({ currentPage: 1, total: 0, numOfRows: 0 }); this.super(); }, viewDidMount() { this.dispatch(Woowahan.Action.create(FETCH_USERS), this.fetchUsers); }, fetchUsers(data) { this.reload(data.resultSet, { uid: 'id', reset: true, reverse: false }); this.setModel({ currentPage: data.page.page, total: data.page.total, numOfRows: data.resultSet.length }); this.updateView('.pager-container', Pager, this.model); }, fetchOneUser(data) { window.location.hash = this.getRouteTables('UserDetailView', { name: data.name }, `company=${data.company}`); }, onSelectedRow(row) { this.dispatch(Woowahan.Action.create(FETCH_ONE_USER, { id: row.id, page: 1 }), this.fetchOneUser); }, onRefresh() { this.updateView(); return false; }, onPaging(page) { this.dispatch(Woowahan.Action.create(FETCH_USERS, { page: page }), this.fetchUsers); } }); ================================================ FILE: examples/listview/view/users/user-detail.js ================================================ import Woowahan from '../../../../index'; export default Woowahan.View.create('UserDetail', { template: '

          ', events: { 'click #btn-back': 'onClickBack' }, viewDidMount($el) { $el.find('#name').html(this.params.name || 'empty'); $el.find('#company').html(this.query.company || 'empty'); }, onClickBack() { window.history.back(); } }); ================================================ FILE: examples/listview/view/users/user.hbs ================================================ ================================================ FILE: examples/listview/view/users/user.js ================================================ import Template from './user.hbs'; import Woowahan from '../../../../index'; export default Woowahan.ItemView.create('User', { tagName: 'tr', template: Template, onSelectedRow(event, trigger) { trigger({ id: this.getModel('id') }); } }); ================================================ FILE: examples/listview/view/welcome.hbs ================================================

          Hello, Woowahan JS

          ================================================ FILE: examples/listview/view/welcome.js ================================================ import Woowahan from '../../../index'; import Template from './welcome.hbs'; export default Woowahan.View.create('WelcomeView', { className: 'container', template: Template, initialize() { this.super(); } }); ================================================ FILE: examples/listview/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; var uglifyJsPlugin = new webpack.optimize.UglifyJsPlugin({ compressor: { screw_ie8: true, warnings: false }, output: { comments: false } }); module.exports.development = { debug : true, devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.css$/, exclude: /node_modules/, loader: 'css-loader' }, { test: /\.hbs$/, exclude: /node_modules/, loader: 'handlebars-loader'} ] } }; module.exports.production = { debug: false, entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.css$/, exclude: /node_modules/, loader: 'css-loader' }, { test: /\.hbs$/, exclude: /node_modules/, loader: 'handlebars-loader'} ] }, plugins: [ uglifyJsPlugin ] }; ================================================ FILE: examples/middleware/app.js ================================================ Woowahan.config = { testMode: true }; window.$ = window.jQuery = Woowahan.$; const DOTIT = 'doit'; const app = new Woowahan(); const COLOR = { view: function(alpha) { if (alpha) { return 'rgba(51,202,255,0.4)'; } else { return 'rgb(51,202,255)'; } }, node: function(alpha) { if (alpha) { return 'rgba(249,67,4,0.5)'; } else { return 'rgb(249,67,4)'; } } }; const reducer = Woowahan.Reducer.create(DOTIT, function() { this.env.token = `TK-${Date.now()}`; this.onSuccess = function(response) { this.finish(null, response); }; this.onFail = function(err) { this.finish(err); }; this.getData('https://jsonplaceholder.typicode.com/posts/2'); }); const childView = Woowahan.View.create('childView', { template: Handlebars.compile($('#child-view').html()), events: { 'click .btn': 'onClick' }, onClick() { } }); const mainView = Woowahan.View.create('mainView', { template: Handlebars.compile($('#main-view').html()), events: { 'change input[type=text]': 'onChange', 'change input[type=password]': 'onChange', 'click .btn': 'onDoit', 'click .name': 'onName', 'click #update': 'onUpdate' }, viewDidMount() { this.updateView('#child', childView); }, onChange() { }, onDoit() { this.dispatch(Woowahan.Action.create(DOTIT), function(err, data) { console.log(data); }); }, onName() { }, onUpdate() { this.updateView(); } }); /** * Middleware */ function logger() { this.mwtype = 'reducer'; this.features = ['url', 'type']; this.before = function(feature) { console.log(feature.type, feature.url); }; } function customHeader(headers) { this.mwtype = 'reducer'; this.features = ['headers']; this.before = function(feature, env) { Object.keys(headers).forEach(k => feature.headers[k] = env.template(headers[k], env)); }; } function jsonHeader() { this.mwtype = 'reducer'; this.features = ['headers']; this.before = function(feature) { feature.headers['Content-Type'] = 'application/json'; }; } function GALogger(gaKey) { this.mwtype = 'router'; this.features = ['params', 'query']; this.before = function(feature) { console.log(`key: ${gaKey}, data: ${JSON.stringify(feature)}`); } } function WoowahanDevtools() { let w = window; let ctrl = document.createElement('div'); let c = document.createElement('canvas'); let ctx = c.getContext('2d'); let components = []; let isAttach = false; let isOption = false; let isVisible = false; let rect = { get width() { return w.innerWidth; }, get height() { return w.innerHeight; } }; ctrl.style.position = 'fixed'; ctrl.style.top = '60px'; ctrl.style.right = '10px'; ctrl.style.width = '30px'; ctrl.style.height = '30px'; ctrl.style.background = 'red'; ctrl.style.borderRadius = '15px'; ctrl.style.opacity = 0.2; ctrl.style.zIndex = 999999; document.body.append(ctrl); ctrl.addEventListener('mouseover', function() { this.style.opacity = 0.4; }); ctrl.addEventListener('mouseout', function() { this.style.opacity = 0.2; }); ctrl.addEventListener('click', function() { isVisible = !isVisible; }); this.mwtype = 'view'; function addComponent(component) { let cid = component.dataset.componentId; if (components.filter(comp => comp.dataset.componentId === cid).length === 0) { components.push(component); } } c.setAttribute('width', rect.width); c.setAttribute('height', rect.height); c.style.display = 'none'; c.style.position = 'fixed'; c.style.left = 0; c.style.top = 0; w.addEventListener('resize', function() { c.setAttribute('width', rect.width); c.setAttribute('height', rect.height); }); window.requestAnimationFrame(devmode); function devmode() { ctx.clearRect(0, 0, rect.width, rect.height); if (isVisible) { if (c.style.display === 'none') { c.style.display = 'block'; } document.querySelector('#app').style.opacity = 0.3; if (Woowahan.config.testMode) { components.forEach(comp => { let rect = comp.getBoundingClientRect(); ctx.save(); if (comp.dataset.componentViewName) { ctx.font = '24pt verdana'; ctx.fillStyle = COLOR.view(true); ctx.strokeStyle = COLOR.view(false); ctx.fillRect(rect.left, rect.top, rect.width, rect.height); ctx.strokeRect(rect.left, rect.top, rect.width, rect.height); ctx.fillStyle = 'black'; ctx.fillText(comp.dataset.componentViewName, rect.left + 20, rect.top + 40); } else { ctx.font = '11px verdana'; ctx.fillStyle = COLOR.node(true); ctx.strokeStyle = COLOR.node(false); ctx.strokeRect(rect.left+0.5, rect.top+0.5, rect.width, rect.height); if (isOption) { ctx.fillStyle = COLOR.node(false); ctx.fillText(`${comp.dataset.componentHandlerName} #${comp.dataset.componentId}`, rect.left, rect.top+rect.height+20); } } ctx.restore(); }); } } else { document.querySelector('#app').style.opacity = 1; if (c.style.display === 'block') c.style.display = 'none'; } requestAnimationFrame(devmode); } this.after = function(view, dom) { let idx = 0; if (!isAttach) { document.body.appendChild(c); isAttach = true; } dom.setAttribute('data-component-id', view.viewname+'.'+(++idx)); dom.setAttribute('data-component-view-name', view.viewname); addComponent(dom); if (view.events) { Object.keys(view.events).forEach(event => { dom.querySelectorAll(event.split(' ')[1]).forEach(node => { node.setAttribute('data-component-id', view.viewname+'.'+(++idx)); node.setAttribute('data-component-handler-name', view.events[event]); addComponent(node); }); }); } } } /** * Use middleware */ app.set(logger); app.set(customHeader, { 'X-Authorization': 'Bearer {{token}}' }); app.set(jsonHeader); app.set(WoowahanDevtools); app.set(GALogger, 'qwertyuiop'); app.use(reducer); Woowahan.testDef = function(view) { view.def = { 'onDoit': '이것은 디스패치다' }; }; Woowahan.testDef(mainView); app.start({ url: '/', view: mainView, container: '#app' }); ================================================ FILE: examples/middleware/index.html ================================================ Middleware
          ================================================ FILE: examples/middleware/woowahan.js ================================================ !function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";e.exports=n(1)},function(e,t,n){(function(t){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};i(this,e),this.reducers=t.reducers||{},this.components=t.components||{},this.middlewares={app:{before:[],after:[]},router:{before:[],after:[]},reducer:{before:[],after:[]},view:{before:[],after:[],unmount:[]}},this.store=null,this.queue=[],this.actionObject={},this.queuemonitor=null,y=this,this.enableQueue()}return s(e,[{key:"enableQueue",value:function(){this.queuemonitor=setInterval(this.queuing.bind(this),v)}},{key:"disableQueue",value:function(){this.queuemonitor=clearInterval(this.queuemonitor)}},{key:"addAction",value:function(e){this.actionObject[e]=Date.now(),1===this.numberOfWorkAction()&&this.trigger("start")}},{key:"removeAction",value:function(e){delete this.actionObject[e],0===this.numberOfWorkAction()&&this.trigger("finish")}},{key:"addError",value:function(e){this.trigger("error",e)}},{key:"queuing",value:function(){this.disableQueue();var e=this.queue.shift();if(e){var t=this.reducers[e.action.type];if(!t)throw this.enableQueue(),new Error("The unregistered reducer. Please check the type of action, if there is a written reducer use after registration.");if(e.subscriber=e.subscriber||function(){},"function"!=typeof e.subscriber)throw this.enableQueue(),new Error("The listener must be a function. If you do not need the listener it may not be specified.");if(t.schema){var n=t.schema.validate(e.action.data);n?this.trigger("error",n):new(Function.prototype.bind.apply(t,Array.prototype.concat.call(t,e.action.data,e.subscriber.bind(this))))}else new(Function.prototype.bind.apply(t,Array.prototype.concat.call(t,e.action.data,e.subscriber.bind(this))))}this.enableQueue()}},{key:"bindStore",value:function(e){this.store=e}},{key:"bindReducer",value:function(e){this.reducers[e.actionName]=e}},{key:"bindComponent",value:function(e){this.components[e.name]=e}},{key:"bindPlugin",value:function(t){var n=t.type.toLowerCase();if(e.View.prototype._plugins.hasOwnProperty(n))throw new Error("Duplicate plugin name");e.View.prototype._plugins[n]=t.plugin}},{key:"combineReducer",value:function(e){var t=this;e&&e.forEach(function(e){t.bindReducer(e)})}},{key:"getStates",value:function(e){return"undefined"!=typeof e?this.store[e]:this.store}},{key:"setStates",value:function(e,t){var n=void 0;n="string"==typeof e&&"undefined"!=typeof t?r({},e,t):e,this.store||(this.store={}),Object.assign(this.store,n)}},{key:"getMiddleware",value:function(e,t){return this.middlewares[e][t]}},{key:"getComponent",value:function(e){var t=this.components[e];if(t)return t.view}},{key:"getRouteTables",value:function(){return l.routeTables}},{key:"dispatch",value:function(e,t){d(a("dispatch action %s",e.type)),this.queue.push({action:e,subscriber:t})}},{key:"use",value:function(e){var t=this;Array.isArray(e)?e.forEach(function(e){return t.useModule(e)}):"object"!==("undefined"==typeof e?"undefined":o(e))||"wwtype"in e?this.useModule(e):Object.keys(e).forEach(function(n){"function"==typeof e[n]&&t.useModule(e[n])})}},{key:"useModule",value:function(e){switch(e.wwtype){case"reducer":this.bindReducer(e);break;case"layout":l.bindLayout(e);break;case"store":this.bindStore(e.store);break;case"component":console.warn("Component:: Deprecated and will be removed in a future release."),this.bindComponent(e);break;case"plugin":this.bindPlugin(e)}}},{key:"set",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=new e(n);if(!r.mwtype)throw new Error('Required attribute "mwtype" is missing.');Object.values(h).forEach(function(e){e in r&&t.middlewares[r.mwtype][e].push(r)})}},{key:"start",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("undefined"==typeof jQuery)throw new Error("jQuery is not loaded!!");var r=setInterval(function(){switch(document.readyState){case"complete":case"loaded":break;default:return}clearInterval(r),e&&l.design(e,n,g);var i=t.getMiddleware(f.APP,h.BEFORE);p.run(i,h.BEFORE,[g],function(){i=this.getMiddleware(f.APP,h.AFTER),p.run(i,h.AFTER,[g],function(){c.history.start({pushState:!!n.pushState})})}.bind(t))},1)}},{key:"numberOfAction",value:function(){return this.queue.length}},{key:"numberOfWorkAction",value:function(){return Object.keys(this.actionObject).length}}]),e}();Object.assign(m.prototype,c.Events),m.$=c.$,m.View=n(14)(g),m.Reducer=n(19)(g),m.Error=n(20),m.Types=n(21),m.Store=n(22),m.Action=n(23),m.Event=n(24),m.Schema=n(25),m.Layout=n(26),m.Component=n(27),m.Plugin=n(28),e.exports=t.Woowahan=m,m.CollectionView=n(29)(g),m.ItemView=n(31)(g),m.PopupView=n(32)(g)}).call(t,function(){return this}())},function(e,t,n){(function(e,r){function i(e,n){var r={seen:[],stylize:s};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),v(n)?r.showHidden=n:n&&t._extend(r,n),x(r.showHidden)&&(r.showHidden=!1),x(r.depth)&&(r.depth=2),x(r.colors)&&(r.colors=!1),x(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=o),u(r,e,r.depth)}function o(e,t){var n=i.styles[t];return n?"["+i.colors[n][0]+"m"+e+"["+i.colors[n][1]+"m":e}function s(e,t){return e}function a(e){var t={};return e.forEach(function(e,n){t[e]=!0}),t}function u(e,n,r){if(e.customInspect&&n&&_(n.inspect)&&n.inspect!==t.inspect&&(!n.constructor||n.constructor.prototype!==n)){var i=n.inspect(r,e);return b(i)||(i=u(e,i,r)),i}var o=c(e,n);if(o)return o;var s=Object.keys(n),v=a(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(n)),A(n)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return l(n);if(0===s.length){if(_(n)){var g=n.name?": "+n.name:"";return e.stylize("[Function"+g+"]","special")}if(E(n))return e.stylize(RegExp.prototype.toString.call(n),"regexp");if(S(n))return e.stylize(Date.prototype.toString.call(n),"date");if(A(n))return l(n)}var y="",m=!1,w=["{","}"];if(d(n)&&(m=!0,w=["[","]"]),_(n)){var x=n.name?": "+n.name:"";y=" [Function"+x+"]"}if(E(n)&&(y=" "+RegExp.prototype.toString.call(n)),S(n)&&(y=" "+Date.prototype.toUTCString.call(n)),A(n)&&(y=" "+l(n)),0===s.length&&(!m||0==n.length))return w[0]+y+w[1];if(r<0)return E(n)?e.stylize(RegExp.prototype.toString.call(n),"regexp"):e.stylize("[Object]","special");e.seen.push(n);var T;return T=m?f(e,n,r,v,s):s.map(function(t){return h(e,n,r,v,t,m)}),e.seen.pop(),p(T,y,w)}function c(e,t){if(x(t))return e.stylize("undefined","undefined");if(b(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}return m(t)?e.stylize(""+t,"number"):v(t)?e.stylize(""+t,"boolean"):g(t)?e.stylize("null","null"):void 0}function l(e){return"["+Error.prototype.toString.call(e)+"]"}function f(e,t,n,r,i){for(var o=[],s=0,a=t.length;s-1&&(a=o?a.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+a.split("\n").map(function(e){return" "+e}).join("\n"))):a=e.stylize("[Circular]","special")),x(s)){if(o&&i.match(/^\d+$/))return a;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+a}function p(e,t,n){var r=0,i=e.reduce(function(e,t){return r++,t.indexOf("\n")>=0&&r++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function d(e){return Array.isArray(e)}function v(e){return"boolean"==typeof e}function g(e){return null===e}function y(e){return null==e}function m(e){return"number"==typeof e}function b(e){return"string"==typeof e}function w(e){return"symbol"==typeof e}function x(e){return void 0===e}function E(e){return T(e)&&"[object RegExp]"===k(e)}function T(e){return"object"==typeof e&&null!==e}function S(e){return T(e)&&"[object Date]"===k(e)}function A(e){return T(e)&&("[object Error]"===k(e)||e instanceof Error)}function _(e){return"function"==typeof e}function C(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function k(e){return Object.prototype.toString.call(e)}function j(e){return e<10?"0"+e.toString(10):e.toString(10)}function O(){var e=new Date,t=[j(e.getHours()),j(e.getMinutes()),j(e.getSeconds())].join(":");return[e.getDate(),L[e.getMonth()],t].join(" ")}function N(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var R=/%[sdj%]/g;t.format=function(e){if(!b(e)){for(var t=[],n=0;n=o)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(e){return"[Circular]"}default:return e}}),a=r[n];n1)for(var n=1;n=31||navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))}function o(e){var n=this.useColors;if(e[0]=(n?"%c":"")+this.namespace+(n?" %c":" ")+e[0]+(n?"%c ":" ")+"+"+t.humanize(this.diff),n){var r="color: "+this.color;e.splice(1,0,r,"color: inherit");var i=0,o=0;e[0].replace(/%[a-zA-Z%]/g,function(e){"%%"!==e&&(i++,"%c"===e&&(o=i))}),e.splice(o,0,r)}}function s(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function a(e){try{null==e?t.storage.removeItem("debug"):t.storage.debug=e}catch(e){}}function u(){var e;try{e=t.storage.debug}catch(e){}return!e&&"undefined"!=typeof r&&"env"in r&&(e=r.env.DEBUG),e}function c(){try{return window.localStorage}catch(e){}}t=e.exports=n(7),t.log=s,t.formatArgs=o,t.save=a,t.load=u,t.useColors=i,t.storage="undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage?chrome.storage.local:c(),t.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}},t.enable(u())}).call(t,n(3))},function(e,t,n){function r(e){var n,r=0;for(n in e)r=(r<<5)-r+e.charCodeAt(n),r|=0;return t.colors[Math.abs(r)%t.colors.length]}function i(e){function n(){if(n.enabled){var e=n,r=+new Date,i=r-(c||r);e.diff=i,e.prev=c,e.curr=r,c=r;for(var o=new Array(arguments.length),s=0;s100)){var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(t){var n=parseFloat(t[1]),r=(t[2]||"ms").toLowerCase();switch(r){case"years":case"year":case"yrs":case"yr":case"y":return n*l;case"days":case"day":case"d":return n*c;case"hours":case"hour":case"hrs":case"hr":case"h":return n*u;case"minutes":case"minute":case"mins":case"min":case"m":return n*a;case"seconds":case"second":case"secs":case"sec":case"s":return n*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function r(e){return e>=c?Math.round(e/c)+"d":e>=u?Math.round(e/u)+"h":e>=a?Math.round(e/a)+"m":e>=s?Math.round(e/s)+"s":e+"ms"}function i(e){return o(e,c,"day")||o(e,u,"hour")||o(e,a,"minute")||o(e,s,"second")||e+" ms"}function o(e,t,n){if(!(e0)return n(e);if("number"===o&&isNaN(e)===!1)return t.long?i(e):r(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,n){var r,i;(function(o){!function(s){var a="object"==typeof self&&self.self===self&&self||"object"==typeof o&&o.global===o&&o;r=[n(10),n(11),t],i=function(e,t,n){a.Backbone=s(a,n,e,t)}.apply(t,r),!(void 0!==i&&(e.exports=i))}(function(e,t,n,r){var i=e.Backbone,s=Array.prototype.slice;t.VERSION="1.3.3",t.$=r,t.noConflict=function(){return e.Backbone=i,this},t.emulateHTTP=!1,t.emulateJSON=!1;var a=function(e,t,r){switch(e){case 1:return function(){return n[t](this[r])};case 2:return function(e){return n[t](this[r],e)};case 3:return function(e,i){return n[t](this[r],c(e,this),i)};case 4:return function(e,i,o){return n[t](this[r],c(e,this),i,o)};default:return function(){var e=s.call(arguments);return e.unshift(this[r]),n[t].apply(n,e)}}},u=function(e,t,r){n.each(t,function(t,i){n[i]&&(e.prototype[i]=a(t,i,r))})},c=function(e,t){return n.isFunction(e)?e:n.isObject(e)&&!t._isModel(e)?l(e):n.isString(e)?function(t){return t.get(e)}:e},l=function(e){var t=n.matches(e);return function(e){return t(e.attributes)}},f=t.Events={},h=/\s+/,p=function(e,t,r,i,o){var s,a=0;if(r&&"object"==typeof r){void 0!==i&&"context"in o&&void 0===o.context&&(o.context=i);for(s=n.keys(r);athis.length&&(i=this.length),i<0&&(i+=this.length+1);var o,s,a=[],u=[],c=[],l=[],f={},h=t.add,p=t.merge,d=t.remove,v=!1,g=this.comparator&&null==i&&t.sort!==!1,y=n.isString(this.comparator)?this.comparator:null;for(s=0;s7),this._useHashChange=this._wantsHashChange&&this._hasHashChange,this._wantsPushState=!!this.options.pushState,this._hasPushState=!(!this.history||!this.history.pushState),this._usePushState=this._wantsPushState&&this._hasPushState,this.fragment=this.getFragment(),this.root=("/"+this.root+"/").replace(F,"/"),this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){var t=this.root.slice(0,-1)||"/";return this.location.replace(t+"#"+this.getPath()),!0}this._hasPushState&&this.atRoot()&&this.navigate(this.getHash(),{replace:!0})}if(!this._hasHashChange&&this._wantsHashChange&&!this._usePushState){this.iframe=document.createElement("iframe"),this.iframe.src="javascript:0",this.iframe.style.display="none",this.iframe.tabIndex=-1;var r=document.body,i=r.insertBefore(this.iframe,r.firstChild).contentWindow;i.document.open(),i.document.close(),i.location.hash="#"+this.fragment}var o=window.addEventListener||function(e,t){return attachEvent("on"+e,t)};if(this._usePushState?o("popstate",this.checkUrl,!1):this._useHashChange&&!this.iframe?o("hashchange",this.checkUrl,!1):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),!this.options.silent)return this.loadUrl()},stop:function(){var e=window.removeEventListener||function(e,t){return detachEvent("on"+e,t)};this._usePushState?e("popstate",this.checkUrl,!1):this._useHashChange&&!this.iframe&&e("hashchange",this.checkUrl,!1),this.iframe&&(document.body.removeChild(this.iframe),this.iframe=null),this._checkUrlInterval&&clearInterval(this._checkUrlInterval),I.started=!1},route:function(e,t){this.handlers.unshift({route:e,callback:t})},checkUrl:function(e){var t=this.getFragment();return t===this.fragment&&this.iframe&&(t=this.getHash(this.iframe.contentWindow)),t!==this.fragment&&(this.iframe&&this.navigate(t),void this.loadUrl())},loadUrl:function(e){return!!this.matchRoot()&&(e=this.fragment=this.getFragment(e),n.some(this.handlers,function(t){if(t.route.test(e))return t.callback(e),!0}))},navigate:function(e,t){if(!I.started)return!1;t&&t!==!0||(t={trigger:!!t}),e=this.getFragment(e||"");var n=this.root;""!==e&&"?"!==e.charAt(0)||(n=n.slice(0,-1)||"/");var r=n+e;if(e=this.decodeFragment(e.replace(P,"")),this.fragment!==e){if(this.fragment=e,this._usePushState)this.history[t.replace?"replaceState":"pushState"]({},document.title,r);else{if(!this._wantsHashChange)return this.location.assign(r);if(this._updateHash(this.location,e,t.replace),this.iframe&&e!==this.getHash(this.iframe.contentWindow)){var i=this.iframe.contentWindow;t.replace||(i.document.open(),i.document.close()),this._updateHash(i.location,e,t.replace)}}return t.trigger?this.loadUrl(e):void 0}},_updateHash:function(e,t,n){if(n){var r=e.href.replace(/(javascript:|#).*$/,"");e.replace(r+"#"+t)}else e.hash="#"+t}}),t.history=new I;var $=function(e,t){var r,i=this;return r=e&&n.has(e,"constructor")?e.constructor:function(){return i.apply(this,arguments)},n.extend(r,i,t),r.prototype=n.create(i.prototype,e),r.prototype.constructor=r,r.__super__=i.prototype,r};w.extend=E.extend=N.extend=C.extend=I.extend=$;var H=function(){throw new Error('A "url" property or function must be specified')},W=function(e,t){var n=t.error;t.error=function(r){n&&n.call(t.context,e,r,t),e.trigger("error",e,r,t)}};return t})}).call(t,function(){return this}())},function(e,t,n){var r,i;(function(){function n(e){function t(t,n,r,i,o,s){for(;o>=0&&o0?0:a-1;return arguments.length<3&&(i=n[s?s[u]:u],u+=e),t(n,r,i,s,u,a)}}function o(e){return function(t,n,r){n=S(n,r);for(var i=j(t),o=e>0?0:i-1;o>=0&&o0?s=o>=0?o:Math.max(o+a,s):a=o>=0?Math.min(o+1,a):o+a+1;else if(n&&o&&a)return o=n(r,i),r[o]===i?o:-1;if(i!==i)return o=t(d.call(r,s,a),E.isNaN),o>=0?o+s:-1;for(o=e>0?s:a-1;o>=0&&o=0&&t<=k};E.each=E.forEach=function(e,t,n){t=T(t,n);var r,i;if(O(e))for(r=0,i=e.length;r=0},E.invoke=function(e,t){var n=d.call(arguments,2),r=E.isFunction(t);return E.map(e,function(e){var i=r?t:e[t];return null==i?i:i.apply(e,n)})},E.pluck=function(e,t){return E.map(e,E.property(t))},E.where=function(e,t){return E.filter(e,E.matcher(t))},E.findWhere=function(e,t){return E.find(e,E.matcher(t))},E.max=function(e,t,n){var r,i,o=-(1/0),s=-(1/0);if(null==t&&null!=e){e=O(e)?e:E.values(e);for(var a=0,u=e.length;ao&&(o=r)}else t=S(t,n),E.each(e,function(e,n,r){i=t(e,n,r),(i>s||i===-(1/0)&&o===-(1/0))&&(o=e,s=i)});return o},E.min=function(e,t,n){var r,i,o=1/0,s=1/0;if(null==t&&null!=e){e=O(e)?e:E.values(e);for(var a=0,u=e.length;ar||void 0===n)return 1;if(nt?(s&&(clearTimeout(s),s=null),a=c,o=e.apply(r,i),s||(r=i=null)):s||n.trailing===!1||(s=setTimeout(u,l)),o}},E.debounce=function(e,t,n){var r,i,o,s,a,u=function(){var c=E.now()-s;c=0?r=setTimeout(u,t-c):(r=null,n||(a=e.apply(o,i),r||(o=i=null)))};return function(){o=this,i=arguments,s=E.now();var c=n&&!r;return r||(r=setTimeout(u,t)),c&&(a=e.apply(o,i),o=i=null),a}},E.wrap=function(e,t){return E.partial(t,e)},E.negate=function(e){return function(){return!e.apply(this,arguments)}},E.compose=function(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}},E.after=function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},E.before=function(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}},E.once=E.partial(E.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),L=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];E.keys=function(e){if(!E.isObject(e))return[];if(m)return m(e);var t=[];for(var n in e)E.has(e,n)&&t.push(n);return M&&a(e,t),t},E.allKeys=function(e){if(!E.isObject(e))return[];var t=[];for(var n in e)t.push(n);return M&&a(e,t),t},E.values=function(e){for(var t=E.keys(e),n=t.length,r=Array(n),i=0;i":">",'"':""","'":"'","`":"`"},F=E.invert(q),P=function(e){var t=function(t){return e[t]},n="(?:"+E.keys(e).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(e){return e=null==e?"":""+e,r.test(e)?e.replace(i,t):e}};E.escape=P(q),E.unescape=P(F),E.result=function(e,t,n){var r=null==e?void 0:e[t];return void 0===r&&(r=n),E.isFunction(r)?r.call(e):r};var $=0;E.uniqueId=function(e){var t=++$+"";return e?e+t:t},E.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var H=/(.)^/,W={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},B=/\\|'|\r|\n|\u2028|\u2029/g,U=function(e){return"\\"+W[e]};E.template=function(e,t,n){!t&&n&&(t=n),t=E.defaults({},t,E.templateSettings);var r=RegExp([(t.escape||H).source,(t.interpolate||H).source,(t.evaluate||H).source].join("|")+"|$","g"),i=0,o="__p+='";e.replace(r,function(t,n,r,s,a){return o+=e.slice(i,a).replace(B,U),i=a+t.length,n?o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?o+="'+\n((__t=("+r+"))==null?'':__t)+\n'":s&&(o+="';\n"+s+"\n__p+='"),t}),o+="';\n",t.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{var s=new Function(t.variable||"obj","_",o)}catch(e){throw e.source=o,e}var a=function(e){return s.call(this,e,E)},u=t.variable||"obj";return a.source="function("+u+"){\n"+o+"}",a},E.chain=function(e){var t=E(e);return t._chain=!0,t};var z=function(e,t){return e._chain?E(t).chain():t};E.mixin=function(e){E.each(E.functions(e),function(t){var n=E[t]=e[t];E.prototype[t]=function(){var e=[this._wrapped];return p.apply(e,arguments),z(this,n.apply(E,e))}})},E.mixin(E),E.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=l[e];E.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0],z(this,n)}}),E.each(["concat","join","slice"],function(e){var t=l[e];E.prototype[e]=function(){return z(this,t.apply(this._wrapped,arguments))}}),E.prototype.value=function(){return this._wrapped},E.prototype.valueOf=E.prototype.toJSON=E.prototype.value,E.prototype.toString=function(){return""+this._wrapped},r=[],i=function(){return E}.apply(t,r),!(void 0!==i&&(e.exports=i))}).call(this)},function(e,t,n){var r,i;!function(t,n){"object"==typeof e&&"object"==typeof e.exports?e.exports=t.document?n(t,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return n(e)}:n(t)}("undefined"!=typeof window?window:this,function(n,o){function s(e){var t=!!e&&"length"in e&&e.length,n=ce.type(e);return"function"!==n&&!ce.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function a(e,t,n){if(ce.isFunction(t))return ce.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return ce.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(be.test(t))return ce.filter(t,e,n);t=ce.filter(t,e)}return ce.grep(e,function(e){return re.call(t,e)>-1!==n})}function u(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function c(e){var t={};return ce.each(e.match(Ae)||[],function(e,n){t[n]=!0}),t}function l(){Z.removeEventListener("DOMContentLoaded",l),n.removeEventListener("load",l),ce.ready()}function f(){this.expando=ce.expando+f.uid++}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Re,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:Ne.test(n)?ce.parseJSON(n):n)}catch(e){}Oe.set(e,t,n)}else n=void 0;return n}function p(e,t,n,r){var i,o=1,s=20,a=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=a(),c=n&&n[3]||(ce.cssNumber[t]?"":"px"),l=(ce.cssNumber[t]||"px"!==c&&+u)&&Me.exec(ce.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do o=o||".5",l/=o,ce.style(e,t,l+c);while(o!==(o=a()/u)&&1!==o&&--s)}return n&&(l=+l||+u||0,i=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=i)),i}function d(e,t){var n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&ce.nodeName(e,t)?ce.merge([e],n):n}function v(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(c=ce.contains(o.ownerDocument,o),s=d(f.appendChild(o),"script"),c&&v(s),n)for(l=0;o=s[l++];)Pe.test(o.type||"")&&n.push(o);return f}function y(){return!0}function m(){return!1}function b(){try{return Z.activeElement}catch(e){}}function w(e,t,n,r,i,o){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)w(e,a,n,r,t[a],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=m;else if(!i)return e;return 1===o&&(s=i,i=function(e){return ce().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function x(e,t){return ce.nodeName(e,"table")&&ce.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function E(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function T(e){var t=Xe.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,i,o,s,a,u,c;if(1===t.nodeType){if(je.hasData(e)&&(o=je.access(e),s=je.set(t,o),c=o.events)){delete s.handle,s.events={};for(i in c)for(n=0,r=c[i].length;n1&&"string"==typeof p&&!ae.checkClone&&Je.test(p))return e.each(function(i){var o=e.eq(i);v&&(t[0]=p.call(this,i,o.html())),_(o,t,n,r)});if(f&&(i=g(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=ce.map(d(i,"script"),E),a=s.length;l")).appendTo(t.documentElement),t=Ye[0].contentDocument,t.write(),t.close(),n=k(e,t),Ye.detach()),Qe[e]=n),n}function O(e,t,n){var r,i,o,s,a=e.style;return n=n||et(e),s=n?n.getPropertyValue(t)||n[t]:void 0,""!==s&&void 0!==s||ce.contains(e.ownerDocument,e)||(s=ce.style(e,t)),n&&!ae.pixelMarginRight()&&Ze.test(s)&&Ke.test(t)&&(r=a.width,i=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=r,a.minWidth=i,a.maxWidth=o),void 0!==s?s+"":s}function N(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function R(e){if(e in at)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=st.length;n--;)if(e=st[n]+t,e in at)return e}function D(e,t,n){var r=Me.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function M(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;o<4;o+=2)"margin"===n&&(s+=ce.css(e,n+Le[o],!0,i)),r?("content"===n&&(s-=ce.css(e,"padding"+Le[o],!0,i)),"margin"!==n&&(s-=ce.css(e,"border"+Le[o]+"Width",!0,i))):(s+=ce.css(e,"padding"+Le[o],!0,i),"padding"!==n&&(s+=ce.css(e,"border"+Le[o]+"Width",!0,i)));return s}function L(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=et(e),s="border-box"===ce.css(e,"boxSizing",!1,o);if(i<=0||null==i){if(i=O(e,t,o),(i<0||null==i)&&(i=e.style[t]),Ze.test(i))return i;r=s&&(ae.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+M(e,t,n||(s?"border":"content"),r,o)+"px"}function I(e,t){for(var n,r,i,o=[],s=0,a=e.length;s=0&&n=0},isPlainObject:function(e){var t;if("object"!==ce.type(e)||e.nodeType||ce.isWindow(e))return!1;if(e.constructor&&!se.call(e,"constructor")&&!se.call(e.constructor.prototype||{},"isPrototypeOf"))return!1;for(t in e);return void 0===t||se.call(e,t)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ie[oe.call(e)]||"object":typeof e},globalEval:function(e){var t,n=eval;e=ce.trim(e),e&&(1===e.indexOf("use strict")?(t=Z.createElement("script"),t.text=e,Z.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(fe,"ms-").replace(he,pe)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var n,r=0;if(s(e))for(n=e.length;rE.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=R.createElement("div");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)E.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||J)-(~e.sourceIndex||J);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),s=o.length;s--;)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}function l(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function v(e,n,r){for(var i=0,o=n.length;i-1&&(r[c]=!(s[c]=f))}}else b=g(b===s?b.splice(d,b.length):b),o?o(null,s,b,u):K.apply(s,b)})}function m(e){for(var t,n,r,i=e.length,o=E.relative[e[0].type],s=o||E.relative[" "],a=o?1:0,u=p(function(e){return e===t},s,!0),c=p(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var i=!o&&(r||n!==k)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,i}];a1&&d(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,o=e.length>0,s=function(r,s,a,u,c){var l,f,h,p=0,d="0",v=r&&[],y=[],m=k,b=r||o&&E.find.TAG("*",c),w=H+=null==m?1:Math.random()||.1,x=b.length;for(c&&(k=s===R||s||c);d!==x&&null!=(l=b[d]);d++){if(o&&l){for(f=0,s||l.ownerDocument===R||(N(l),a=!M);h=e[f++];)if(h(l,s||R,a)){u.push(l);break}c&&(H=w)}i&&((l=!h&&l)&&p--,r&&v.push(l))}if(p+=d,i&&d!==p){for(f=0;h=n[f++];)h(v,y,s,a);if(r){if(p>0)for(;d--;)v[d]||y[d]||(y[d]=Y.call(u));y=g(y)}K.apply(u,y),c&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return c&&(H=w,k=m),v};return i?r(s):s}var w,x,E,T,S,A,_,C,k,j,O,N,R,D,M,L,I,q,F,P="sizzle"+1*new Date,$=e.document,H=0,W=0,B=n(),U=n(),z=n(),V=function(e,t){return e===t&&(O=!0),0},J=1<<31,X={}.hasOwnProperty,G=[],Y=G.pop,Q=G.push,K=G.push,Z=G.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),he=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ve=/^h\d$/i,ge=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,me=/[+~]/,be=/'|\\/g,we=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),xe=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Ee=function(){N()};try{K.apply(G=Z.call($.childNodes),$.childNodes),G[$.childNodes.length].nodeType}catch(e){K={apply:G.length?function(e,t){Q.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}x=t.support={},S=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},N=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:$;return r!==R&&9===r.nodeType&&r.documentElement?(R=r,D=R.documentElement,M=!S(R),(n=R.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ee,!1):n.attachEvent&&n.attachEvent("onunload",Ee)),x.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),x.getElementsByTagName=i(function(e){return e.appendChild(R.createComment("")),!e.getElementsByTagName("*").length}),x.getElementsByClassName=ge.test(R.getElementsByClassName),x.getById=i(function(e){return D.appendChild(e).id=P,!R.getElementsByName||!R.getElementsByName(P).length}),x.getById?(E.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&M){var n=t.getElementById(e);return n?[n]:[]}},E.filter.ID=function(e){var t=e.replace(we,xe);return function(e){return e.getAttribute("id")===t}}):(delete E.find.ID,E.filter.ID=function(e){var t=e.replace(we,xe);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),E.find.TAG=x.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):x.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},E.find.CLASS=x.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&M)return t.getElementsByClassName(e)},I=[],L=[],(x.qsa=ge.test(R.querySelectorAll))&&(i(function(e){D.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&L.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||L.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||L.push("~="),e.querySelectorAll(":checked").length||L.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||L.push(".#.+[+~]")}),i(function(e){var t=R.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&L.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||L.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),L.push(",.*:")})),(x.matchesSelector=ge.test(q=D.matches||D.webkitMatchesSelector||D.mozMatchesSelector||D.oMatchesSelector||D.msMatchesSelector))&&i(function(e){x.disconnectedMatch=q.call(e,"div"),q.call(e,"[s!='']:x"),I.push("!=",oe)}),L=L.length&&new RegExp(L.join("|")),I=I.length&&new RegExp(I.join("|")),t=ge.test(D.compareDocumentPosition),F=t||ge.test(D.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return O=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!x.sortDetached&&t.compareDocumentPosition(e)===n?e===R||e.ownerDocument===$&&F($,e)?-1:t===R||t.ownerDocument===$&&F($,t)?1:j?ee(j,e)-ee(j,t):0:4&n?-1:1)}:function(e,t){if(e===t)return O=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],u=[t];if(!i||!o)return e===R?-1:t===R?1:i?-1:o?1:j?ee(j,e)-ee(j,t):0;if(i===o)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===$?-1:u[r]===$?1:0},R):R},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==R&&N(e),n=n.replace(le,"='$1']"),x.matchesSelector&&M&&!z[n+" "]&&(!I||!I.test(n))&&(!L||!L.test(n)))try{var r=q.call(e,n);if(r||x.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,R,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==R&&N(e),F(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==R&&N(e);var n=E.attrHandle[t.toLowerCase()],r=n&&X.call(E.attrHandle,t.toLowerCase())?n(e,t,!M):void 0;return void 0!==r?r:x.attributes||!M?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(O=!x.detectDuplicates,j=!x.sortStable&&e.slice(0),e.sort(V),O){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return j=null,e},T=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=T(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=T(t);return n},E=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(we,xe),e[3]=(e[3]||e[4]||e[5]||"").replace(we,xe),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=A(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(we,xe).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=B[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&B(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,h,p,d,v=o!==s?"nextSibling":"previousSibling",g=t.parentNode,y=a&&t.nodeName.toLowerCase(),m=!u&&!a,b=!1;if(g){if(o){for(;v;){for(h=t;h=h[v];)if(a?h.nodeName.toLowerCase()===y:1===h.nodeType)return!1;d=v="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?g.firstChild:g.lastChild],s&&m){for(h=g,f=h[P]||(h[P]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),c=l[e]||[],p=c[0]===H&&c[1],b=p&&c[2],h=p&&g.childNodes[p];h=++p&&h&&h[v]||(b=p=0)||d.pop();)if(1===h.nodeType&&++b&&h===t){l[e]=[H,p,b];break}}else if(m&&(h=t,f=h[P]||(h[P]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),c=l[e]||[],p=c[0]===H&&c[1],b=p),b===!1)for(;(h=++p&&h&&h[v]||(b=p=0)||d.pop())&&((a?h.nodeName.toLowerCase()!==y:1!==h.nodeType)||!++b||(m&&(f=h[P]||(h[P]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),l[e]=[H,b]),h!==t)););return b-=i,b===r||b%r===0&&b/r>=0}}},PSEUDO:function(e,n){var i,o=E.pseudos[e]||E.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],E.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),s=i.length;s--;)r=ee(e,i[s]),e[r]=!(t[r]=i[s])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=_(e.replace(ae,"$1"));return i[P]?r(function(e,t,n,r){for(var o,s=i(e,null,r,[]),a=e.length;a--;)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(we,xe),function(t){return(t.textContent||t.innerText||T(t)).indexOf(e)>-1}}),lang:r(function(e){return he.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(we,xe).toLowerCase(),function(t){var n;do if(n=M?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===D},focus:function(e){return e===R.activeElement&&(!R.hasFocus||R.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!E.pseudos.empty(e)},header:function(e){return ve.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[n<0?n+t:n]}),even:c(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:c(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=o[0]).type&&x.getById&&9===t.nodeType&&M&&E.relative[o[1].type]){if(t=(E.find.ID(s.matches[0].replace(we,xe),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(s=o[i],!E.relative[a=s.type]);)if((u=E.find[a])&&(r=u(s.matches[0].replace(we,xe),me.test(o[0].type)&&l(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&h(o),!e)return K.apply(n,r),n;break}}return(c||_(e,f))(r,t,!M,n,!t||me.test(e)&&l(t.parentNode)||t),n},x.sortStable=P.split("").sort(V).join("")===P,x.detectDuplicates=!!O,N(),x.sortDetached=i(function(e){return 1&e.compareDocumentPosition(R.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),x.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(n);ce.find=de,ce.expr=de.selectors,ce.expr[":"]=ce.expr.pseudos,ce.uniqueSort=ce.unique=de.uniqueSort,ce.text=de.getText,ce.isXMLDoc=de.isXML,ce.contains=de.contains;var ve=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},ge=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},ye=ce.expr.match.needsContext,me=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,be=/^.[^:#\[\.,]*$/;ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n=this.length,r=[],i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t1?ce.unique(r):r),r.selector=this.selector?this.selector+" "+e:e,r},filter:function(e){return this.pushStack(a(this,e||[],!1))},not:function(e){return this.pushStack(a(this,e||[],!0))},is:function(e){return!!a(this,"string"==typeof e&&ye.test(e)?ce(e):e||[],!1).length}});var we,xe=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,Ee=ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||we,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:xe.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:Z,!0)),me.test(r[1])&&ce.isPlainObject(t))for(r in t)ce.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=Z.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=Z,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):ce.isFunction(e)?void 0!==n.ready?n.ready(e):e(ce):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),ce.makeArray(e,this))};Ee.prototype=ce.fn,we=ce(Z);var Te=/^(?:parents|prev(?:Until|All))/,Se={children:!0,contents:!0,next:!0,prev:!0};ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?re.call(ce(e),this[0]):re.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return ve(e,"parentNode")},parentsUntil:function(e,t,n){return ve(e,"parentNode",n)},next:function(e){return u(e,"nextSibling")},prev:function(e){return u(e,"previousSibling")},nextAll:function(e){return ve(e,"nextSibling")},prevAll:function(e){return ve(e,"previousSibling")},nextUntil:function(e,t,n){return ve(e,"nextSibling",n)},prevUntil:function(e,t,n){return ve(e,"previousSibling",n)},siblings:function(e){return ge((e.parentNode||{}).firstChild,e)},children:function(e){return ge(e.firstChild)},contents:function(e){return e.contentDocument||ce.merge([],e.childNodes)}},function(e,t){ce.fn[e]=function(n,r){var i=ce.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=ce.filter(r,i)),this.length>1&&(Se[e]||ce.uniqueSort(i),Te.test(e)&&i.reverse()),this.pushStack(i)}});var Ae=/\S+/g;ce.Callbacks=function(e){e="string"==typeof e?c(e):ce.extend({},e);var t,n,r,i,o=[],s=[],a=-1,u=function(){for(i=e.once,r=t=!0;s.length;a=-1)for(n=s.shift();++a-1;)o.splice(n,1),n<=a&&a--}),this},has:function(e){return e?ce.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=s=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=s=[],n||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},ce.extend({Deferred:function(e){var t=[["resolve","done",ce.Callbacks("once memory"),"resolved"],["reject","fail",ce.Callbacks("once memory"),"rejected"],["notify","progress",ce.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return ce.Deferred(function(n){ce.each(t,function(t,o){var s=ce.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&ce.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?ce.extend(e,r):r}},i={};return r.pipe=r.then,ce.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ee.call(arguments),s=o.length,a=1!==s||e&&ce.isFunction(e.promise)?s:0,u=1===a?e:ce.Deferred(),c=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ee.call(arguments):i,r===t?u.notifyWith(n,r):--a||u.resolveWith(n,r)}};if(s>1)for(t=new Array(s),n=new Array(s),r=new Array(s);i0||(_e.resolveWith(Z,[ce]),ce.fn.triggerHandler&&(ce(Z).triggerHandler("ready"),ce(Z).off("ready"))))}}),ce.ready.promise=function(e){return _e||(_e=ce.Deferred(),"complete"===Z.readyState||"loading"!==Z.readyState&&!Z.documentElement.doScroll?n.setTimeout(ce.ready):(Z.addEventListener("DOMContentLoaded",l),n.addEventListener("load",l))),_e.promise(e)},ce.ready.promise();var Ce=function(e,t,n,r,i,o,s){var a=0,u=e.length,c=null==n;if("object"===ce.type(n)){i=!0;for(a in n)Ce(e,t,a,n[a],!0,o,s)}else if(void 0!==r&&(i=!0,ce.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(ce(e),n)})),t))for(;a-1&&void 0!==n&&Oe.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){Oe.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=je.get(e,t),n&&(!r||ce.isArray(n)?r=je.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t),s=function(){ce.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return je.get(e,n)||je.access(e,n,{empty:ce.Callbacks("once memory").add(function(){je.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length",""],thead:[1,"","
          "],col:[2,"","
          "],tr:[2,"","
          "],td:[3,"","
          "],_default:[0,"",""]};$e.optgroup=$e.option,$e.tbody=$e.tfoot=$e.colgroup=$e.caption=$e.thead,$e.th=$e.td;var He=/<|&#?\w+;/;!function(){var e=Z.createDocumentFragment(),t=e.appendChild(Z.createElement("div")),n=Z.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),ae.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",ae.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var We=/^key/,Be=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ue=/^([^.]*)(?:\.(.+)|)/;ce.event={global:{},add:function(e,t,n,r,i){var o,s,a,u,c,l,f,h,p,d,v,g=je.get(e);if(g)for(n.handler&&(o=n,n=o.handler,i=o.selector),n.guid||(n.guid=ce.guid++),(u=g.events)||(u=g.events={}),(s=g.handle)||(s=g.handle=function(t){return"undefined"!=typeof ce&&ce.event.triggered!==t.type?ce.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(Ae)||[""],c=t.length;c--;)a=Ue.exec(t[c])||[],p=v=a[1],d=(a[2]||"").split(".").sort(),p&&(f=ce.event.special[p]||{},p=(i?f.delegateType:f.bindType)||p,f=ce.event.special[p]||{},l=ce.extend({type:p,origType:v,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:d.join(".")},o),(h=u[p])||(h=u[p]=[],h.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(p,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,l):h.push(l),ce.event.global[p]=!0)},remove:function(e,t,n,r,i){var o,s,a,u,c,l,f,h,p,d,v,g=je.hasData(e)&&je.get(e);if(g&&(u=g.events)){for(t=(t||"").match(Ae)||[""],c=t.length;c--;)if(a=Ue.exec(t[c])||[],p=v=a[1],d=(a[2]||"").split(".").sort(),p){for(f=ce.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,h=u[p]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=h.length;o--;)l=h[o],!i&&v!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(h.splice(o,1),l.selector&&h.delegateCount--,f.remove&&f.remove.call(e,l));s&&!h.length&&(f.teardown&&f.teardown.call(e,d,g.handle)!==!1||ce.removeEvent(e,p,g.handle),delete u[p])}else for(p in u)ce.event.remove(e,p+t[c],n,r,!0);ce.isEmptyObject(u)&&je.remove(e,"handle events")}},dispatch:function(e){e=ce.event.fix(e);var t,n,r,i,o,s=[],a=ee.call(arguments),u=(je.get(this,"events")||{})[e.type]||[],c=ce.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){for(s=ce.event.handlers.call(this,e,u),t=0;(i=s[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:ce.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return a]*)\/>/gi,Ve=/\s*$/g;ce.extend({htmlPrefilter:function(e){return e.replace(ze,"<$1>")},clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=ce.contains(e.ownerDocument,e);if(!(ae.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(s=d(a),o=d(e),r=0,i=o.length;r0&&v(s,!u&&d(e,"script")),a},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if(ke(n)){if(t=n[je.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[je.expando]=void 0}n[Oe.expando]&&(n[Oe.expando]=void 0)}}}),ce.fn.extend({domManip:_,detach:function(e){return C(this,e,!0)},remove:function(e){return C(this,e)},text:function(e){return Ce(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return _(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=x(this,e);t.appendChild(e)}})},prepend:function(){return _(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=x(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return _(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return _(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(d(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return Ce(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ve.test(e)&&!$e[(Fe.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n1)},show:function(){return I(this,!0)},hide:function(){return I(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Ie(this)?ce(this).show():ce(this).hide()})}}),ce.Tween=q,q.prototype={constructor:q,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?"":"px")},cur:function(){var e=q.propHooks[this.prop];return e&&e.get?e.get(this):q.propHooks._default.get(this)},run:function(e){var t,n=q.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):q.propHooks._default.set(this),this}},q.prototype.init.prototype=q.prototype,q.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[ce.cssProps[e.prop]]&&!ce.cssHooks[e.prop]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}},q.propHooks.scrollTop=q.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},ce.fx=q.prototype.init,ce.fx.step={};var ut,ct,lt=/^(?:toggle|show|hide)$/,ft=/queueHooks$/;ce.Animation=ce.extend(B,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return p(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){ce.isFunction(e)?(t=e,e=["*"]):e=e.match(Ae);for(var n,r=0,i=e.length;r1)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(t=t.toLowerCase(),i=ce.attrHooks[t]||(ce.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=ce.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!ae.radioValue&&"radio"===t&&ce.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(Ae);if(o&&1===e.nodeType)for(;n=o[i++];)r=ce.propFix[n]||n,ce.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)}}),ht={set:function(e,t,n){return t===!1?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\w+/g),function(e,t){var n=pt[t]||ce.find.attr;pt[t]=function(e,t,r){var i,o;return r||(o=pt[t],pt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,pt[t]=o),i}});var dt=/^(?:input|select|textarea|button)$/i,vt=/^(?:a|area)$/i;ce.fn.extend({prop:function(e,t){return Ce(this,ce.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,"tabindex");return t?parseInt(t,10):dt.test(e.nodeName)||vt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),ae.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ce.propFix[this.toLowerCase()]=this});var gt=/[\t\r\n\f]/g;ce.fn.extend({addClass:function(e){var t,n,r,i,o,s,a,u=0;if(ce.isFunction(e))return this.each(function(t){ce(this).addClass(e.call(this,t,U(this)))});if("string"==typeof e&&e)for(t=e.match(Ae)||[];n=this[u++];)if(i=U(n),r=1===n.nodeType&&(" "+i+" ").replace(gt," ")){for(s=0;o=t[s++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");a=ce.trim(r),i!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,i,o,s,a,u=0;if(ce.isFunction(e))return this.each(function(t){ce(this).removeClass(e.call(this,t,U(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(Ae)||[];n=this[u++];)if(i=U(n),r=1===n.nodeType&&(" "+i+" ").replace(gt," ")){for(s=0;o=t[s++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");a=ce.trim(r),i!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):ce.isFunction(e)?this.each(function(n){ce(this).toggleClass(e.call(this,n,U(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=ce(this),o=e.match(Ae)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=U(this),t&&je.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":je.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+U(n)+" ").replace(gt," ").indexOf(t)>-1)return!0;return!1}});var yt=/\r/g,mt=/[\x20\t\r\n\f]+/g;ce.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=ce.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,ce(this).val()):e,null==i?i="":"number"==typeof i?i+="":ce.isArray(i)&&(i=ce.map(i,function(e){return null==e?"":e+""})),t=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=ce.valHooks[i.type]||ce.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(yt,""):null==n?"":n)}}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,"value");return null!=t?t:ce.trim(ce.text(e)).replace(mt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,s=o?null:[],a=o?i+1:r.length,u=i<0?a:o?i:0;u-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each(["radio","checkbox"],function(){ce.valHooks[this]={set:function(e,t){if(ce.isArray(t))return e.checked=ce.inArray(ce(e).val(),t)>-1}},ae.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var bt=/^(?:focusinfocus|focusoutblur)$/;ce.extend(ce.event,{trigger:function(e,t,r,i){var o,s,a,u,c,l,f,h=[r||Z],p=se.call(e,"type")?e.type:e,d=se.call(e,"namespace")?e.namespace.split("."):[];if(s=a=r=r||Z,3!==r.nodeType&&8!==r.nodeType&&!bt.test(p+ce.event.triggered)&&(p.indexOf(".")>-1&&(d=p.split("."),p=d.shift(),d.sort()),c=p.indexOf(":")<0&&"on"+p,e=e[ce.expando]?e:new ce.Event(p,"object"==typeof e&&e),e.isTrigger=i?2:3,e.namespace=d.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=r),t=null==t?[e]:ce.makeArray(t,[e]),f=ce.event.special[p]||{}, i||!f.trigger||f.trigger.apply(r,t)!==!1)){if(!i&&!f.noBubble&&!ce.isWindow(r)){for(u=f.delegateType||p,bt.test(u+p)||(s=s.parentNode);s;s=s.parentNode)h.push(s),a=s;a===(r.ownerDocument||Z)&&h.push(a.defaultView||a.parentWindow||n)}for(o=0;(s=h[o++])&&!e.isPropagationStopped();)e.type=o>1?u:f.bindType||p,l=(je.get(s,"events")||{})[e.type]&&je.get(s,"handle"),l&&l.apply(s,t),l=c&&s[c],l&&l.apply&&ke(s)&&(e.result=l.apply(s,t),e.result===!1&&e.preventDefault());return e.type=p,i||e.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),t)!==!1||!ke(r)||c&&ce.isFunction(r[p])&&!ce.isWindow(r)&&(a=r[c],a&&(r[c]=null),ce.event.triggered=p,r[p](),ce.event.triggered=void 0,a&&(r[c]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}}),ce.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){ce.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),ce.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),ae.focusin="onfocusin"in n,ae.focusin||ce.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){ce.event.simulate(t,e.target,ce.event.fix(e))};ce.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=je.access(r,t);i||r.addEventListener(e,n,!0),je.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=je.access(r,t)-1;i?je.access(r,t,i):(r.removeEventListener(e,n,!0),je.remove(r,t))}}});var wt=n.location,xt=ce.now(),Et=/\?/;ce.parseJSON=function(e){return JSON.parse(e+"")},ce.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new n.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||ce.error("Invalid XML: "+e),t};var Tt=/#.*$/,St=/([?&])_=[^&]*/,At=/^(.*?):[ \t]*([^\r\n]*)$/gm,_t=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ct=/^(?:GET|HEAD)$/,kt=/^\/\//,jt={},Ot={},Nt="*/".concat("*"),Rt=Z.createElement("a");Rt.href=wt.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:wt.href,type:"GET",isLocal:_t.test(wt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Nt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":ce.parseJSON,"text xml":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?J(J(e,ce.ajaxSettings),t):J(ce.ajaxSettings,e)},ajaxPrefilter:z(jt),ajaxTransport:z(Ot),ajax:function(e,t){function r(e,t,r,a){var c,f,m,b,x,T=t;2!==w&&(w=2,u&&n.clearTimeout(u),i=void 0,s=a||"",E.readyState=e>0?4:0,c=e>=200&&e<300||304===e,r&&(b=X(h,E,r)),b=G(h,b,E,c),c?(h.ifModified&&(x=E.getResponseHeader("Last-Modified"),x&&(ce.lastModified[o]=x),x=E.getResponseHeader("etag"),x&&(ce.etag[o]=x)),204===e||"HEAD"===h.type?T="nocontent":304===e?T="notmodified":(T=b.state,f=b.data,m=b.error,c=!m)):(m=T,!e&&T||(T="error",e<0&&(e=0))),E.status=e,E.statusText=(t||T)+"",c?v.resolveWith(p,[f,T,E]):v.rejectWith(p,[E,T,m]),E.statusCode(y),y=void 0,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[E,h,c?f:m]),g.fireWith(p,[E,T]),l&&(d.trigger("ajaxComplete",[E,h]),--ce.active||ce.event.trigger("ajaxStop")))}"object"==typeof e&&(t=e,e=void 0),t=t||{};var i,o,s,a,u,c,l,f,h=ce.ajaxSetup({},t),p=h.context||h,d=h.context&&(p.nodeType||p.jquery)?ce(p):ce.event,v=ce.Deferred(),g=ce.Callbacks("once memory"),y=h.statusCode||{},m={},b={},w=0,x="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(2===w){if(!a)for(a={};t=At.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===w?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return w||(e=b[n]=b[n]||e,m[e]=t),this},overrideMimeType:function(e){return w||(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(w<2)for(t in e)y[t]=[y[t],e[t]];else E.always(e[E.status]);return this},abort:function(e){var t=e||x;return i&&i.abort(t),r(0,t),this}};if(v.promise(E).complete=g.add,E.success=E.done,E.error=E.fail,h.url=((e||h.url||wt.href)+"").replace(Tt,"").replace(kt,wt.protocol+"//"),h.type=t.method||t.type||h.method||h.type,h.dataTypes=ce.trim(h.dataType||"*").toLowerCase().match(Ae)||[""],null==h.crossDomain){c=Z.createElement("a");try{c.href=h.url,c.href=c.href,h.crossDomain=Rt.protocol+"//"+Rt.host!=c.protocol+"//"+c.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=ce.param(h.data,h.traditional)),V(jt,h,t,E),2===w)return E;l=ce.event&&h.global,l&&0===ce.active++&&ce.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Ct.test(h.type),o=h.url,h.hasContent||(h.data&&(o=h.url+=(Et.test(o)?"&":"?")+h.data,delete h.data),h.cache===!1&&(h.url=St.test(o)?o.replace(St,"$1_="+xt++):o+(Et.test(o)?"&":"?")+"_="+xt++)),h.ifModified&&(ce.lastModified[o]&&E.setRequestHeader("If-Modified-Since",ce.lastModified[o]),ce.etag[o]&&E.setRequestHeader("If-None-Match",ce.etag[o])),(h.data&&h.hasContent&&h.contentType!==!1||t.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Nt+"; q=0.01":""):h.accepts["*"]);for(f in h.headers)E.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(h.beforeSend.call(p,E,h)===!1||2===w))return E.abort();x="abort";for(f in{success:1,error:1,complete:1})E[f](h[f]);if(i=V(Ot,h,t,E)){if(E.readyState=1,l&&d.trigger("ajaxSend",[E,h]),2===w)return E;h.async&&h.timeout>0&&(u=n.setTimeout(function(){E.abort("timeout")},h.timeout));try{w=1,i.send(m,r)}catch(e){if(!(w<2))throw e;r(-1,e)}}else r(-1,"No Transport");return E},getJSON:function(e,t,n){return ce.get(e,t,n,"json")},getScript:function(e,t){return ce.get(e,void 0,t,"script")}}),ce.each(["get","post"],function(e,t){ce[t]=function(e,n,r,i){return ce.isFunction(n)&&(i=i||r,r=n,n=void 0),ce.ajax(ce.extend({url:e,type:t,dataType:i,data:n,success:r},ce.isPlainObject(e)&&e))}}),ce._evalUrl=function(e){return ce.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},ce.fn.extend({wrapAll:function(e){var t;return ce.isFunction(e)?this.each(function(t){ce(this).wrapAll(e.call(this,t))}):(this[0]&&(t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return ce.isFunction(e)?this.each(function(t){ce(this).wrapInner(e.call(this,t))}):this.each(function(){var t=ce(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=ce.isFunction(e);return this.each(function(n){ce(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){ce.nodeName(this,"body")||ce(this).replaceWith(this.childNodes)}).end()}}),ce.expr.filters.hidden=function(e){return!ce.expr.filters.visible(e)},ce.expr.filters.visible=function(e){return e.offsetWidth>0||e.offsetHeight>0||e.getClientRects().length>0};var Dt=/%20/g,Mt=/\[\]$/,Lt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,qt=/^(?:input|select|textarea|keygen)/i;ce.param=function(e,t){var n,r=[],i=function(e,t){t=ce.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=ce.ajaxSettings&&ce.ajaxSettings.traditional),ce.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Y(n,e[n],t,i);return r.join("&").replace(Dt,"+")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,"elements");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(":disabled")&&qt.test(this.nodeName)&&!It.test(e)&&(this.checked||!qe.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:ce.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,"\r\n")}}):{name:t.name,value:n.replace(Lt,"\r\n")}}).get()}}),ce.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(e){}};var Ft={0:200,1223:204},Pt=ce.ajaxSettings.xhr();ae.cors=!!Pt&&"withCredentials"in Pt,ae.ajax=Pt=!!Pt,ce.ajaxTransport(function(e){var t,r;if(ae.cors||Pt&&!e.crossDomain)return{send:function(i,o){var s,a=e.xhr();if(a.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(s in e.xhrFields)a[s]=e.xhrFields[s];e.mimeType&&a.overrideMimeType&&a.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(s in i)a.setRequestHeader(s,i[s]);t=function(e){return function(){t&&(t=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?o(0,"error"):o(a.status,a.statusText):o(Ft[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=t(),r=a.onerror=t("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&n.setTimeout(function(){t&&r()})},t=t("abort");try{a.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}}),ce.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),ce.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=ce("
          ================================================ FILE: examples/modal/main.js ================================================ import Woowahan from '../../index'; import HelloView from './hello-view'; import ModalViewNormal from './view/modal-view-normal/modal-view-normal'; import ModalViewBootstrap from './view/modal-view-bootstrap/modal-view-bootstrap' global.$ = global.jQuery = Woowahan.$; var app = new Woowahan(); app.use(Woowahan.Component('ModalComponentNormal', ModalViewNormal)); app.use(Woowahan.Component('ModalComponentBootstrap', ModalViewBootstrap)); app.start({ url: '/', container: '#content', view: HelloView }); ================================================ FILE: examples/modal/package.json ================================================ { "name": "helloworld", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "build": "gulp build", "demo-server": "node ./node_modules/http-server/bin/http-server dist" }, "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^6.0.1", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-sass": "^2.3.1", "gulp-size": "^1.2.0", "gulp-stylus": "^2.0.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.3", "handlebars-loader": "^1.1.4", "http-server": "^0.9.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "request": "^2.72.0", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^2.1.1" }, "dependencies": { "bootstrap": "^3.3.7", "lodash": "^4.17.0" } } ================================================ FILE: examples/modal/sass/main.scss ================================================ html, body { margin: 0; padding: 0; } .modal-overlay { position:fixed; top:0; left:0; right:0; bottom:0; background:#000; opacity:0; -webkit-transition:opacity 0.3s ease; transition:opacity 0.3s ease; &.on { opacity:0.7; } } .modal-box { overflow-y:scroll; position:absolute; top:50%; left:50%; width:80%; max-height:80%; background:#fff; -webkit-transform:translate(-50%,-75%); transform:translate(-50%,-75%); z-index:1000; -webkit-transition:transform 0.3s ease, opacity 0.3s ease; transition:transform 0.3s ease, opacity 0.3s ease; opacity:0; &.on { -webkit-transform:translate(-50%,-50%); transform:translate(-50%,-50%); opacity:1; } } .modal-box.sticky { top:0; -webkit-transform:translate(-50%,-100%); transform:translate(-50%,-100%); &.on { -webkit-transform:translate(-50%,0); transform:translate(-50%,0); } } .modal-box.slidein { left:100%; -webkit-transform:translate(0,-50%); transform:translate(0,-50%); -webkit-transition: left 0.3s ease; transition: left 0.3s ease; &.on { left:50%; -webkit-transform:translate(-50%,-50%); transform:translate(-50%,-50%); } } .modal-box.slideup { -webkit-transform:translate(-50%,100%); transform:translate(-50%,100%); &.on { -webkit-transform:translate(-50%,-50%); transform:translate(-50%,-50%); } } .modal-box.scale { -webkit-transform:translate(-50%,-50%) scale(0.5); transform:translate(-50%,-50%) scale(0.5); -webkit-transition:transform 0.3s ease; transition:transform 0.3s ease; &.on { -webkit-transform:translate(-50%,-50%) scale(1); transform:translate(-50%,-50%) scale(1); } } ================================================ FILE: examples/modal/view/modal-view-bootstrap/modal-view-bootstrap.hbs ================================================ ================================================ FILE: examples/modal/view/modal-view-bootstrap/modal-view-bootstrap.js ================================================ import Woowahan from '../../../../index'; import Template from './modal-view-bootstrap.hbs'; export default Woowahan.View.create('ModalViewBootstrap', { tagName: 'div', template: Template, events: { 'click #tabs a': 'onClickTab', 'click .btn-close': 'onClickClose' }, initialize() { this.modal = null; this.super(); }, show() { if (!!this.modal) return; this.modal = this.$el.find('#myModal'); this.modal.modal('show'); this.modal.on('hidden.bs.modal', _.bind(this.onHideModal, this)); }, onClickTab(event) { $(event.currentTarget).tab('show'); return false; }, onClickClose() { this.modal.modal('hide'); return false; }, onHideModal() { if (!!this.modal) { this.modal.off('hidden.bs.modal', '**'); this.modal = null; this.dispatch(Woowahan.Event.create('closed')); } } }); ================================================ FILE: examples/modal/view/modal-view-normal/modal-view-normal.hbs ================================================ ================================================ FILE: examples/modal/view/modal-view-normal/modal-view-normal.js ================================================ import Woowahan from '../../../../index'; import Template from './modal-view-normal.hbs'; export default Woowahan.View.create('ModalViewNormal', { template: Template, events: { 'click #btn-close': 'onClickClose', 'click #btn-update': 'onUpdateCount', 'click .modal-overlay': 'onClickClose' }, initialize(data) { data.count = 0; this.setModel(data); this.super(); }, viewWillMount(renderData) { renderData.count = renderData.count + ' 번 업데이트'; return renderData; }, viewDidMount() { setTimeout(function() { $('.modal-overlay, .modal-box').addClass('on'); }, 300); }, onUpdateCount() { const count = this.getModel('count'); this.setModel({ count: count + 1 }); }, onClickClose() { this.dispatch(Woowahan.Event.create('closed')); } }); ================================================ FILE: examples/modal/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; module.exports = { debug : true, devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.hbs$/, exclude: /node_modules/, loader: 'handlebars-loader'} ] } }; ================================================ FILE: examples/plugin/.babelrc ================================================ { "presets": ["es2015"] } ================================================ FILE: examples/plugin/gulpfile.js ================================================ var path = require('path'); var _ = require('lodash'); var gulp = require('gulp'); var del = require('del'); var $ = require('gulp-load-plugins')({ pattern: '*' }); var webpackConfig = require('./webpack.config.js'); gulp.task('scripts', () => { return gulp.src(webpackConfig.entry) .pipe($.webpackStream(webpackConfig)) .pipe(gulp.dest(path.resolve(__dirname, 'dist', 'js'))) .pipe($.size({ title : 'js' })) .pipe($.size()); }); gulp.task('html', () => { return gulp.src(path.resolve(__dirname, 'index.html')) .pipe(gulp.dest(path.resolve(__dirname, 'dist'))) .pipe($.size({ title : 'html' })); }); gulp.task('clean', (cb) => { del(['dist'], cb); }); gulp.task('default', ['clean'], () => gulp.start('build')); gulp.task('build', ['clean'], () => gulp.start(['scripts', 'html'])); ================================================ FILE: examples/plugin/hello-view.js ================================================ import Woowahan from '../../index'; export default Woowahan.View.create('Hello', { template: '

          Hello, WoowahanJs

          ' + '
            ' + '
              ', initialize() { this.setModel({ listData: [ { label: 'test1', value: 'val1'}, { label: 'test2', value: 'val2'}, { label: 'test3', value: 'val3'}, { label: 'test4', value: 'val4'}, { label: 'test5', value: 'val5'}, { label: 'test6', value: 'val6'} ] }); this.super(); } }); ================================================ FILE: examples/plugin/index.html ================================================ WoowahanJS
              ================================================ FILE: examples/plugin/main.js ================================================ import Woowahan from '../../index'; import HelloView from './hello-view'; import ListPlugin from './plugin/list'; global.$ = global.jQuery = Woowahan.$; var app = new Woowahan(); app.use(Woowahan.Plugin('list', ListPlugin)); app.start({ url: '/', container: '#content', view: HelloView }); ================================================ FILE: examples/plugin/package.json ================================================ { "name": "helloworld", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "build": "gulp build", "demo-server": "node ./node_modules/http-server/bin/http-server dist" }, "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^6.0.1", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-sass": "^2.3.1", "gulp-size": "^1.2.0", "gulp-stylus": "^2.0.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.3", "handlebars-loader": "^1.1.4", "http-server": "^0.9.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "request": "^2.72.0", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^2.1.1" }, "dependencies": {} } ================================================ FILE: examples/plugin/plugin/list.js ================================================ module.exports = function(element, value) { let domStr = ''; for (const item of value) { domStr += `
            • ${item.label}
            • `; } $(element).html(domStr); }; ================================================ FILE: examples/plugin/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; module.exports = { debug : true, devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' } ] } }; ================================================ FILE: examples/popup/.babelrc ================================================ { "presets": ["es2015"] } ================================================ FILE: examples/popup/gulpfile.js ================================================ var path = require('path'); var _ = require('lodash'); var gulp = require('gulp'); var del = require('del'); var $ = require('gulp-load-plugins')({ pattern: '*' }); var webpackConfig = require('./webpack.config.js'); gulp.task('scripts', () => { return gulp.src(webpackConfig.entry) .pipe($.webpackStream(webpackConfig)) .pipe(gulp.dest(path.resolve(__dirname, 'dist', 'js'))) .pipe($.size({ title : 'js' })) .pipe($.size()); }); gulp.task('html', () => { return gulp.src(path.resolve(__dirname, 'index.html')) .pipe(gulp.dest(path.resolve(__dirname, 'dist'))) .pipe($.size({ title : 'html' })); }); gulp.task('clean', (cb) => { del(['dist'], cb); }); // TODO: style을 Woowahan 내재화 gulp.task('styles', () => { gulp.src('scss/**/*.scss') .pipe($.sass().on('error', $.sass.logError)) .pipe(gulp.dest(path.resolve(__dirname, 'dist', 'css'))); }); gulp.task('default', ['clean'], () => gulp.start('build')); gulp.task('build', ['clean'], () => gulp.start(['scripts', 'styles', 'html'])); ================================================ FILE: examples/popup/index.html ================================================ WoowahanJS
              ================================================ FILE: examples/popup/main.js ================================================ import Woowahan from '../../index'; import { MainLayout } from './view/layout/main-layout'; import { BaseView } from './view/component'; import Debug from 'debug'; global.$ = global.jQuery = Woowahan.$; Debug.enable('*'); var app = new Woowahan(); app.use(Woowahan.Layout('#content', MainLayout)); app.start([ { url: '/', container: '#mainContent', view: BaseView, layout: 'MainLayout' } ]); ================================================ FILE: examples/popup/package.json ================================================ { "name": "transition", "version": "1.0.0", "description": "transition example", "main": "main.js", "scripts": { "build": "gulp build", "demo-server": "node ./node_modules/http-server/bin/http-server dist" }, "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^6.0.1", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-sass": "^2.3.1", "gulp-size": "^1.2.0", "gulp-stylus": "^2.0.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.3", "handlebars-loader": "^1.1.4", "http-server": "^0.9.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "request": "^2.72.0", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^2.1.1" }, "dependencies": {} } ================================================ FILE: examples/popup/scss/main.scss ================================================ html, body { margin: 0; padding: 0; } .modal-overlay { position:fixed; top:0; left:0; right:0; bottom:0; background:#000; opacity:0.7; } .modal-box { overflow-y:scroll; display:block; position:absolute; top:50%; left:50%; width:80%; max-height:80%; background:#fff; -webkit-transform:translate(-50%,-50%); transform:translate(-50%,-50%); z-index:1000; } ================================================ FILE: examples/popup/view/component/alert-view.hbs ================================================

              ================================================ FILE: examples/popup/view/component/alert-view.js ================================================ import Woowahan from '../../../../index'; import Template from './alert-view.hbs'; export const AlertView = Woowahan.PopupView.create('AlertView', { template: Template }); ================================================ FILE: examples/popup/view/component/base-view.hbs ================================================

              this is base view

              팝업에서 텍스트를 입력하세요.

              ================================================ FILE: examples/popup/view/component/base-view.js ================================================ import Woowahan from '../../../../index'; import Template from './base-view.hbs'; import { PopupView } from './popup-view'; export const BaseView = Woowahan.View.create('BaseView', { template: Template, events: { 'click button[data-ref=btnPopup]': 'onClickPopup' }, onClickPopup() { this.refs.txtResult.innerText = '텍스트를 입력하세요.'; this.addPopup(PopupView, { title: '입력해 주세요.' }, function(popupData = {}) { if (popupData.action === 'submit') { const data = popupData.data; const result = Object.keys(data).reduce((prev, key) => ((!!data[key] ? prev.push(data[key]) : prev), prev), []); if (!!result.length) { this.refs.txtResult.innerText = `입력된 결과는 ${result.join(', ')}입니다.`; } else { this.refs.txtResult.innerText = '입력된 텍스트가 없습니다.'; } } else { this.refs.txtResult.innerText = '입력이 취소되었습니다.'; } }); } }); ================================================ FILE: examples/popup/view/component/index.js ================================================ export * from './base-view'; export * from './popup-view'; ================================================ FILE: examples/popup/view/component/popup-view.hbs ================================================
              ================================================ FILE: examples/popup/view/component/popup-view.js ================================================ import Woowahan from '../../../../index'; import Template from './popup-view.hbs'; import { AlertView } from './alert-view'; export const PopupView = Woowahan.PopupView.create('PopupView', { template: Template, events: { 'click button[data-ref=btnCancel]': 'onClickCancel', '@submit form[name=popup-form]': 'onSubmitForm' }, viewDidMount($el) { $el.css({ width: 420, height: 80, overflow: 'hidden' }); }, onSubmitForm(data) { if (!data.txt0 || !data.txt1 || !data.txt2) { this.addPopup(AlertView, { _id: 'alert', css: { width: '300px', height: '200px' }, title: '경고', desc: '입력해주세요.', buttons: { 'button[data-ref=btnClose]': function() { this.closePopup(); return false; } } }); return false; } this.closePopup({ action: 'submit', data }); return false; }, onClickCancel() { this.closePopup(); return false; }, onOverlayClick(event) { console.log(event); } }); ================================================ FILE: examples/popup/view/layout/main-layout.hbs ================================================

              This is MainLayout

              ================================================ FILE: examples/popup/view/layout/main-layout.js ================================================ import Woowahan from '../../../../index'; import Template from './main-layout.hbs'; export const MainLayout = Woowahan.View.create('MainLayout', { template: Template, }); ================================================ FILE: examples/popup/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; module.exports = { debug : true, devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.hbs$/, exclude: /node_modules/, loader: 'handlebars-loader'} ] } }; ================================================ FILE: examples/route/.babelrc ================================================ { "presets": ["es2015"] } ================================================ FILE: examples/route/action/index.js ================================================ export const DISPATCH_ACTION = 'DISPATCH_ACTION'; ================================================ FILE: examples/route/gulpfile.js ================================================ var path = require('path'); var _ = require('lodash'); var gulp = require('gulp'); var del = require('del'); var $ = require('gulp-load-plugins')({ pattern: '*' }); var webpackConfig = require('./webpack.config.js'); gulp.task('scripts', () => { return gulp.src(webpackConfig.entry) .pipe($.webpackStream(webpackConfig)) .pipe(gulp.dest(path.resolve(__dirname, 'dist', 'js'))) .pipe($.size({ title : 'js' })) .pipe($.size()); }); gulp.task('styles', () => { gulp.src('sass/**/*.scss') .pipe($.sass().on('error', $.sass.logError)) .pipe(gulp.dest(path.resolve(__dirname, 'dist', 'css'))); }); gulp.task('html', () => { return gulp.src(path.resolve(__dirname, 'index.html')) .pipe(gulp.dest(path.resolve(__dirname, 'dist'))) .pipe($.size({ title : 'html' })); }); gulp.task('clean', (cb) => { del(['dist'], cb); }); gulp.task('default', ['clean'], () => gulp.start('build')); gulp.task('build', ['clean'], () => gulp.start(['scripts', 'styles', 'html'])); ================================================ FILE: examples/route/index.html ================================================ WoowahanJS
              ================================================ FILE: examples/route/main.js ================================================ import Woowahan from '../../index'; global.$ = global.jQuery = Woowahan.$; global.log = function(log, color) { console.log(`%c${log}`, `color: ${color}`); }; import { MainView, LayoutView1, LayoutView2, LayoutView3, MainView1, MainView2, MainView3, ContentView1, ContentView2, ContentView3, SubContentView1, SubContentView2 } from './view/'; import { DISPATCH_ACTION } from './action'; import { AppMiddlewarePre, AppMiddleware, ViewMiddleware, ReducerMiddlewarePre, ReducerMiddleware, RouterMiddlewarePre, RouterMiddleware } from './middleware'; const app = new Woowahan(); app.set(AppMiddlewarePre); app.set(AppMiddleware, 'test'); app.set(ViewMiddleware, 'test'); app.set(ReducerMiddlewarePre); app.set(ReducerMiddleware, 'test'); app.set(RouterMiddlewarePre); app.set(RouterMiddleware, 'test'); /* layout 생성 & 등록 */ app.use(Woowahan.Layout('.wrap', LayoutView1)); app.use(Woowahan.Layout('.wrap', LayoutView2)); app.use(Woowahan.Layout('.wrap', LayoutView3, { update: false })); app.use(Woowahan.Store.create({ test: 'test' })); app.use(Woowahan.Reducer.create(DISPATCH_ACTION, function() { this.onSuccess = function(res) { this.finish(res); }; this.getData('https://jsonplaceholder.typicode.com/posts'); })); /* 사이트맵 디자인 */ const siteDesign = [ { url: '/', view: MainView, container: '.wrap' }, { url: '/layout1', view: MainView1, container: '#content', layout: 'LayoutView1', routeName: 'Layout1', routeData: { route: 'good' }, pages: [ { url: 'content1', view: ContentView1, routeName: 'Layout1Content1', pages: [ { url: 'sub1', view: SubContentView1, routeName: 'Layout1Content1Sub1' }, { url: ':sub2', view: SubContentView2, routeName: 'Layout1Content1Sub2' } ] }, { url: 'content2', view: ContentView2, routeName: 'Layout1Content2', pages: [ { url: 'sub1', view: SubContentView1, routeName: 'Layout1Content2Sub1' }, { url: 'sub2', view: SubContentView2, routeName: 'Layout1Content2Sub2' } ] }, { url: 'content3', view: ContentView3, routeName: 'Layout1Content3', pages: [ { url: 'sub1', view: SubContentView1, routeName: 'Layout1Content3Sub1' }, { url: 'sub2', view: SubContentView2, routeName: 'Layout1Content3Sub2' } ] } ] }, { url: '/layout2', view: MainView2, container: '#content', layout: 'LayoutView2', routeName: 'Layout2', pages: [ { url: 'content1', view: ContentView1, routeName: 'Layout2Content1', pages: [ { url: 'sub1', view: SubContentView1, routeName: 'Layout2Content1Sub1' }, { url: 'sub2', view: SubContentView2, routeName: 'Layout2Content1Sub2' } ] }, { url: 'content2', view: ContentView2, routeName: 'Layout2Content2', pages: [ { url: 'sub1', view: SubContentView1, routeName: 'Layout2Content2Sub1' }, { url: 'sub2', view: SubContentView2, routeName: 'Layout2Content2Sub2' } ] }, { url: 'content3', view: ContentView3, routeName: 'Layout2Content3', pages: [ { url: 'sub1', view: SubContentView1, routeName: 'Layout2Content3Sub1' }, { url: 'sub2', view: SubContentView2, routeName: 'Layout2Content3Sub2' } ] } ] }, { url: '/layout3', view: MainView3, container: '#content', layout: 'LayoutView3', routeName: 'Layout3', pages: [ { url: 'content1', view: ContentView1, routeName: 'Layout3Content1', pages: [ { url: 'sub1', view: SubContentView1, routeName: 'Layout3Content1Sub1' }, { url: 'sub2', view: SubContentView2, routeName: 'Layout3Content1Sub2' } ] }, { url: 'content2', view: ContentView2, routeName: 'Layout3Content2', pages: [ { url: 'sub1', view: SubContentView1, routeName: 'Layout3Content2Sub1' }, { url: 'sub2', view: SubContentView2, routeName: 'Layout3Content2Sub2' } ] }, { url: 'content3', view: ContentView3, routeName: 'Layout3Content3', pages: [ { url: 'sub1', view: SubContentView1, routeName: 'Layout3Content3Sub1', empty: true }, { url: 'sub2', view: SubContentView2, routeName: 'Layout3Content3Sub2' } ] } ] }, ]; /* 사이트 옵션 */ const siteOption = { empty: page => { alert(`${page}는 없는 페이지!!`); } }; /* 웹앱 시작 */ app.start(siteDesign, siteOption); ================================================ FILE: examples/route/middleware/index.js ================================================ export const AppMiddlewarePre = function() { this.mwtype = 'app'; this.testVal = 'testVal'; this.before = function(app) { log('[AppMiddlewarePre] before called', 'red'); if (this.testVal !== 'testVal') throw new Error('AppMiddlewarePre before context error'); this.testVal = 'testVal2'; }; this.after = function(app) { log('[AppMiddlewarePre] after called', 'red'); if (this.testVal !== 'testVal2') throw new Error('AppMiddlewarePre after context error'); log(this.testVal, 'red'); app.setStates({ test: 'test' }); }; }; export const AppMiddleware = function(test) { this.mwtype = 'app'; if (test !== 'test') throw new Error('AppMiddleware 인자 에러'); this.before = function(app, next) { log('[AppMiddleware] before called', 'red'); if (typeof app !== 'object' || typeof next !== 'function') throw new Error('AppMiddleware before 인자 에러'); if (Backbone.History.started) throw new Error('AppMiddleware before 발동 시점 에러'); const state = app.getStates('test'); if (state !== 'test') throw new Error('AppMiddleware before app 인자 에러'); app.beforeTested = false; setTimeout(function() { app.beforeTested = true; next(); }, 1000); }; this.after = function(app, next) { log('[AppMiddleware] after called', 'red'); if (typeof app !== 'object' || typeof next !== 'function') throw new Error('AppMiddleware after 인자 에러'); if (!app.beforeTested) throw new Error('AppMiddleware after 발동 시점 에러'); next(); }; }; export const ViewMiddleware = function(test) { this.mwtype = 'view'; if (test !== 'test') throw new Error('ViewMiddleware 인자 에러'); this.before = function(view, next) { log('[ViewMiddleware] before called', 'orange'); if (typeof view !== 'object' || typeof next !== 'function') throw new Error('ViewMiddleware before 인자 에러'); next(); }; this.after = function(view, next) { log('[ViewMiddleware] after called', 'orange'); if (typeof view !== 'object' || typeof next !== 'function') throw new Error('ViewMiddleware after 인자 에러'); if (view.$el.html() === '') throw new Error('ViewMiddleware after 발동 시점 에러'); view.$el.append('

              ViewMiddleware add this text.

              '); next(); }; this.unmount = function(view, next) { log('[ViewMiddleware] unmount called', 'orange'); if (typeof view !== 'object' || typeof next !== 'function') throw new Error('ViewMiddleware unmout 인자 에러'); if (view.$el.html() === '') throw new Error('ViewMiddleware unmount 발동 시점 에러'); setTimeout(function() { if (!view || view.$el.html() === '') throw new Error('ViewMiddleware unmount 발동 시점 에러'); next(); }, 1000); }; }; export const ReducerMiddlewarePre = function() { this.mwtype = 'reducer'; this.before = function(settings) { log('[ReducerMiddlewarePre] before called', 'blue'); settings.timeout = 5000000; }; }; export const ReducerMiddleware = function(test) { this.mwtype = 'reducer'; if (test !== 'test') throw new Error('ReducerMiddleware 인자 에러'); this.before = function(settings, app, next) { log('[ReducerMiddleware] before called', 'blue'); if (typeof app !== 'object' || typeof next !== 'function') throw new Error('ReducerMiddleware before 인자 에러'); if (settings.timeout !== 5000000) throw new Error('ReducerMiddleware before 인자 에러'); next(); }; this.after = function(app, next) { log('[ReducerMiddleware] after called', 'blue'); if (typeof app !== 'object' || typeof next !== 'function') throw new Error('ReducerMiddleware after 인자 에러'); next(); }; }; export const RouterMiddlewarePre = function() { this.mwtype = 'router'; this.before = function(route, app) { if (route.empty) { alert('준비 중입니다.'); window.location.hash = app.getRouteTables()['Layout1'](); } log('[RouterMiddlewarePre] before called', 'green'); }; this.after = function(route, app) { log('[RouterMiddlewarePre] after called', 'green'); }; }; export const RouterMiddleware = function(test) { this.mwtype = 'router'; if (test !== 'test') throw new Error('RouterMiddleware 인자 에러'); this.before = function(route, app, next) { log('[RouterMiddleware] before called', 'green'); if (typeof app !== 'object' || typeof next !== 'function') throw new Error('RouterMiddleware before 인자 에러'); if (route.url === 'layout1' && route.routeData.route !== 'good') throw new Error('RouterMiddleware before 인자 에러'); next(); }; this.after = function(route, app, next) { log('[RouterMiddleware] after called', 'green'); if (typeof app !== 'object' || typeof next !== 'function') throw new Error('RouterMiddleware after 인자 에러'); next(); }; }; ================================================ FILE: examples/route/package.json ================================================ { "name": "route", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "build": "gulp build", "demo-server": "node ./node_modules/http-server/bin/http-server dist" }, "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^7.1.2", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-sass": "^2.3.1", "gulp-size": "^1.2.0", "gulp-stylus": "^2.0.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.5", "handlebars-loader": "^1.3.0", "http-server": "^0.9.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "request": "^2.72.0", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^4.0.0" } } ================================================ FILE: examples/route/sass/main.scss ================================================ html, body { margin: 0; padding: 0; height: 100%; } .rect { width: 100%; height: 100%; } .white { @extend .rect; background-color: white; }, .red { @extend .rect; background-color: red; }, .blue { @extend .rect; background-color: blue; } ================================================ FILE: examples/route/template/main.hbs ================================================

              메인 페이지

              ================================================ FILE: examples/route/template/sub1.hbs ================================================

              서브 1 페이지

              ================================================ FILE: examples/route/template/sub2-2.hbs ================================================

              서브 2-2 컨텐츠

              ================================================ FILE: examples/route/template/sub2.hbs ================================================

              서브 2 페이지

              ================================================ FILE: examples/route/view/child.js ================================================ import Woowahan from '../../../index'; import SubChildView from './sub-child'; export default Woowahan.View.create('ChildView', { template: `

              Child View

              `, viewDidMount() { this.addView('#sub-child-container', SubChildView); } }); ================================================ FILE: examples/route/view/content1.hbs ================================================

              콘텐츠 1

              첫번째 콘텐츠입니다.

              {{text}}

              ================================================ FILE: examples/route/view/content1.js ================================================ import Woowahan from '../../../index'; import Template from './content1.hbs'; import ChildView from './child'; export default Woowahan.View.create('ContentView1', { className: 'big', template: Template, events: { 'click': 'onClick' }, initialize() { this.setModel({ text: 'init' }); this.super(); }, viewWillMount(renderData) { renderData.text += ' & mount'; return renderData; }, viewDidMount(el) { el.find('p').css('color', 'red'); this.addView('#child-container', ChildView); }, viewWillUnmount() { console.log('content1 unmount'); }, onClick() { // alert('click'); this.updateView('#child-container', ChildView); } }); ================================================ FILE: examples/route/view/content2.hbs ================================================

              콘텐츠 2

              두번째 콘텐츠입니다.

              ================================================ FILE: examples/route/view/content2.js ================================================ import Woowahan from '../../../index'; import Template from './content2.hbs'; import { DISPATCH_ACTION } from '../action'; export default Woowahan.View.create('ContentView2', { template: Template, events: { 'click .btn-dispatch': 'onClickDispatch' }, onClickDispatch() { this.dispatch(Woowahan.Action.create(DISPATCH_ACTION), function(data) { console.log(data); }); } }); ================================================ FILE: examples/route/view/content3.hbs ================================================

              콘텐츠 3

              세번째 콘텐츠입니다.

              ================================================ FILE: examples/route/view/content3.js ================================================ import Woowahan from '../../../index'; import Template from './content3.hbs'; export default Woowahan.View.create('ContentView3', { template: Template, initialize() { this.super(); } }); ================================================ FILE: examples/route/view/index.js ================================================ import LayoutView1 from './layout1'; import LayoutView2 from './layout2'; import LayoutView3 from './layout3'; import MainView from './main'; import MainView1 from './main1'; import MainView2 from './main2'; import MainView3 from './main3'; import ContentView1 from './content1'; import ContentView2 from './content2'; import ContentView3 from './content3'; import SubContentView1 from './sub-content1'; import SubContentView2 from './sub-content2'; export { LayoutView1, LayoutView2, LayoutView3, MainView, MainView1, MainView2, MainView3, ContentView1, ContentView2, ContentView3, SubContentView1, SubContentView2 }; ================================================ FILE: examples/route/view/layout1.hbs ================================================

              레이아웃 뷰 1

              {{#with links}} {{/with}}
              ================================================ FILE: examples/route/view/layout1.js ================================================ import Woowahan from '../../../index'; import Template from './layout1.hbs'; export default Woowahan.View.create('LayoutView1', { template: Template, viewWillMount(renderData) { renderData.links = this.getLinks(this.getRouteTables()); return renderData; }, getLinks(routeTables) { return Object.keys(routeTables).reduce((a, b) => (a[`${b}Link`] = `#${routeTables[b]()}`, a), {}); } }); ================================================ FILE: examples/route/view/layout2.hbs ================================================

              레이아웃 뷰 2

              {{#with links}} {{/with}}
              ================================================ FILE: examples/route/view/layout2.js ================================================ import Woowahan from '../../../index'; import Template from './layout2.hbs'; export default Woowahan.View.create('LayoutView2', { template: Template, initialize() { this.super(); }, viewWillMount(renderData) { renderData.links = this.getLinks(this.getRouteTables()); return renderData; }, getLinks(routeTables) { return Object.keys(routeTables).reduce((a, b) => (a[`${b}Link`] = `#${routeTables[b]()}`, a), {}); } }); ================================================ FILE: examples/route/view/layout3.hbs ================================================

              레이아웃 뷰 3

              {{#with links}} {{/with}}
              ================================================ FILE: examples/route/view/layout3.js ================================================ import Woowahan from '../../../index'; import Template from './layout3.hbs'; export default Woowahan.View.create('LayoutView3', { template: Template, initialize() { this.super(); }, viewWillMount(renderData) { renderData.links = this.getLinks(this.getRouteTables()); return renderData; }, getLinks(routeTables) { return Object.keys(routeTables).reduce((a, b) => (a[`${b}Link`] = `#${routeTables[b]()}`, a), {}); } }); ================================================ FILE: examples/route/view/main.hbs ================================================

              메인 뷰

              {{#with links}} {{/with}} ================================================ FILE: examples/route/view/main.js ================================================ import Woowahan from '../../../index'; import Template from './main.hbs'; export default Woowahan.View.create('MainView', { template: Template, initialize() { this.super(); }, viewWillMount(renderData) { renderData.links = this.getLinks(this.getRouteTables()); return renderData; }, getLinks(routeTables) { return Object.keys(routeTables).reduce((a, b) => (a[`${b}Link`] = `#${routeTables[b]()}`, a), {}); } }); ================================================ FILE: examples/route/view/main1.hbs ================================================

              메인 1

              첫번째 레이아웃 메인입니다.

              {{#with links}} {{/with}} ================================================ FILE: examples/route/view/main1.js ================================================ import Woowahan from '../../../index'; import Template from './main1.hbs'; export default Woowahan.View.create('MainView1', { template: Template, initialize() { this.setModel({ src: 'efeeefe' }); this.super(); }, viewWillMount(renderData) { renderData.links = this.getLinks(this.getRouteTables()); return renderData; }, getLinks(routeTables) { return Object.keys(routeTables).reduce((a, b) => (a[`${b}Link`] = `#${routeTables[b]()}`, a), {}); } }); ================================================ FILE: examples/route/view/main2.hbs ================================================

              메인 2

              두번째 레이아웃 메인입니다.

              {{#with links}} {{/with}} ================================================ FILE: examples/route/view/main2.js ================================================ import Woowahan from '../../../index'; import Template from './main2.hbs'; export default Woowahan.View.create('MainView2', { template: Template, viewWillMount(renderData) { renderData.links = this.getLinks(this.getRouteTables()); return renderData; }, getLinks(routeTables) { return Object.keys(routeTables).reduce((a, b) => (a[`${b}Link`] = `#${routeTables[b]()}`, a), {}); } }); ================================================ FILE: examples/route/view/main3.hbs ================================================

              메인 3

              세번째 레이아웃 메인입니다.

              {{#with links}} {{/with}} ================================================ FILE: examples/route/view/main3.js ================================================ import Woowahan from '../../../index'; import Template from './main3.hbs'; export default Woowahan.View.create('MainView1', { template: Template, viewWillMount(renderData) { renderData.links = this.getLinks(this.getRouteTables()); return renderData; }, getLinks(routeTables) { return Object.keys(routeTables).reduce((a, b) => (a[`${b}Link`] = `#${routeTables[b]()}`, a), {}); } }); ================================================ FILE: examples/route/view/sub-child.js ================================================ import Woowahan from '../../../index'; export default Woowahan.View.create('ChildView', { template: `

              Sub Child View

              `, events: { 'click #btn-test': 'onClickTest' }, viewDidMount() { console.log('did mount'); }, onClickTest() { console.log('click test'); } }); ================================================ FILE: examples/route/view/sub-content1.hbs ================================================

              서브 콘텐츠 1

              첫번째 서브 콘텐츠입니다.

              ================================================ FILE: examples/route/view/sub-content1.js ================================================ import Woowahan from '../../../index'; import Template from './sub-content1.hbs'; export default Woowahan.View.create('SubContentView1', { template: Template }); ================================================ FILE: examples/route/view/sub-content2.hbs ================================================

              서브 콘텐츠 2

              두번째 서브 콘텐츠입니다.

              ================================================ FILE: examples/route/view/sub-content2.js ================================================ import Woowahan from '../../../index'; import Template from './sub-content2.hbs'; export default Woowahan.View.create('SubContentView2', { template: Template, events: { 'click .btn-update': 'onClickUpdate' }, onClickUpdate() { this.updateView(); } }); ================================================ FILE: examples/route/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; module.exports = { devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.hbs$/, loader: 'handlebars-loader' } ] } }; ================================================ FILE: examples/schema/.babelrc ================================================ { "presets": ["es2015"] } ================================================ FILE: examples/schema/gulpfile.js ================================================ var path = require('path'); var _ = require('lodash'); var gulp = require('gulp'); var del = require('del'); var $ = require('gulp-load-plugins')({ pattern: '*' }); var webpackConfig = require('./webpack.config.js'); gulp.task('scripts', () => { return gulp.src(webpackConfig.entry) .pipe($.webpackStream(webpackConfig)) .pipe(gulp.dest(path.resolve(__dirname, 'dist', 'js'))) .pipe($.size({ title : 'js' })) .pipe($.size()); }); gulp.task('html', () => { return gulp.src(path.resolve(__dirname, 'index.html')) .pipe(gulp.dest(path.resolve(__dirname, 'dist'))) .pipe($.size({ title : 'html' })); }); gulp.task('lib', () => { gulp.src(['node_modules/bootstrap/dist/**/*']) .pipe($.size({ title : 'lib:js/css folder structure' })) .pipe(gulp.dest(path.resolve(__dirname, 'dist'))); }); gulp.task('clean', (cb) => { del(['dist'], cb); }); gulp.task('default', ['clean'], () => gulp.start('build')); gulp.task('build', ['clean'], () => gulp.start(['scripts', 'html', 'lib'])); ================================================ FILE: examples/schema/hello-view.js ================================================ import Woowahan from '../../index'; import Template from './schema.hbs'; export default Woowahan.View.create('Index', { className: 'container', template: Template, events: { '@submit form': 'onSave(#id, #name, #email)' }, initialize() { this.super(); }, viewWillMount(renderData) { this.log('will mount'); return _.assign({}, renderData); }, viewDidMount($el) { this.log('did mount'); }, onSave(id, name, email, inputs) { this.dispatch(Woowahan.Action.create('save-user-profile', { id: inputs['id'], name: inputs['name'], email: inputs['email'], valid: true }), this.onCompleteSave); return false; }, onCompleteSave(data) { alert('저장 완료'); } }); ================================================ FILE: examples/schema/index.html ================================================ WoowahanJS
              ================================================ FILE: examples/schema/main.js ================================================ /*global _*/ import Woowahan from '../../index'; import HelloView from './hello-view'; import _ from 'underscore'; global.$ = global.jQuery = Woowahan.$; global._ = _; var app = new Woowahan(); var joinSchema = Woowahan.Schema.create('JoinSchema', { id: Woowahan.Types.String({ required: true, min: 4, max: 20 }), name: Woowahan.Types.String({ required: true, max: 30 }), email: Woowahan.Types.Email({ required: true }), memo: Woowahan.Types.String(), valid: Woowahan.Types.Boolean({ required: true }) }); var myTask = Woowahan.Reducer.create('save-user-profile', joinSchema, function (data) { this.finish(data); }); app.use(myTask); app.on('error', errors => { alert(_(errors).map(o => o.message).join('\n')); }); app.start({ url: '', container: '#app', view: HelloView }); ================================================ FILE: examples/schema/package.json ================================================ { "name": "schema", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "build": "gulp build", "demo-server": "node ./node_modules/http-server/bin/http-server dist" }, "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^6.0.1", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-size": "^1.2.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.3", "handlebars-loader": "^1.1.4", "http-server": "^0.9.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^2.1.1" }, "dependencies": { "bootstrap": "^3.3.6", "underscore": "^1.8.3" } } ================================================ FILE: examples/schema/schema.hbs ================================================

              Schema Example

              ================================================ FILE: examples/schema/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; module.exports = { debug : true, devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.hbs$/, exclude: /node_modules/, loader: 'handlebars-loader'} ] } }; ================================================ FILE: examples/timer/index.html ================================================ WoowahanJS
              ================================================ FILE: examples/timer/js/main.js ================================================ var app = new Woowahan(); window.$ = window.jQuery = Woowahan.$; var HelloView = Woowahan.View.create('HelloView', { template: Handlebars.compile( '
              '+ '
              ' ), events: { 'click .btn.toggle': 'onTimerToggle' }, initialize() { this.startTime = 0; this.updateHandle = null; this.setModel({ time: this.startTime, buttonLabel: 'START' }); this.super(); }, viewWillUnmount() { this.updateHandle && clearInterval(this.updateHandle); }, onTimerToggle() { if (this.updateHandle) this.stopTimer(); else this.startTimer(); }, stopTimer() { clearInterval(this.updateHandle); this.updateHandle = null; this.setModel({ buttonLabel: 'START' }); }, startTimer() { this.setModel({ buttonLabel: 'STOP' }); this.startTime = Date.now(); this.updateHandle = setInterval(() => { this.setModel({ time: (Date.now() - this.startTime) / 1000 }); }, 1000/30); } }); app.start({ url: '/', container: '#app', view: HelloView }); ================================================ FILE: examples/timer/js/woowahan.js ================================================ !function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){"use strict";e.exports=n(1)},function(e,t,n){(function(t){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};i(this,e),this.reducers=t.reducers||{},this.components=t.components||{},this.middlewares={app:{before:[],after:[]},router:{before:[],after:[]},reducer:{before:[],after:[]},view:{before:[],after:[],unmount:[]}},this.store=null,this.queue=[],this.actionObject={},this.queuemonitor=null,y=this,this.enableQueue()}return s(e,[{key:"enableQueue",value:function(){this.queuemonitor=setInterval(this.queuing.bind(this),v)}},{key:"disableQueue",value:function(){this.queuemonitor=clearInterval(this.queuemonitor)}},{key:"addAction",value:function(e){this.actionObject[e]=Date.now(),1===this.numberOfWorkAction()&&this.trigger("start")}},{key:"removeAction",value:function(e){delete this.actionObject[e],0===this.numberOfWorkAction()&&this.trigger("finish")}},{key:"addError",value:function(e){this.trigger("error",e)}},{key:"queuing",value:function(){this.disableQueue();var e=this.queue.shift();if(e){var t=this.reducers[e.action.type];if(!t)throw this.enableQueue(),new Error("The unregistered reducer. Please check the type of action, if there is a written reducer use after registration.");if(e.subscriber=e.subscriber||function(){},"function"!=typeof e.subscriber)throw this.enableQueue(),new Error("The listener must be a function. If you do not need the listener it may not be specified.");if(t.schema){var n=t.schema.validate(e.action.data);n?this.trigger("error",n):new(Function.prototype.bind.apply(t,Array.prototype.concat.call(t,e.action.data,e.subscriber.bind(this))))}else new(Function.prototype.bind.apply(t,Array.prototype.concat.call(t,e.action.data,e.subscriber.bind(this))))}this.enableQueue()}},{key:"bindStore",value:function(e){this.store=e}},{key:"bindReducer",value:function(e){this.reducers[e.actionName]=e}},{key:"bindComponent",value:function(e){this.components[e.name]=e}},{key:"bindPlugin",value:function(t){var n=t.type.toLowerCase();if(e.View.prototype._plugins.hasOwnProperty(n))throw new Error("Duplicate plugin name");e.View.prototype._plugins[n]=t.plugin}},{key:"combineReducer",value:function(e){var t=this;e&&e.forEach(function(e){t.bindReducer(e)})}},{key:"getStates",value:function(e){return"undefined"!=typeof e?this.store[e]:this.store}},{key:"setStates",value:function(e,t){var n=void 0;n="string"==typeof e&&"undefined"!=typeof t?r({},e,t):e,this.store||(this.store={}),Object.assign(this.store,n)}},{key:"getMiddleware",value:function(e,t){return this.middlewares[e][t]}},{key:"getComponent",value:function(e){var t=this.components[e];if(t)return t.view}},{key:"getRouteTables",value:function(){return l.routeTables}},{key:"dispatch",value:function(e,t){d(a("dispatch action %s",e.type)),this.queue.push({action:e,subscriber:t})}},{key:"use",value:function(e){var t=this;Array.isArray(e)?e.forEach(function(e){return t.useModule(e)}):"object"!==("undefined"==typeof e?"undefined":o(e))||"wwtype"in e?this.useModule(e):Object.keys(e).forEach(function(n){"function"==typeof e[n]&&t.useModule(e[n])})}},{key:"useModule",value:function(e){switch(e.wwtype){case"reducer":this.bindReducer(e);break;case"layout":l.bindLayout(e);break;case"store":this.bindStore(e.store);break;case"component":console.warn("Component:: Deprecated and will be removed in a future release."),this.bindComponent(e);break;case"plugin":this.bindPlugin(e)}}},{key:"set",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=new e(n);if(!r.mwtype)throw new Error('Required attribute "mwtype" is missing.');Object.values(h).forEach(function(e){e in r&&t.middlewares[r.mwtype][e].push(r)})}},{key:"start",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if("undefined"==typeof jQuery)throw new Error("jQuery is not loaded!!");var r=setInterval(function(){switch(document.readyState){case"complete":case"loaded":break;default:return}clearInterval(r),e&&l.design(e,n,g);var i=t.getMiddleware(f.APP,h.BEFORE);p.run(i,h.BEFORE,[g],function(){i=this.getMiddleware(f.APP,h.AFTER),p.run(i,h.AFTER,[g],function(){c.history.start({pushState:!!n.pushState})})}.bind(t))},1)}},{key:"numberOfAction",value:function(){return this.queue.length}},{key:"numberOfWorkAction",value:function(){return Object.keys(this.actionObject).length}}]),e}();Object.assign(m.prototype,c.Events),m.$=c.$,m.View=n(14)(g),m.Reducer=n(19)(g),m.Error=n(20),m.Types=n(21),m.Store=n(22),m.Action=n(23),m.Event=n(24),m.Schema=n(25),m.Layout=n(26),m.Component=n(27),m.Plugin=n(28),e.exports=t.Woowahan=m,m.CollectionView=n(29)(g),m.ItemView=n(31)(g),m.PopupView=n(32)(g)}).call(t,function(){return this}())},function(e,t,n){(function(e,r){function i(e,n){var r={seen:[],stylize:s};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),v(n)?r.showHidden=n:n&&t._extend(r,n),x(r.showHidden)&&(r.showHidden=!1),x(r.depth)&&(r.depth=2),x(r.colors)&&(r.colors=!1),x(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=o),u(r,e,r.depth)}function o(e,t){var n=i.styles[t];return n?"["+i.colors[n][0]+"m"+e+"["+i.colors[n][1]+"m":e}function s(e,t){return e}function a(e){var t={};return e.forEach(function(e,n){t[e]=!0}),t}function u(e,n,r){if(e.customInspect&&n&&_(n.inspect)&&n.inspect!==t.inspect&&(!n.constructor||n.constructor.prototype!==n)){var i=n.inspect(r,e);return b(i)||(i=u(e,i,r)),i}var o=c(e,n);if(o)return o;var s=Object.keys(n),v=a(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(n)),A(n)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return l(n);if(0===s.length){if(_(n)){var g=n.name?": "+n.name:"";return e.stylize("[Function"+g+"]","special")}if(E(n))return e.stylize(RegExp.prototype.toString.call(n),"regexp");if(S(n))return e.stylize(Date.prototype.toString.call(n),"date");if(A(n))return l(n)}var y="",m=!1,w=["{","}"];if(d(n)&&(m=!0,w=["[","]"]),_(n)){var x=n.name?": "+n.name:"";y=" [Function"+x+"]"}if(E(n)&&(y=" "+RegExp.prototype.toString.call(n)),S(n)&&(y=" "+Date.prototype.toUTCString.call(n)),A(n)&&(y=" "+l(n)),0===s.length&&(!m||0==n.length))return w[0]+y+w[1];if(r<0)return E(n)?e.stylize(RegExp.prototype.toString.call(n),"regexp"):e.stylize("[Object]","special");e.seen.push(n);var T;return T=m?f(e,n,r,v,s):s.map(function(t){return h(e,n,r,v,t,m)}),e.seen.pop(),p(T,y,w)}function c(e,t){if(x(t))return e.stylize("undefined","undefined");if(b(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}return m(t)?e.stylize(""+t,"number"):v(t)?e.stylize(""+t,"boolean"):g(t)?e.stylize("null","null"):void 0}function l(e){return"["+Error.prototype.toString.call(e)+"]"}function f(e,t,n,r,i){for(var o=[],s=0,a=t.length;s-1&&(a=o?a.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+a.split("\n").map(function(e){return" "+e}).join("\n"))):a=e.stylize("[Circular]","special")),x(s)){if(o&&i.match(/^\d+$/))return a;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+a}function p(e,t,n){var r=0,i=e.reduce(function(e,t){return r++,t.indexOf("\n")>=0&&r++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}function d(e){return Array.isArray(e)}function v(e){return"boolean"==typeof e}function g(e){return null===e}function y(e){return null==e}function m(e){return"number"==typeof e}function b(e){return"string"==typeof e}function w(e){return"symbol"==typeof e}function x(e){return void 0===e}function E(e){return T(e)&&"[object RegExp]"===k(e)}function T(e){return"object"==typeof e&&null!==e}function S(e){return T(e)&&"[object Date]"===k(e)}function A(e){return T(e)&&("[object Error]"===k(e)||e instanceof Error)}function _(e){return"function"==typeof e}function C(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function k(e){return Object.prototype.toString.call(e)}function j(e){return e<10?"0"+e.toString(10):e.toString(10)}function O(){var e=new Date,t=[j(e.getHours()),j(e.getMinutes()),j(e.getSeconds())].join(":");return[e.getDate(),L[e.getMonth()],t].join(" ")}function N(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var R=/%[sdj%]/g;t.format=function(e){if(!b(e)){for(var t=[],n=0;n=o)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(e){return"[Circular]"}default:return e}}),a=r[n];n1)for(var n=1;n=31||navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))}function o(e){var n=this.useColors;if(e[0]=(n?"%c":"")+this.namespace+(n?" %c":" ")+e[0]+(n?"%c ":" ")+"+"+t.humanize(this.diff),n){var r="color: "+this.color;e.splice(1,0,r,"color: inherit");var i=0,o=0;e[0].replace(/%[a-zA-Z%]/g,function(e){"%%"!==e&&(i++,"%c"===e&&(o=i))}),e.splice(o,0,r)}}function s(){return"object"==typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function a(e){try{null==e?t.storage.removeItem("debug"):t.storage.debug=e}catch(e){}}function u(){var e;try{e=t.storage.debug}catch(e){}return!e&&"undefined"!=typeof r&&"env"in r&&(e=r.env.DEBUG),e}function c(){try{return window.localStorage}catch(e){}}t=e.exports=n(7),t.log=s,t.formatArgs=o,t.save=a,t.load=u,t.useColors=i,t.storage="undefined"!=typeof chrome&&"undefined"!=typeof chrome.storage?chrome.storage.local:c(),t.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}},t.enable(u())}).call(t,n(3))},function(e,t,n){function r(e){var n,r=0;for(n in e)r=(r<<5)-r+e.charCodeAt(n),r|=0;return t.colors[Math.abs(r)%t.colors.length]}function i(e){function n(){if(n.enabled){var e=n,r=+new Date,i=r-(c||r);e.diff=i,e.prev=c,e.curr=r,c=r;for(var o=new Array(arguments.length),s=0;s100)){var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(t){var n=parseFloat(t[1]),r=(t[2]||"ms").toLowerCase();switch(r){case"years":case"year":case"yrs":case"yr":case"y":return n*l;case"days":case"day":case"d":return n*c;case"hours":case"hour":case"hrs":case"hr":case"h":return n*u;case"minutes":case"minute":case"mins":case"min":case"m":return n*a;case"seconds":case"second":case"secs":case"sec":case"s":return n*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function r(e){return e>=c?Math.round(e/c)+"d":e>=u?Math.round(e/u)+"h":e>=a?Math.round(e/a)+"m":e>=s?Math.round(e/s)+"s":e+"ms"}function i(e){return o(e,c,"day")||o(e,u,"hour")||o(e,a,"minute")||o(e,s,"second")||e+" ms"}function o(e,t,n){if(!(e0)return n(e);if("number"===o&&isNaN(e)===!1)return t.long?i(e):r(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},function(e,t,n){var r,i;(function(o){!function(s){var a="object"==typeof self&&self.self===self&&self||"object"==typeof o&&o.global===o&&o;r=[n(10),n(11),t],i=function(e,t,n){a.Backbone=s(a,n,e,t)}.apply(t,r),!(void 0!==i&&(e.exports=i))}(function(e,t,n,r){var i=e.Backbone,s=Array.prototype.slice;t.VERSION="1.3.3",t.$=r,t.noConflict=function(){return e.Backbone=i,this},t.emulateHTTP=!1,t.emulateJSON=!1;var a=function(e,t,r){switch(e){case 1:return function(){return n[t](this[r])};case 2:return function(e){return n[t](this[r],e)};case 3:return function(e,i){return n[t](this[r],c(e,this),i)};case 4:return function(e,i,o){return n[t](this[r],c(e,this),i,o)};default:return function(){var e=s.call(arguments);return e.unshift(this[r]),n[t].apply(n,e)}}},u=function(e,t,r){n.each(t,function(t,i){n[i]&&(e.prototype[i]=a(t,i,r))})},c=function(e,t){return n.isFunction(e)?e:n.isObject(e)&&!t._isModel(e)?l(e):n.isString(e)?function(t){return t.get(e)}:e},l=function(e){var t=n.matches(e);return function(e){return t(e.attributes)}},f=t.Events={},h=/\s+/,p=function(e,t,r,i,o){var s,a=0;if(r&&"object"==typeof r){void 0!==i&&"context"in o&&void 0===o.context&&(o.context=i);for(s=n.keys(r);athis.length&&(i=this.length),i<0&&(i+=this.length+1);var o,s,a=[],u=[],c=[],l=[],f={},h=t.add,p=t.merge,d=t.remove,v=!1,g=this.comparator&&null==i&&t.sort!==!1,y=n.isString(this.comparator)?this.comparator:null;for(s=0;s7),this._useHashChange=this._wantsHashChange&&this._hasHashChange,this._wantsPushState=!!this.options.pushState,this._hasPushState=!(!this.history||!this.history.pushState),this._usePushState=this._wantsPushState&&this._hasPushState,this.fragment=this.getFragment(),this.root=("/"+this.root+"/").replace(F,"/"),this._wantsHashChange&&this._wantsPushState){if(!this._hasPushState&&!this.atRoot()){var t=this.root.slice(0,-1)||"/";return this.location.replace(t+"#"+this.getPath()),!0}this._hasPushState&&this.atRoot()&&this.navigate(this.getHash(),{replace:!0})}if(!this._hasHashChange&&this._wantsHashChange&&!this._usePushState){this.iframe=document.createElement("iframe"),this.iframe.src="javascript:0",this.iframe.style.display="none",this.iframe.tabIndex=-1;var r=document.body,i=r.insertBefore(this.iframe,r.firstChild).contentWindow;i.document.open(),i.document.close(),i.location.hash="#"+this.fragment}var o=window.addEventListener||function(e,t){return attachEvent("on"+e,t)};if(this._usePushState?o("popstate",this.checkUrl,!1):this._useHashChange&&!this.iframe?o("hashchange",this.checkUrl,!1):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval)),!this.options.silent)return this.loadUrl()},stop:function(){var e=window.removeEventListener||function(e,t){return detachEvent("on"+e,t)};this._usePushState?e("popstate",this.checkUrl,!1):this._useHashChange&&!this.iframe&&e("hashchange",this.checkUrl,!1),this.iframe&&(document.body.removeChild(this.iframe),this.iframe=null),this._checkUrlInterval&&clearInterval(this._checkUrlInterval),I.started=!1},route:function(e,t){this.handlers.unshift({route:e,callback:t})},checkUrl:function(e){var t=this.getFragment();return t===this.fragment&&this.iframe&&(t=this.getHash(this.iframe.contentWindow)),t!==this.fragment&&(this.iframe&&this.navigate(t),void this.loadUrl())},loadUrl:function(e){return!!this.matchRoot()&&(e=this.fragment=this.getFragment(e),n.some(this.handlers,function(t){if(t.route.test(e))return t.callback(e),!0}))},navigate:function(e,t){if(!I.started)return!1;t&&t!==!0||(t={trigger:!!t}),e=this.getFragment(e||"");var n=this.root;""!==e&&"?"!==e.charAt(0)||(n=n.slice(0,-1)||"/");var r=n+e;if(e=this.decodeFragment(e.replace(P,"")),this.fragment!==e){if(this.fragment=e,this._usePushState)this.history[t.replace?"replaceState":"pushState"]({},document.title,r);else{if(!this._wantsHashChange)return this.location.assign(r);if(this._updateHash(this.location,e,t.replace),this.iframe&&e!==this.getHash(this.iframe.contentWindow)){var i=this.iframe.contentWindow;t.replace||(i.document.open(),i.document.close()),this._updateHash(i.location,e,t.replace)}}return t.trigger?this.loadUrl(e):void 0}},_updateHash:function(e,t,n){if(n){var r=e.href.replace(/(javascript:|#).*$/,"");e.replace(r+"#"+t)}else e.hash="#"+t}}),t.history=new I;var $=function(e,t){var r,i=this;return r=e&&n.has(e,"constructor")?e.constructor:function(){return i.apply(this,arguments)},n.extend(r,i,t),r.prototype=n.create(i.prototype,e),r.prototype.constructor=r,r.__super__=i.prototype,r};w.extend=E.extend=N.extend=C.extend=I.extend=$;var H=function(){throw new Error('A "url" property or function must be specified')},W=function(e,t){var n=t.error;t.error=function(r){n&&n.call(t.context,e,r,t),e.trigger("error",e,r,t)}};return t})}).call(t,function(){return this}())},function(e,t,n){var r,i;(function(){function n(e){function t(t,n,r,i,o,s){for(;o>=0&&o0?0:a-1;return arguments.length<3&&(i=n[s?s[u]:u],u+=e),t(n,r,i,s,u,a)}}function o(e){return function(t,n,r){n=S(n,r);for(var i=j(t),o=e>0?0:i-1;o>=0&&o0?s=o>=0?o:Math.max(o+a,s):a=o>=0?Math.min(o+1,a):o+a+1;else if(n&&o&&a)return o=n(r,i),r[o]===i?o:-1;if(i!==i)return o=t(d.call(r,s,a),E.isNaN),o>=0?o+s:-1;for(o=e>0?s:a-1;o>=0&&o=0&&t<=k};E.each=E.forEach=function(e,t,n){t=T(t,n);var r,i;if(O(e))for(r=0,i=e.length;r=0},E.invoke=function(e,t){var n=d.call(arguments,2),r=E.isFunction(t);return E.map(e,function(e){var i=r?t:e[t];return null==i?i:i.apply(e,n)})},E.pluck=function(e,t){return E.map(e,E.property(t))},E.where=function(e,t){return E.filter(e,E.matcher(t))},E.findWhere=function(e,t){return E.find(e,E.matcher(t))},E.max=function(e,t,n){var r,i,o=-(1/0),s=-(1/0);if(null==t&&null!=e){e=O(e)?e:E.values(e);for(var a=0,u=e.length;ao&&(o=r)}else t=S(t,n),E.each(e,function(e,n,r){i=t(e,n,r),(i>s||i===-(1/0)&&o===-(1/0))&&(o=e,s=i)});return o},E.min=function(e,t,n){var r,i,o=1/0,s=1/0;if(null==t&&null!=e){e=O(e)?e:E.values(e);for(var a=0,u=e.length;ar||void 0===n)return 1;if(nt?(s&&(clearTimeout(s),s=null),a=c,o=e.apply(r,i),s||(r=i=null)):s||n.trailing===!1||(s=setTimeout(u,l)),o}},E.debounce=function(e,t,n){var r,i,o,s,a,u=function(){var c=E.now()-s;c=0?r=setTimeout(u,t-c):(r=null,n||(a=e.apply(o,i),r||(o=i=null)))};return function(){o=this,i=arguments,s=E.now();var c=n&&!r;return r||(r=setTimeout(u,t)),c&&(a=e.apply(o,i),o=i=null),a}},E.wrap=function(e,t){return E.partial(t,e)},E.negate=function(e){return function(){return!e.apply(this,arguments)}},E.compose=function(){var e=arguments,t=e.length-1;return function(){for(var n=t,r=e[t].apply(this,arguments);n--;)r=e[n].call(this,r);return r}},E.after=function(e,t){return function(){if(--e<1)return t.apply(this,arguments)}},E.before=function(e,t){var n;return function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=null),n}},E.once=E.partial(E.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),L=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];E.keys=function(e){if(!E.isObject(e))return[];if(m)return m(e);var t=[];for(var n in e)E.has(e,n)&&t.push(n);return M&&a(e,t),t},E.allKeys=function(e){if(!E.isObject(e))return[];var t=[];for(var n in e)t.push(n);return M&&a(e,t),t},E.values=function(e){for(var t=E.keys(e),n=t.length,r=Array(n),i=0;i":">",'"':""","'":"'","`":"`"},F=E.invert(q),P=function(e){var t=function(t){return e[t]},n="(?:"+E.keys(e).join("|")+")",r=RegExp(n),i=RegExp(n,"g");return function(e){return e=null==e?"":""+e,r.test(e)?e.replace(i,t):e}};E.escape=P(q),E.unescape=P(F),E.result=function(e,t,n){var r=null==e?void 0:e[t];return void 0===r&&(r=n),E.isFunction(r)?r.call(e):r};var $=0;E.uniqueId=function(e){var t=++$+"";return e?e+t:t},E.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var H=/(.)^/,W={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},B=/\\|'|\r|\n|\u2028|\u2029/g,U=function(e){return"\\"+W[e]};E.template=function(e,t,n){!t&&n&&(t=n),t=E.defaults({},t,E.templateSettings);var r=RegExp([(t.escape||H).source,(t.interpolate||H).source,(t.evaluate||H).source].join("|")+"|$","g"),i=0,o="__p+='";e.replace(r,function(t,n,r,s,a){return o+=e.slice(i,a).replace(B,U),i=a+t.length,n?o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'":r?o+="'+\n((__t=("+r+"))==null?'':__t)+\n'":s&&(o+="';\n"+s+"\n__p+='"),t}),o+="';\n",t.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{var s=new Function(t.variable||"obj","_",o)}catch(e){throw e.source=o,e}var a=function(e){return s.call(this,e,E)},u=t.variable||"obj";return a.source="function("+u+"){\n"+o+"}",a},E.chain=function(e){var t=E(e);return t._chain=!0,t};var z=function(e,t){return e._chain?E(t).chain():t};E.mixin=function(e){E.each(E.functions(e),function(t){var n=E[t]=e[t];E.prototype[t]=function(){var e=[this._wrapped];return p.apply(e,arguments),z(this,n.apply(E,e))}})},E.mixin(E),E.each(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=l[e];E.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),"shift"!==e&&"splice"!==e||0!==n.length||delete n[0],z(this,n)}}),E.each(["concat","join","slice"],function(e){var t=l[e];E.prototype[e]=function(){return z(this,t.apply(this._wrapped,arguments))}}),E.prototype.value=function(){return this._wrapped},E.prototype.valueOf=E.prototype.toJSON=E.prototype.value,E.prototype.toString=function(){return""+this._wrapped},r=[],i=function(){return E}.apply(t,r),!(void 0!==i&&(e.exports=i))}).call(this)},function(e,t,n){var r,i;!function(t,n){"object"==typeof e&&"object"==typeof e.exports?e.exports=t.document?n(t,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return n(e)}:n(t)}("undefined"!=typeof window?window:this,function(n,o){function s(e){var t=!!e&&"length"in e&&e.length,n=ce.type(e);return"function"!==n&&!ce.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function a(e,t,n){if(ce.isFunction(t))return ce.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return ce.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(be.test(t))return ce.filter(t,e,n);t=ce.filter(t,e)}return ce.grep(e,function(e){return re.call(t,e)>-1!==n})}function u(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}function c(e){var t={};return ce.each(e.match(Ae)||[],function(e,n){t[n]=!0}),t}function l(){Z.removeEventListener("DOMContentLoaded",l),n.removeEventListener("load",l),ce.ready()}function f(){this.expando=ce.expando+f.uid++}function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Re,"-$&").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:Ne.test(n)?ce.parseJSON(n):n)}catch(e){}Oe.set(e,t,n)}else n=void 0;return n}function p(e,t,n,r){var i,o=1,s=20,a=r?function(){return r.cur()}:function(){return ce.css(e,t,"")},u=a(),c=n&&n[3]||(ce.cssNumber[t]?"":"px"),l=(ce.cssNumber[t]||"px"!==c&&+u)&&Me.exec(ce.css(e,t));if(l&&l[3]!==c){c=c||l[3],n=n||[],l=+u||1;do o=o||".5",l/=o,ce.style(e,t,l+c);while(o!==(o=a()/u)&&1!==o&&--s)}return n&&(l=+l||+u||0,i=n[1]?l+(n[1]+1)*n[2]:+n[2],r&&(r.unit=c,r.start=l,r.end=i)),i}function d(e,t){var n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[];return void 0===t||t&&ce.nodeName(e,t)?ce.merge([e],n):n}function v(e,t){for(var n=0,r=e.length;n-1)i&&i.push(o);else if(c=ce.contains(o.ownerDocument,o),s=d(f.appendChild(o),"script"),c&&v(s),n)for(l=0;o=s[l++];)Pe.test(o.type||"")&&n.push(o);return f}function y(){return!0}function m(){return!1}function b(){try{return Z.activeElement}catch(e){}}function w(e,t,n,r,i,o){var s,a;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(a in t)w(e,a,n,r,t[a],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=m;else if(!i)return e;return 1===o&&(s=i,i=function(e){return ce().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=ce.guid++)),e.each(function(){ce.event.add(this,t,i,r,n)})}function x(e,t){return ce.nodeName(e,"table")&&ce.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function E(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function T(e){var t=Xe.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function S(e,t){var n,r,i,o,s,a,u,c;if(1===t.nodeType){if(je.hasData(e)&&(o=je.access(e),s=je.set(t,o),c=o.events)){delete s.handle,s.events={};for(i in c)for(n=0,r=c[i].length;n1&&"string"==typeof p&&!ae.checkClone&&Je.test(p))return e.each(function(i){var o=e.eq(i);v&&(t[0]=p.call(this,i,o.html())),_(o,t,n,r)});if(f&&(i=g(t,e[0].ownerDocument,!1,e,r),o=i.firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=ce.map(d(i,"script"),E),a=s.length;l")).appendTo(t.documentElement),t=Ye[0].contentDocument,t.write(),t.close(),n=k(e,t),Ye.detach()),Qe[e]=n),n}function O(e,t,n){var r,i,o,s,a=e.style;return n=n||et(e),s=n?n.getPropertyValue(t)||n[t]:void 0,""!==s&&void 0!==s||ce.contains(e.ownerDocument,e)||(s=ce.style(e,t)),n&&!ae.pixelMarginRight()&&Ze.test(s)&&Ke.test(t)&&(r=a.width,i=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=s,s=n.width,a.width=r,a.minWidth=i,a.maxWidth=o),void 0!==s?s+"":s}function N(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function R(e){if(e in at)return e;for(var t=e[0].toUpperCase()+e.slice(1),n=st.length;n--;)if(e=st[n]+t,e in at)return e}function D(e,t,n){var r=Me.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function M(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;o<4;o+=2)"margin"===n&&(s+=ce.css(e,n+Le[o],!0,i)),r?("content"===n&&(s-=ce.css(e,"padding"+Le[o],!0,i)),"margin"!==n&&(s-=ce.css(e,"border"+Le[o]+"Width",!0,i))):(s+=ce.css(e,"padding"+Le[o],!0,i),"padding"!==n&&(s+=ce.css(e,"border"+Le[o]+"Width",!0,i)));return s}function L(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=et(e),s="border-box"===ce.css(e,"boxSizing",!1,o);if(i<=0||null==i){if(i=O(e,t,o),(i<0||null==i)&&(i=e.style[t]),Ze.test(i))return i;r=s&&(ae.boxSizingReliable()||i===e.style[t]),i=parseFloat(i)||0}return i+M(e,t,n||(s?"border":"content"),r,o)+"px"}function I(e,t){for(var n,r,i,o=[],s=0,a=e.length;s=0&&n=0},isPlainObject:function(e){var t;if("object"!==ce.type(e)||e.nodeType||ce.isWindow(e))return!1;if(e.constructor&&!se.call(e,"constructor")&&!se.call(e.constructor.prototype||{},"isPrototypeOf"))return!1;for(t in e);return void 0===t||se.call(e,t)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ie[oe.call(e)]||"object":typeof e},globalEval:function(e){var t,n=eval;e=ce.trim(e),e&&(1===e.indexOf("use strict")?(t=Z.createElement("script"),t.text=e,Z.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(fe,"ms-").replace(he,pe)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var n,r=0;if(s(e))for(n=e.length;rE.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=R.createElement("div");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)E.attrHandle[n[r]]=t}function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||J)-(~e.sourceIndex||J);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function a(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),s=o.length;s--;)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}function l(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function h(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function v(e,n,r){for(var i=0,o=n.length;i-1&&(r[c]=!(s[c]=f))}}else b=g(b===s?b.splice(d,b.length):b),o?o(null,s,b,u):K.apply(s,b)})}function m(e){for(var t,n,r,i=e.length,o=E.relative[e[0].type],s=o||E.relative[" "],a=o?1:0,u=p(function(e){return e===t},s,!0),c=p(function(e){return ee(t,e)>-1},s,!0),l=[function(e,n,r){var i=!o&&(r||n!==k)||((t=n).nodeType?u(e,n,r):c(e,n,r));return t=null,i}];a1&&d(l),a>1&&h(e.slice(0,a-1).concat({value:" "===e[a-2].type?"*":""})).replace(ae,"$1"),n,a0,o=e.length>0,s=function(r,s,a,u,c){var l,f,h,p=0,d="0",v=r&&[],y=[],m=k,b=r||o&&E.find.TAG("*",c),w=H+=null==m?1:Math.random()||.1,x=b.length;for(c&&(k=s===R||s||c);d!==x&&null!=(l=b[d]);d++){if(o&&l){for(f=0,s||l.ownerDocument===R||(N(l),a=!M);h=e[f++];)if(h(l,s||R,a)){u.push(l);break}c&&(H=w)}i&&((l=!h&&l)&&p--,r&&v.push(l))}if(p+=d,i&&d!==p){for(f=0;h=n[f++];)h(v,y,s,a);if(r){if(p>0)for(;d--;)v[d]||y[d]||(y[d]=Y.call(u));y=g(y)}K.apply(u,y),c&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return c&&(H=w,k=m),v};return i?r(s):s}var w,x,E,T,S,A,_,C,k,j,O,N,R,D,M,L,I,q,F,P="sizzle"+1*new Date,$=e.document,H=0,W=0,B=n(),U=n(),z=n(),V=function(e,t){return e===t&&(O=!0),0},J=1<<31,X={}.hasOwnProperty,G=[],Y=G.pop,Q=G.push,K=G.push,Z=G.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),le=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),he=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},de=/^(?:input|select|textarea|button)$/i,ve=/^h\d$/i,ge=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,me=/[+~]/,be=/'|\\/g,we=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),xe=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Ee=function(){N()};try{K.apply(G=Z.call($.childNodes),$.childNodes),G[$.childNodes.length].nodeType}catch(e){K={apply:G.length?function(e,t){Q.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}x=t.support={},S=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},N=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:$;return r!==R&&9===r.nodeType&&r.documentElement?(R=r,D=R.documentElement,M=!S(R),(n=R.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Ee,!1):n.attachEvent&&n.attachEvent("onunload",Ee)),x.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),x.getElementsByTagName=i(function(e){return e.appendChild(R.createComment("")),!e.getElementsByTagName("*").length}),x.getElementsByClassName=ge.test(R.getElementsByClassName),x.getById=i(function(e){return D.appendChild(e).id=P,!R.getElementsByName||!R.getElementsByName(P).length}),x.getById?(E.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&M){var n=t.getElementById(e);return n?[n]:[]}},E.filter.ID=function(e){var t=e.replace(we,xe);return function(e){return e.getAttribute("id")===t}}):(delete E.find.ID,E.filter.ID=function(e){var t=e.replace(we,xe);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),E.find.TAG=x.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):x.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},E.find.CLASS=x.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&M)return t.getElementsByClassName(e)},I=[],L=[],(x.qsa=ge.test(R.querySelectorAll))&&(i(function(e){D.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&L.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||L.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||L.push("~="),e.querySelectorAll(":checked").length||L.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||L.push(".#.+[+~]")}),i(function(e){var t=R.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&L.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||L.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),L.push(",.*:")})),(x.matchesSelector=ge.test(q=D.matches||D.webkitMatchesSelector||D.mozMatchesSelector||D.oMatchesSelector||D.msMatchesSelector))&&i(function(e){x.disconnectedMatch=q.call(e,"div"),q.call(e,"[s!='']:x"),I.push("!=",oe)}),L=L.length&&new RegExp(L.join("|")),I=I.length&&new RegExp(I.join("|")),t=ge.test(D.compareDocumentPosition),F=t||ge.test(D.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},V=t?function(e,t){if(e===t)return O=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!x.sortDetached&&t.compareDocumentPosition(e)===n?e===R||e.ownerDocument===$&&F($,e)?-1:t===R||t.ownerDocument===$&&F($,t)?1:j?ee(j,e)-ee(j,t):0:4&n?-1:1)}:function(e,t){if(e===t)return O=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],u=[t];if(!i||!o)return e===R?-1:t===R?1:i?-1:o?1:j?ee(j,e)-ee(j,t):0;if(i===o)return s(e,t);for(n=e;n=n.parentNode;)a.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;a[r]===u[r];)r++;return r?s(a[r],u[r]):a[r]===$?-1:u[r]===$?1:0},R):R},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==R&&N(e),n=n.replace(le,"='$1']"),x.matchesSelector&&M&&!z[n+" "]&&(!I||!I.test(n))&&(!L||!L.test(n)))try{var r=q.call(e,n);if(r||x.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){}return t(n,R,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==R&&N(e),F(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==R&&N(e);var n=E.attrHandle[t.toLowerCase()],r=n&&X.call(E.attrHandle,t.toLowerCase())?n(e,t,!M):void 0;return void 0!==r?r:x.attributes||!M?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(O=!x.detectDuplicates,j=!x.sortStable&&e.slice(0),e.sort(V),O){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return j=null,e},T=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=T(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=T(t);return n},E=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(we,xe),e[3]=(e[3]||e[4]||e[5]||"").replace(we,xe),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=A(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(we,xe).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=B[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&B(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(se," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var c,l,f,h,p,d,v=o!==s?"nextSibling":"previousSibling",g=t.parentNode,y=a&&t.nodeName.toLowerCase(),m=!u&&!a,b=!1;if(g){if(o){for(;v;){for(h=t;h=h[v];)if(a?h.nodeName.toLowerCase()===y:1===h.nodeType)return!1;d=v="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?g.firstChild:g.lastChild],s&&m){for(h=g,f=h[P]||(h[P]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),c=l[e]||[],p=c[0]===H&&c[1],b=p&&c[2],h=p&&g.childNodes[p];h=++p&&h&&h[v]||(b=p=0)||d.pop();)if(1===h.nodeType&&++b&&h===t){l[e]=[H,p,b];break}}else if(m&&(h=t,f=h[P]||(h[P]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),c=l[e]||[],p=c[0]===H&&c[1],b=p),b===!1)for(;(h=++p&&h&&h[v]||(b=p=0)||d.pop())&&((a?h.nodeName.toLowerCase()!==y:1!==h.nodeType)||!++b||(m&&(f=h[P]||(h[P]={}),l=f[h.uniqueID]||(f[h.uniqueID]={}),l[e]=[H,b]),h!==t)););return b-=i,b===r||b%r===0&&b/r>=0}}},PSEUDO:function(e,n){var i,o=E.pseudos[e]||E.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],E.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),s=i.length;s--;)r=ee(e,i[s]),e[r]=!(t[r]=i[s])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=_(e.replace(ae,"$1"));return i[P]?r(function(e,t,n,r){for(var o,s=i(e,null,r,[]),a=e.length;a--;)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(we,xe),function(t){return(t.textContent||t.innerText||T(t)).indexOf(e)>-1}}),lang:r(function(e){return he.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(we,xe).toLowerCase(),function(t){var n;do if(n=M?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===D},focus:function(e){return e===R.activeElement&&(!R.hasFocus||R.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!E.pseudos.empty(e)},header:function(e){return ve.test(e.nodeName)},input:function(e){return de.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[n<0?n+t:n]}),even:c(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:c(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(s=o[0]).type&&x.getById&&9===t.nodeType&&M&&E.relative[o[1].type]){if(t=(E.find.ID(s.matches[0].replace(we,xe),t)||[])[0],!t)return n;c&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(s=o[i],!E.relative[a=s.type]);)if((u=E.find[a])&&(r=u(s.matches[0].replace(we,xe),me.test(o[0].type)&&l(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&h(o),!e)return K.apply(n,r),n;break}}return(c||_(e,f))(r,t,!M,n,!t||me.test(e)&&l(t.parentNode)||t),n},x.sortStable=P.split("").sort(V).join("")===P,x.detectDuplicates=!!O,N(),x.sortDetached=i(function(e){return 1&e.compareDocumentPosition(R.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),x.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(n);ce.find=de,ce.expr=de.selectors,ce.expr[":"]=ce.expr.pseudos,ce.uniqueSort=ce.unique=de.uniqueSort,ce.text=de.getText,ce.isXMLDoc=de.isXML,ce.contains=de.contains;var ve=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&ce(e).is(n))break;r.push(e)}return r},ge=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},ye=ce.expr.match.needsContext,me=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,be=/^.[^:#\[\.,]*$/;ce.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?ce.find.matchesSelector(r,e)?[r]:[]:ce.find.matches(e,ce.grep(t,function(e){return 1===e.nodeType}))},ce.fn.extend({find:function(e){var t,n=this.length,r=[],i=this;if("string"!=typeof e)return this.pushStack(ce(e).filter(function(){for(t=0;t1?ce.unique(r):r),r.selector=this.selector?this.selector+" "+e:e,r},filter:function(e){return this.pushStack(a(this,e||[],!1))},not:function(e){return this.pushStack(a(this,e||[],!0))},is:function(e){return!!a(this,"string"==typeof e&&ye.test(e)?ce(e):e||[],!1).length}});var we,xe=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,Ee=ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||we,"string"==typeof e){if(r="<"===e[0]&&">"===e[e.length-1]&&e.length>=3?[null,e,null]:xe.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:Z,!0)),me.test(r[1])&&ce.isPlainObject(t))for(r in t)ce.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=Z.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=Z,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):ce.isFunction(e)?void 0!==n.ready?n.ready(e):e(ce):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),ce.makeArray(e,this))};Ee.prototype=ce.fn,we=ce(Z);var Te=/^(?:parents|prev(?:Until|All))/,Se={children:!0,contents:!0,next:!0,prev:!0};ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&ce.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?ce.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?re.call(ce(e),this[0]):re.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(ce.uniqueSort(ce.merge(this.get(),ce(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),ce.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return ve(e,"parentNode")},parentsUntil:function(e,t,n){return ve(e,"parentNode",n)},next:function(e){return u(e,"nextSibling")},prev:function(e){return u(e,"previousSibling")},nextAll:function(e){return ve(e,"nextSibling")},prevAll:function(e){return ve(e,"previousSibling")},nextUntil:function(e,t,n){return ve(e,"nextSibling",n)},prevUntil:function(e,t,n){return ve(e,"previousSibling",n)},siblings:function(e){return ge((e.parentNode||{}).firstChild,e)},children:function(e){return ge(e.firstChild)},contents:function(e){return e.contentDocument||ce.merge([],e.childNodes)}},function(e,t){ce.fn[e]=function(n,r){var i=ce.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=ce.filter(r,i)),this.length>1&&(Se[e]||ce.uniqueSort(i),Te.test(e)&&i.reverse()),this.pushStack(i)}});var Ae=/\S+/g;ce.Callbacks=function(e){e="string"==typeof e?c(e):ce.extend({},e);var t,n,r,i,o=[],s=[],a=-1,u=function(){for(i=e.once,r=t=!0;s.length;a=-1)for(n=s.shift();++a-1;)o.splice(n,1),n<=a&&a--}),this},has:function(e){return e?ce.inArray(e,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=s=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=s=[],n||(o=n=""),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||u()),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!r}};return l},ce.extend({Deferred:function(e){var t=[["resolve","done",ce.Callbacks("once memory"),"resolved"],["reject","fail",ce.Callbacks("once memory"),"rejected"],["notify","progress",ce.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return ce.Deferred(function(n){ce.each(t,function(t,o){var s=ce.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&ce.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?ce.extend(e,r):r}},i={};return r.pipe=r.then,ce.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ee.call(arguments),s=o.length,a=1!==s||e&&ce.isFunction(e.promise)?s:0,u=1===a?e:ce.Deferred(),c=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ee.call(arguments):i,r===t?u.notifyWith(n,r):--a||u.resolveWith(n,r)}};if(s>1)for(t=new Array(s),n=new Array(s),r=new Array(s);i0||(_e.resolveWith(Z,[ce]),ce.fn.triggerHandler&&(ce(Z).triggerHandler("ready"),ce(Z).off("ready"))))}}),ce.ready.promise=function(e){return _e||(_e=ce.Deferred(),"complete"===Z.readyState||"loading"!==Z.readyState&&!Z.documentElement.doScroll?n.setTimeout(ce.ready):(Z.addEventListener("DOMContentLoaded",l),n.addEventListener("load",l))),_e.promise(e)},ce.ready.promise();var Ce=function(e,t,n,r,i,o,s){var a=0,u=e.length,c=null==n;if("object"===ce.type(n)){i=!0;for(a in n)Ce(e,t,a,n[a],!0,o,s)}else if(void 0!==r&&(i=!0,ce.isFunction(r)||(s=!0),c&&(s?(t.call(e,r),t=null):(c=t,t=function(e,t,n){return c.call(ce(e),n)})),t))for(;a-1&&void 0!==n&&Oe.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){Oe.remove(this,e)})}}),ce.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=je.get(e,t),n&&(!r||ce.isArray(n)?r=je.access(e,t,ce.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=ce.queue(e,t),r=n.length,i=n.shift(),o=ce._queueHooks(e,t),s=function(){ce.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return je.get(e,n)||je.access(e,n,{empty:ce.Callbacks("once memory").add(function(){je.remove(e,[t+"queue",n])})})}}),ce.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length",""],thead:[1,"","
              "],col:[2,"","
              "],tr:[2,"","
              "],td:[3,"","
              "],_default:[0,"",""]};$e.optgroup=$e.option,$e.tbody=$e.tfoot=$e.colgroup=$e.caption=$e.thead,$e.th=$e.td;var He=/<|&#?\w+;/;!function(){var e=Z.createDocumentFragment(),t=e.appendChild(Z.createElement("div")),n=Z.createElement("input");n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),t.appendChild(n),ae.checkClone=t.cloneNode(!0).cloneNode(!0).lastChild.checked,t.innerHTML="",ae.noCloneChecked=!!t.cloneNode(!0).lastChild.defaultValue}();var We=/^key/,Be=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ue=/^([^.]*)(?:\.(.+)|)/;ce.event={global:{},add:function(e,t,n,r,i){var o,s,a,u,c,l,f,h,p,d,v,g=je.get(e);if(g)for(n.handler&&(o=n,n=o.handler,i=o.selector),n.guid||(n.guid=ce.guid++),(u=g.events)||(u=g.events={}),(s=g.handle)||(s=g.handle=function(t){return"undefined"!=typeof ce&&ce.event.triggered!==t.type?ce.event.dispatch.apply(e,arguments):void 0}),t=(t||"").match(Ae)||[""],c=t.length;c--;)a=Ue.exec(t[c])||[],p=v=a[1],d=(a[2]||"").split(".").sort(),p&&(f=ce.event.special[p]||{},p=(i?f.delegateType:f.bindType)||p,f=ce.event.special[p]||{},l=ce.extend({type:p,origType:v,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&ce.expr.match.needsContext.test(i),namespace:d.join(".")},o),(h=u[p])||(h=u[p]=[],h.delegateCount=0,f.setup&&f.setup.call(e,r,d,s)!==!1||e.addEventListener&&e.addEventListener(p,s)),f.add&&(f.add.call(e,l),l.handler.guid||(l.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,l):h.push(l),ce.event.global[p]=!0)},remove:function(e,t,n,r,i){var o,s,a,u,c,l,f,h,p,d,v,g=je.hasData(e)&&je.get(e);if(g&&(u=g.events)){for(t=(t||"").match(Ae)||[""],c=t.length;c--;)if(a=Ue.exec(t[c])||[],p=v=a[1],d=(a[2]||"").split(".").sort(),p){for(f=ce.event.special[p]||{},p=(r?f.delegateType:f.bindType)||p,h=u[p]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=h.length;o--;)l=h[o],!i&&v!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(h.splice(o,1),l.selector&&h.delegateCount--,f.remove&&f.remove.call(e,l));s&&!h.length&&(f.teardown&&f.teardown.call(e,d,g.handle)!==!1||ce.removeEvent(e,p,g.handle),delete u[p])}else for(p in u)ce.event.remove(e,p+t[c],n,r,!0);ce.isEmptyObject(u)&&je.remove(e,"handle events")}},dispatch:function(e){e=ce.event.fix(e);var t,n,r,i,o,s=[],a=ee.call(arguments),u=(je.get(this,"events")||{})[e.type]||[],c=ce.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){for(s=ce.event.handlers.call(this,e,u),t=0;(i=s[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((ce.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:ce.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return a]*)\/>/gi,Ve=/\s*$/g;ce.extend({htmlPrefilter:function(e){return e.replace(ze,"<$1>")},clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=ce.contains(e.ownerDocument,e);if(!(ae.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||ce.isXMLDoc(e)))for(s=d(a),o=d(e),r=0,i=o.length;r0&&v(s,!u&&d(e,"script")),a},cleanData:function(e){for(var t,n,r,i=ce.event.special,o=0;void 0!==(n=e[o]);o++)if(ke(n)){if(t=n[je.expando]){if(t.events)for(r in t.events)i[r]?ce.event.remove(n,r):ce.removeEvent(n,r,t.handle);n[je.expando]=void 0}n[Oe.expando]&&(n[Oe.expando]=void 0)}}}),ce.fn.extend({domManip:_,detach:function(e){return C(this,e,!0)},remove:function(e){return C(this,e)},text:function(e){return Ce(this,function(e){return void 0===e?ce.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return _(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=x(this,e);t.appendChild(e)}})},prepend:function(){return _(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=x(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return _(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return _(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(ce.cleanData(d(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return ce.clone(this,e,t)})},html:function(e){return Ce(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ve.test(e)&&!$e[(Fe.exec(e)||["",""])[1].toLowerCase()]){e=ce.htmlPrefilter(e);try{for(;n1)},show:function(){return I(this,!0)},hide:function(){return I(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Ie(this)?ce(this).show():ce(this).hide()})}}),ce.Tween=q,q.prototype={constructor:q,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||ce.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(ce.cssNumber[n]?"":"px")},cur:function(){var e=q.propHooks[this.prop];return e&&e.get?e.get(this):q.propHooks._default.get(this)},run:function(e){var t,n=q.propHooks[this.prop];return this.options.duration?this.pos=t=ce.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):q.propHooks._default.set(this),this}},q.prototype.init.prototype=q.prototype,q.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=ce.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){ce.fx.step[e.prop]?ce.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[ce.cssProps[e.prop]]&&!ce.cssHooks[e.prop]?e.elem[e.prop]=e.now:ce.style(e.elem,e.prop,e.now+e.unit)}}},q.propHooks.scrollTop=q.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},ce.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},ce.fx=q.prototype.init,ce.fx.step={};var ut,ct,lt=/^(?:toggle|show|hide)$/,ft=/queueHooks$/;ce.Animation=ce.extend(B,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return p(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){ce.isFunction(e)?(t=e,e=["*"]):e=e.match(Ae);for(var n,r=0,i=e.length;r1)},removeAttr:function(e){return this.each(function(){ce.removeAttr(this,e)})}}),ce.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?ce.prop(e,t,n):(1===o&&ce.isXMLDoc(e)||(t=t.toLowerCase(),i=ce.attrHooks[t]||(ce.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void ce.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=ce.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!ae.radioValue&&"radio"===t&&ce.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(Ae);if(o&&1===e.nodeType)for(;n=o[i++];)r=ce.propFix[n]||n,ce.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)}}),ht={set:function(e,t,n){return t===!1?ce.removeAttr(e,n):e.setAttribute(n,n),n}},ce.each(ce.expr.match.bool.source.match(/\w+/g),function(e,t){var n=pt[t]||ce.find.attr;pt[t]=function(e,t,r){var i,o;return r||(o=pt[t],pt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,pt[t]=o),i}});var dt=/^(?:input|select|textarea|button)$/i,vt=/^(?:a|area)$/i;ce.fn.extend({prop:function(e,t){return Ce(this,ce.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[ce.propFix[e]||e]})}}),ce.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&ce.isXMLDoc(e)||(t=ce.propFix[t]||t,i=ce.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=ce.find.attr(e,"tabindex");return t?parseInt(t,10):dt.test(e.nodeName)||vt.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),ae.optSelected||(ce.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),ce.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){ce.propFix[this.toLowerCase()]=this});var gt=/[\t\r\n\f]/g;ce.fn.extend({addClass:function(e){var t,n,r,i,o,s,a,u=0;if(ce.isFunction(e))return this.each(function(t){ce(this).addClass(e.call(this,t,U(this)))});if("string"==typeof e&&e)for(t=e.match(Ae)||[];n=this[u++];)if(i=U(n),r=1===n.nodeType&&(" "+i+" ").replace(gt," ")){for(s=0;o=t[s++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");a=ce.trim(r),i!==a&&n.setAttribute("class",a)}return this},removeClass:function(e){var t,n,r,i,o,s,a,u=0;if(ce.isFunction(e))return this.each(function(t){ce(this).removeClass(e.call(this,t,U(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(Ae)||[];n=this[u++];)if(i=U(n),r=1===n.nodeType&&(" "+i+" ").replace(gt," ")){for(s=0;o=t[s++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");a=ce.trim(r),i!==a&&n.setAttribute("class",a)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):ce.isFunction(e)?this.each(function(n){ce(this).toggleClass(e.call(this,n,U(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=ce(this),o=e.match(Ae)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=U(this),t&&je.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||e===!1?"":je.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+U(n)+" ").replace(gt," ").indexOf(t)>-1)return!0;return!1}});var yt=/\r/g,mt=/[\x20\t\r\n\f]+/g;ce.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=ce.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,ce(this).val()):e,null==i?i="":"number"==typeof i?i+="":ce.isArray(i)&&(i=ce.map(i,function(e){return null==e?"":e+""})),t=ce.valHooks[this.type]||ce.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=ce.valHooks[i.type]||ce.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(yt,""):null==n?"":n)}}}),ce.extend({valHooks:{option:{get:function(e){var t=ce.find.attr(e,"value");return null!=t?t:ce.trim(ce.text(e)).replace(mt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,s=o?null:[],a=o?i+1:r.length,u=i<0?a:o?i:0;u-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),ce.each(["radio","checkbox"],function(){ce.valHooks[this]={set:function(e,t){if(ce.isArray(t))return e.checked=ce.inArray(ce(e).val(),t)>-1}},ae.checkOn||(ce.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var bt=/^(?:focusinfocus|focusoutblur)$/;ce.extend(ce.event,{trigger:function(e,t,r,i){var o,s,a,u,c,l,f,h=[r||Z],p=se.call(e,"type")?e.type:e,d=se.call(e,"namespace")?e.namespace.split("."):[];if(s=a=r=r||Z,3!==r.nodeType&&8!==r.nodeType&&!bt.test(p+ce.event.triggered)&&(p.indexOf(".")>-1&&(d=p.split("."),p=d.shift(),d.sort()),c=p.indexOf(":")<0&&"on"+p,e=e[ce.expando]?e:new ce.Event(p,"object"==typeof e&&e),e.isTrigger=i?2:3,e.namespace=d.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=r),t=null==t?[e]:ce.makeArray(t,[e]),f=ce.event.special[p]||{}, i||!f.trigger||f.trigger.apply(r,t)!==!1)){if(!i&&!f.noBubble&&!ce.isWindow(r)){for(u=f.delegateType||p,bt.test(u+p)||(s=s.parentNode);s;s=s.parentNode)h.push(s),a=s;a===(r.ownerDocument||Z)&&h.push(a.defaultView||a.parentWindow||n)}for(o=0;(s=h[o++])&&!e.isPropagationStopped();)e.type=o>1?u:f.bindType||p,l=(je.get(s,"events")||{})[e.type]&&je.get(s,"handle"),l&&l.apply(s,t),l=c&&s[c],l&&l.apply&&ke(s)&&(e.result=l.apply(s,t),e.result===!1&&e.preventDefault());return e.type=p,i||e.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),t)!==!1||!ke(r)||c&&ce.isFunction(r[p])&&!ce.isWindow(r)&&(a=r[c],a&&(r[c]=null),ce.event.triggered=p,r[p](),ce.event.triggered=void 0,a&&(r[c]=a)),e.result}},simulate:function(e,t,n){var r=ce.extend(new ce.Event,n,{type:e,isSimulated:!0});ce.event.trigger(r,null,t)}}),ce.fn.extend({trigger:function(e,t){return this.each(function(){ce.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return ce.event.trigger(e,t,n,!0)}}),ce.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){ce.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),ce.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),ae.focusin="onfocusin"in n,ae.focusin||ce.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){ce.event.simulate(t,e.target,ce.event.fix(e))};ce.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=je.access(r,t);i||r.addEventListener(e,n,!0),je.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=je.access(r,t)-1;i?je.access(r,t,i):(r.removeEventListener(e,n,!0),je.remove(r,t))}}});var wt=n.location,xt=ce.now(),Et=/\?/;ce.parseJSON=function(e){return JSON.parse(e+"")},ce.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new n.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||ce.error("Invalid XML: "+e),t};var Tt=/#.*$/,St=/([?&])_=[^&]*/,At=/^(.*?):[ \t]*([^\r\n]*)$/gm,_t=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ct=/^(?:GET|HEAD)$/,kt=/^\/\//,jt={},Ot={},Nt="*/".concat("*"),Rt=Z.createElement("a");Rt.href=wt.href,ce.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:wt.href,type:"GET",isLocal:_t.test(wt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Nt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":ce.parseJSON,"text xml":ce.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?J(J(e,ce.ajaxSettings),t):J(ce.ajaxSettings,e)},ajaxPrefilter:z(jt),ajaxTransport:z(Ot),ajax:function(e,t){function r(e,t,r,a){var c,f,m,b,x,T=t;2!==w&&(w=2,u&&n.clearTimeout(u),i=void 0,s=a||"",E.readyState=e>0?4:0,c=e>=200&&e<300||304===e,r&&(b=X(h,E,r)),b=G(h,b,E,c),c?(h.ifModified&&(x=E.getResponseHeader("Last-Modified"),x&&(ce.lastModified[o]=x),x=E.getResponseHeader("etag"),x&&(ce.etag[o]=x)),204===e||"HEAD"===h.type?T="nocontent":304===e?T="notmodified":(T=b.state,f=b.data,m=b.error,c=!m)):(m=T,!e&&T||(T="error",e<0&&(e=0))),E.status=e,E.statusText=(t||T)+"",c?v.resolveWith(p,[f,T,E]):v.rejectWith(p,[E,T,m]),E.statusCode(y),y=void 0,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[E,h,c?f:m]),g.fireWith(p,[E,T]),l&&(d.trigger("ajaxComplete",[E,h]),--ce.active||ce.event.trigger("ajaxStop")))}"object"==typeof e&&(t=e,e=void 0),t=t||{};var i,o,s,a,u,c,l,f,h=ce.ajaxSetup({},t),p=h.context||h,d=h.context&&(p.nodeType||p.jquery)?ce(p):ce.event,v=ce.Deferred(),g=ce.Callbacks("once memory"),y=h.statusCode||{},m={},b={},w=0,x="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(2===w){if(!a)for(a={};t=At.exec(s);)a[t[1].toLowerCase()]=t[2];t=a[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===w?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return w||(e=b[n]=b[n]||e,m[e]=t),this},overrideMimeType:function(e){return w||(h.mimeType=e),this},statusCode:function(e){var t;if(e)if(w<2)for(t in e)y[t]=[y[t],e[t]];else E.always(e[E.status]);return this},abort:function(e){var t=e||x;return i&&i.abort(t),r(0,t),this}};if(v.promise(E).complete=g.add,E.success=E.done,E.error=E.fail,h.url=((e||h.url||wt.href)+"").replace(Tt,"").replace(kt,wt.protocol+"//"),h.type=t.method||t.type||h.method||h.type,h.dataTypes=ce.trim(h.dataType||"*").toLowerCase().match(Ae)||[""],null==h.crossDomain){c=Z.createElement("a");try{c.href=h.url,c.href=c.href,h.crossDomain=Rt.protocol+"//"+Rt.host!=c.protocol+"//"+c.host}catch(e){h.crossDomain=!0}}if(h.data&&h.processData&&"string"!=typeof h.data&&(h.data=ce.param(h.data,h.traditional)),V(jt,h,t,E),2===w)return E;l=ce.event&&h.global,l&&0===ce.active++&&ce.event.trigger("ajaxStart"),h.type=h.type.toUpperCase(),h.hasContent=!Ct.test(h.type),o=h.url,h.hasContent||(h.data&&(o=h.url+=(Et.test(o)?"&":"?")+h.data,delete h.data),h.cache===!1&&(h.url=St.test(o)?o.replace(St,"$1_="+xt++):o+(Et.test(o)?"&":"?")+"_="+xt++)),h.ifModified&&(ce.lastModified[o]&&E.setRequestHeader("If-Modified-Since",ce.lastModified[o]),ce.etag[o]&&E.setRequestHeader("If-None-Match",ce.etag[o])),(h.data&&h.hasContent&&h.contentType!==!1||t.contentType)&&E.setRequestHeader("Content-Type",h.contentType),E.setRequestHeader("Accept",h.dataTypes[0]&&h.accepts[h.dataTypes[0]]?h.accepts[h.dataTypes[0]]+("*"!==h.dataTypes[0]?", "+Nt+"; q=0.01":""):h.accepts["*"]);for(f in h.headers)E.setRequestHeader(f,h.headers[f]);if(h.beforeSend&&(h.beforeSend.call(p,E,h)===!1||2===w))return E.abort();x="abort";for(f in{success:1,error:1,complete:1})E[f](h[f]);if(i=V(Ot,h,t,E)){if(E.readyState=1,l&&d.trigger("ajaxSend",[E,h]),2===w)return E;h.async&&h.timeout>0&&(u=n.setTimeout(function(){E.abort("timeout")},h.timeout));try{w=1,i.send(m,r)}catch(e){if(!(w<2))throw e;r(-1,e)}}else r(-1,"No Transport");return E},getJSON:function(e,t,n){return ce.get(e,t,n,"json")},getScript:function(e,t){return ce.get(e,void 0,t,"script")}}),ce.each(["get","post"],function(e,t){ce[t]=function(e,n,r,i){return ce.isFunction(n)&&(i=i||r,r=n,n=void 0),ce.ajax(ce.extend({url:e,type:t,dataType:i,data:n,success:r},ce.isPlainObject(e)&&e))}}),ce._evalUrl=function(e){return ce.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,throws:!0})},ce.fn.extend({wrapAll:function(e){var t;return ce.isFunction(e)?this.each(function(t){ce(this).wrapAll(e.call(this,t))}):(this[0]&&(t=ce(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return ce.isFunction(e)?this.each(function(t){ce(this).wrapInner(e.call(this,t))}):this.each(function(){var t=ce(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=ce.isFunction(e);return this.each(function(n){ce(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){ce.nodeName(this,"body")||ce(this).replaceWith(this.childNodes)}).end()}}),ce.expr.filters.hidden=function(e){return!ce.expr.filters.visible(e)},ce.expr.filters.visible=function(e){return e.offsetWidth>0||e.offsetHeight>0||e.getClientRects().length>0};var Dt=/%20/g,Mt=/\[\]$/,Lt=/\r?\n/g,It=/^(?:submit|button|image|reset|file)$/i,qt=/^(?:input|select|textarea|keygen)/i;ce.param=function(e,t){var n,r=[],i=function(e,t){t=ce.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=ce.ajaxSettings&&ce.ajaxSettings.traditional),ce.isArray(e)||e.jquery&&!ce.isPlainObject(e))ce.each(e,function(){i(this.name,this.value)});else for(n in e)Y(n,e[n],t,i);return r.join("&").replace(Dt,"+")},ce.fn.extend({serialize:function(){return ce.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=ce.prop(this,"elements");return e?ce.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!ce(this).is(":disabled")&&qt.test(this.nodeName)&&!It.test(e)&&(this.checked||!qe.test(e))}).map(function(e,t){var n=ce(this).val();return null==n?null:ce.isArray(n)?ce.map(n,function(e){return{name:t.name,value:e.replace(Lt,"\r\n")}}):{name:t.name,value:n.replace(Lt,"\r\n")}}).get()}}),ce.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(e){}};var Ft={0:200,1223:204},Pt=ce.ajaxSettings.xhr();ae.cors=!!Pt&&"withCredentials"in Pt,ae.ajax=Pt=!!Pt,ce.ajaxTransport(function(e){var t,r;if(ae.cors||Pt&&!e.crossDomain)return{send:function(i,o){var s,a=e.xhr();if(a.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(s in e.xhrFields)a[s]=e.xhrFields[s];e.mimeType&&a.overrideMimeType&&a.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");for(s in i)a.setRequestHeader(s,i[s]);t=function(e){return function(){t&&(t=r=a.onload=a.onerror=a.onabort=a.onreadystatechange=null,"abort"===e?a.abort():"error"===e?"number"!=typeof a.status?o(0,"error"):o(a.status,a.statusText):o(Ft[a.status]||a.status,a.statusText,"text"!==(a.responseType||"text")||"string"!=typeof a.responseText?{binary:a.response}:{text:a.responseText},a.getAllResponseHeaders()))}},a.onload=t(),r=a.onerror=t("error"),void 0!==a.onabort?a.onabort=r:a.onreadystatechange=function(){4===a.readyState&&n.setTimeout(function(){t&&r()})},t=t("abort");try{a.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}}),ce.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return ce.globalEval(e),e}}}),ce.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),ce.ajaxTransport("script",function(e){if(e.crossDomain){var t,n;return{send:function(r,i){t=ce(" ================================================ FILE: examples/todo/keycode.js ================================================ export const ENTER = 13; export const ESC = 27; ================================================ FILE: examples/todo/main.js ================================================ import Woowahan from '../../index'; import TodoApp from './view/todo-app'; import { LOAD_TODOS } from './action'; import * as Reducers from './reducer/todos'; global.$ = global.jQuery = Woowahan.$; const app = new Woowahan(); app.use(Woowahan.Store.create({ todos: [] })); app.use(Reducers); app.dispatch(Woowahan.Action.create(LOAD_TODOS), () => { app.start({ url: '*filter', container: '.todoapp', view: TodoApp }); }); ================================================ FILE: examples/todo/package.json ================================================ { "name": "todo", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "build": "gulp build", "demo-server": "node ./node_modules/http-server/bin/http-server dist" }, "author": "", "license": "MIT", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^6.0.1", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "dexie": "^1.5.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-sass": "^2.3.1", "gulp-size": "^1.2.0", "gulp-stylus": "^2.0.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.3", "handlebars-loader": "^1.1.4", "http-server": "^0.9.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "request": "^2.72.0", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^2.1.1" }, "dependencies": { "todomvc-app-css": "^2.0.6", "todomvc-common": "^1.0.2" } } ================================================ FILE: examples/todo/reducer/todos.js ================================================ import Woowahan from '../../../index'; import Dexie from 'dexie'; import * as Action from '../action'; import TodoSchema from '../schema/todo'; var TodoDB = new Dexie('todos'); TodoDB.version(1).stores({ todos: "++id,title,completed" }); TodoDB.open(); const LoadTodos = Woowahan.Reducer.create(Action.LOAD_TODOS, function() { TodoDB.todos.toCollection().each(todo => { this.getStates().todos.push(todo); }).then(() => this.finish(this.getStates().todos)); }); const AllTodos = Woowahan.Reducer.create(Action.ALL_TODOS, function() { this.finish(this.getStates().todos); }); const NewTodo = Woowahan.Reducer.create(Action.NEW_TODO, TodoSchema, function(todo) { todo.completed = false; TodoDB.todos.add(todo).then(id => { todo.id = id; this.getStates().todos.push(todo); this.finish(this.getStates().todos); }); }); const CompletedTodo = Woowahan.Reducer.create(Action.COMPLETED_TODO, function(todo) { let todos = this.getStates().todos; todos.forEach(item => { if (item.id === todo.id) item.completed = todo.completed; }); TodoDB.todos.put(todo); this.finish(todo); }); const AllCompleted = Woowahan.Reducer.create(Action.ALL_COMPLETED, function(options) { this.getStates().todos.forEach(item => { if (!item.completed) { item.completed = true; } }); this.finish(this.getStates().todos); }); const DeleteTodo = Woowahan.Reducer.create(Action.DELETE_TODO, function(todo) { let matchIndex = -1; let states = this.getStates(); states.todos.forEach((item, index) => { if (item.id === todo.id) { matchIndex = index; } }); TodoDB.todos.delete(states.todos[matchIndex].id); states.todos.splice(matchIndex, 1); this.finish(); }); const EditTodo = Woowahan.Reducer.create(Action.EDIT_TODO, function(todo) { let todos = this.getStates().todos; todos.forEach(item => { if (item.id === todo.id) item.title = todo.title; }); TodoDB.todos.put(todo); this.finish(todo); }); export { LoadTodos, AllTodos, NewTodo, CompletedTodo, AllCompleted, DeleteTodo, EditTodo }; ================================================ FILE: examples/todo/schema/todo.js ================================================ import Woowahan from '../../../index'; export default Woowahan.Schema.create('TodoSchema', { title: Woowahan.Types.String({ required: true, min: 1 }) }); ================================================ FILE: examples/todo/template/todo-app.hbs ================================================

              todos

                ================================================ FILE: examples/todo/template/todo-item.hbs ================================================
                ================================================ FILE: examples/todo/template/todo-state.hbs ================================================ item{{#if items}}s{{/if}} left
                • All
                • Active
                • Completed
                {{#if completed}}> {{/if}} ================================================ FILE: examples/todo/view/todo-app.js ================================================ import Woowahan from '../../../index'; import Template from '../template/todo-app.hbs'; import TodoItem from './todo-item'; import TodoState from './todo-state'; import * as KeyCode from '../keycode'; import { ALL_TODOS, NEW_TODO, ALL_COMPLETED } from '../action/'; export default Woowahan.CollectionView.create('TodoApp', { template: Template, events: { '@keypress .new-todo': 'createOnEnter(.new-todo)', '@toggle': 'updateState', '@removetodo': 'updateState' }, rowContainer: '.todo-list', rowView: TodoItem, initialize() { this.setModel({ remaining: 0, filter: this.params.filter }); this.super(); }, updateFooterView() { this.updateView('.footer', TodoState, this.getModel()); }, viewDidMount() { this.dispatch(Woowahan.Action.create(ALL_TODOS), this.loadTodos); }, loadTodos(todos) { let activeTodos = todos.filter(todo => !todo.completed); let completedTodos = todos.filter(todo => todo.completed); let filter = this.params.filter; this.setModel({ remaining: activeTodos.length, filter: filter }); this.$el.find('.new-todo').val(''); switch(filter) { case 'active': this.reload(activeTodos); break; case 'completed': this.reload(completedTodos); break; default: this.reload(todos); } this.updateFooterView(); }, updateState() { this.setModel({ remaining: this.getStates().todos.filter(todo => !todo.completed).length }); this.updateFooterView(); }, createOnEnter(title, event) { if (event.keyCode === KeyCode.ENTER) { this.dispatch(Woowahan.Action.create(NEW_TODO, { title }), this.loadTodos); } }, toggleAllComplete() { this.dispatch(Woowahan.Action.create(ALL_COMPLETED), this.loadTodos); } }); ================================================ FILE: examples/todo/view/todo-item.js ================================================ import Woowahan from '../../../index'; import Template from '../template/todo-item.hbs'; import { COMPLETED_TODO, DELETE_TODO, EDIT_TODO } from '../action'; import * as KeyCode from '../keycode'; export default Woowahan.ItemView.create('TodoItem', { template: Template, events: { 'click .toggle': 'toggleCompleted', 'dblclick label': 'edit', 'click .destroy': 'clear', '@keypress .edit': 'updateOnEnter(.edit)', '@keydown .edit': 'revertOnEscape(.edit)', 'blur .edit': 'closeEdit' }, selfUpdate(todo) { this.dispatch(Woowahan.Event.create('toggle')); this.setModel(todo); this.updateView(); }, toggleCompleted() { this.setModel({ completed: !this.getModel('completed') }); this.dispatch(Woowahan.Action.create(COMPLETED_TODO, this.getModel()), this.selfUpdate); }, edit() { this.$el.find('li').addClass('editing'); }, closeEdit() { this.$el.find('li').removeClass('editing'); }, clear() { this.dispatch(Woowahan.Action.create(DELETE_TODO, this.getModel()), this.close); }, revertOnEscape(value, event) { if (event.keyCode === KeyCode.ESC) { let title = this.getModel('title'); this.setModel({ title: value }); this.setModel({ title }); this.$el.find('li').removeClass('editing'); } }, updateOnEnter(value, event) { if (event.keyCode === KeyCode.ENTER) { this.setModel({ title: value }); this.dispatch(Woowahan.Action.create(EDIT_TODO, this.getModel()), this.selfUpdate); } }, viewWillUnmount() { this.dispatch(Woowahan.Event.create('removetodo')); } }); ================================================ FILE: examples/todo/view/todo-state.js ================================================ import Woowahan from '../../../index'; import Template from '../template/todo-state.hbs'; export default Woowahan.View.create('TodoState', { template: Template, initialize(model) { this.setModel(model); this.super(); }, viewWillMount(renderData) { renderData.items = renderData.remaining > 1; renderData.all = !renderData.filter; renderData.active = renderData.filter === 'active'; renderData.completed = renderData.filter === 'completed'; return renderData; } }); ================================================ FILE: examples/todo/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; var uglifyJsPlugin = new webpack.optimize.UglifyJsPlugin({ compressor: { screw_ie8: true, warnings: false }, output: { comments: false } }); module.exports.development = { debug : true, devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.css$/, exclude: /node_modules/, loader: 'css-loader' }, { test: /\.hbs$/, exclude: /node_modules/, loader: 'handlebars-loader'} ] } }; module.exports.production = { debug: false, entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.css$/, exclude: /node_modules/, loader: 'css-loader' }, { test: /\.hbs$/, exclude: /node_modules/, loader: 'handlebars-loader'} ] }, plugins: [ uglifyJsPlugin ] }; ================================================ FILE: examples/transition/.babelrc ================================================ { "presets": ["es2015"] } ================================================ FILE: examples/transition/gulpfile.js ================================================ var path = require('path'); var _ = require('lodash'); var gulp = require('gulp'); var del = require('del'); var $ = require('gulp-load-plugins')({ pattern: '*' }); var webpackConfig = require('./webpack.config.js'); gulp.task('scripts', () => { return gulp.src(webpackConfig.entry) .pipe($.webpackStream(webpackConfig)) .pipe(gulp.dest(path.resolve(__dirname, 'dist', 'js'))) .pipe($.size({ title : 'js' })) .pipe($.size()); }); gulp.task('html', () => { return gulp.src(path.resolve(__dirname, 'index.html')) .pipe(gulp.dest(path.resolve(__dirname, 'dist'))) .pipe($.size({ title : 'html' })); }); gulp.task('clean', (cb) => { del(['dist'], cb); }); gulp.task('default', ['clean'], () => gulp.start('build')); gulp.task('build', ['clean'], () => gulp.start(['scripts', 'html'])); ================================================ FILE: examples/transition/index.html ================================================ WoowahanJS
                ================================================ FILE: examples/transition/main.js ================================================ import Woowahan from '../../index'; import { MainLayout } from './view/layout/main-layout'; import { BaseView } from './view/component'; import Debug from 'debug'; global.$ = global.jQuery = Woowahan.$; Debug.enable('*'); var app = new Woowahan(); app.use(Woowahan.Layout('#content', MainLayout)); app.start([ { url: '/', container: '#mainContent', view: BaseView, layout: 'MainLayout' } ]); // app.start({ // url: '/', // container: '#content', // view: HelloView // }); ================================================ FILE: examples/transition/package.json ================================================ { "name": "transition", "version": "1.0.0", "description": "transition example", "main": "main.js", "scripts": { "build": "gulp build", "demo-server": "node ./node_modules/http-server/bin/http-server dist" }, "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.1.2", "babel-loader": "^6.0.1", "babel-preset-es2015": "^6.1.2", "css-loader": "^0.23.1", "del": "^1.1.1", "gulp": "^3.8.11", "gulp-autoprefixer": "^2.1.0", "gulp-if": "^2.0.1", "gulp-load-plugins": "1.0.0", "gulp-notify": "^2.2.0", "gulp-plumber": "^1.1.0", "gulp-sass": "^2.3.1", "gulp-size": "^1.2.0", "gulp-stylus": "^2.0.0", "gulp-util": "^3.0.3", "gulp-watch": "^4.1.1", "handlebars": "^4.0.3", "handlebars-loader": "^1.1.4", "http-server": "^0.9.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "nodemon": "^1.9.2", "request": "^2.72.0", "style-loader": "^0.13.1", "webpack": "^1.12.3", "webpack-dev-middleware": "^1.0.11", "webpack-stream": "^2.1.1" }, "dependencies": {} } ================================================ FILE: examples/transition/view/component/base-view.hbs ================================================

                this is base view

                ================================================ FILE: examples/transition/view/component/base-view.js ================================================ import Woowahan from '../../../../index'; import Template from './base-view.hbs'; export const BaseView = Woowahan.View.create('BaseView', { template: Template, startTransition() { const _this = this; let num = 0; (function transition() { ++num; _this.setModel({ num }); _this.refs.colorBox.style.backgroundColor = `rgba(0, 0, 0, ${num / 100})`; if (num < 100) { setTimeout(transition, 10); } else { _this.dispatch(Woowahan.Event.create('transitionComplete')); } })(); } }); ================================================ FILE: examples/transition/view/component/index.js ================================================ export * from './base-view'; ================================================ FILE: examples/transition/view/layout/main-layout.hbs ================================================

                This is MainLayout

                ================================================ FILE: examples/transition/view/layout/main-layout.js ================================================ import Woowahan from '../../../../index'; import Template from './main-layout.hbs'; export const MainLayout = Woowahan.View.create('MainLayout', { template: Template, events: { '@viewDidMount': 'onViewMount', '@transitionComplete': 'onCompleteTransition' }, onViewMount(view) { this.log(`mount된 view: ${view.viewname}`); switch (view.viewname) { case 'BaseView': view.startTransition(); break; } }, onCompleteTransition() { this.log('transition complete'); } }); ================================================ FILE: examples/transition/webpack.config.js ================================================ var webpack = require('webpack'); var entry = './main.js'; var output = { path: __dirname, filename: 'bundle.js' }; module.exports = { debug : true, devtool: 'cheap-module-eval-source-map', entry: entry, output: output, module : { loaders : [ { test: /\.js?$/, exclude: /node_modules/, loader: 'babel-loader' }, { test: /\.hbs$/, exclude: /node_modules/, loader: 'handlebars-loader'} ] } }; ================================================ FILE: index.js ================================================ module.exports = require('./src/woowahan'); ================================================ FILE: lib/action.js ================================================ 'use strict'; module.exports = { create: function create(type) { var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; return { wwtype: 'action', type: type, data: data }; } }; ================================================ FILE: lib/collection-view.js ================================================ 'use strict'; function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var Collection = require('backbone').Collection; var Woowahan = require('./woowahan'); var events = require('./events'); var ListViewEvents = [events.SELECTED_ROW, events.SELECTED_CELL]; var CollectionView = void 0; var app = void 0; CollectionView = Woowahan.View.create('CollectionView', { super: function _super() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } CollectionView.prototype.initialize.apply(this, args); }, initialize: function initialize() { this.collection = this.collection || new Collection(); this.collection.on('add', this.addRowView, this); this.rowViews = []; this.reverse = false; for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } Woowahan.View.prototype.initialize.apply(this, args); }, viewWillUnmount: function viewWillUnmount() { var model = void 0; while (model = this.collection.first()) { this.collection.remove(model); } this.rowViews = []; }, addRowView: function addRowView(model) { var _this = this; var container = this.$(this.rowContainer); if (!container.length) { container = this.$el; if (!this.$el.is(this.rowContainer)) { throw new Error('undefined rowContainer'); } } this.rowView.prototype.container = container; if (this.reverse) { this.rowView.prototype.prepend = true; } else { this.rowView.prototype.append = true; } var view = new this.rowView(model); this.rowViews.push(view); model.on('remove', function () { _this.rowViews.splice(_this.rowViews.indexOf(view), 1); view.close(); }, view); model.on('change', function (data) { view.setModel(data.toJSON()); view.updateView(); }, view); ListViewEvents.forEach(function (event) { return view.on(event, _this['on' + event.charAt(0).toUpperCase() + event.slice(1)], _this); }); }, reload: function reload() { var _this2 = this; var data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (Object.prototype.toString.call(options) !== '[object Object]') { throw new Error('invalid options!!!'); } var uid = options.uid; var renderData = data.filter(function (item) { return !!item; }).map(function (item) { if (!!uid) { var model = _this2.collection.findWhere(_defineProperty({}, uid, item[uid])); if (!!model) { model.set(item); return model; } } return item; }); this.reverse = 'reverse' in options ? options.reverse : false; this.collection.set(renderData, { remove: 'reset' in options ? options.reset : true }); }, getCollection: function getCollection() { return this.rowViews.map(function (view) { return view.getModel(); }); }, onSelectedRow: function onSelectedRow() { this.log('selectedRow'); }, onSelectedCell: function onSelectedCell() { this.log('selectedCell'); }, onAction: function onAction() { this.log('onAction'); }, onClose: function onClose() { this.rowViews.forEach(function (row) { return row.close(); }); } }); CollectionView.create = function (viewName, options) { var view = CollectionView.extend(options); view.viewname = viewName; Object.defineProperty(view.prototype, 'viewname', { value: viewName, writable: false }); return view; }; module.exports = function (toolset) { if (!app) { app = toolset; } return CollectionView; }; ================================================ FILE: lib/component.js ================================================ 'use strict'; module.exports = function (name, view) { return { view: view, name: name, viewName: view.viewname, wwtype: 'component' }; }; ================================================ FILE: lib/error.js ================================================ 'use strict'; module.exports = { create: function create(message, target) { return { wwtype: 'error', code: 1, message: message, target: target }; } }; ================================================ FILE: lib/event.js ================================================ 'use strict'; module.exports = { create: function create(type) { for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return { wwtype: 'event', type: type, data: args }; } }; ================================================ FILE: lib/events.js ================================================ 'use strict'; module.exports = { SELECTED_ROW: 'selectedRow', SELECTED_CELL: 'selectedCell' }; ================================================ FILE: lib/item-view.js ================================================ 'use strict'; var Woowahan = require('./woowahan'); var events = require('./events'); var ItemView = void 0; var app = void 0; ItemView = Woowahan.View.create('ItemView', { events: { 'click': '_onSelectedRow' }, super: function _super() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } ItemView.prototype.initialize.apply(this, args); }, initialize: function initialize() { for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } Woowahan.View.prototype.initialize.apply(this, args); }, _onSelectedRow: function _onSelectedRow(event) { if (this.onSelectedRow && typeof this.onSelectedRow === 'function') { this.onSelectedRow(event, function () { for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } this.trigger.apply(this, Array.prototype.concat.call([], events.SELECTED_ROW, args)); }.bind(this)); } }, _onSelectedCell: function _onSelectedCell(event) { if (this.onSelectedCell && typeof this.onSelectedCell === 'function') { this.onSelectedRow(event, function () { for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { args[_key4] = arguments[_key4]; } this.trigger.apply(this, Array.prototype.concat.call([], events.SELECTED_CELL, args)); }.bind(this)); } } }); ItemView.create = function (viewName, options) { var view = ItemView.extend(options); view.viewname = viewName; Object.defineProperty(view.prototype, 'viewname', { value: viewName, writable: false }); return view; }; module.exports = function (toolset) { if (!app) { app = toolset; } return ItemView; }; ================================================ FILE: lib/layout.js ================================================ 'use strict'; module.exports = function (container, view, options) { return { view: view, container: container, options: Object.assign({ update: true }, options), viewName: view.viewname, wwtype: 'layout' }; }; ================================================ FILE: lib/middleware.js ================================================ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } var MIDDLEWARE = exports.MIDDLEWARE = { APP: 'app', VIEW: 'view', REDUCER: 'reducer', ROUTER: 'router' }; var MIDDLEWARE_PROTOCOL = exports.MIDDLEWARE_PROTOCOL = { BEFORE: 'before', AFTER: 'after', UNMOUNT: 'unmount' }; var queue = []; var _isRunning = false; var MiddlewareRunner = exports.MiddlewareRunner = { get isRunning() { return _isRunning; }, run: function run(middlewares, protocol, params, callback, preprocess) { if (!Array.isArray(middlewares) || typeof protocol !== 'string') throw new Error('MiddlewareRunner arguments error'); if (_isRunning) { queue.push([middlewares, protocol, params, callback, preprocess]); return; } _isRunning = true; var featuresLen = params.length; var index = 0; var next = function next() { var curr = middlewares[index++]; if (curr) { var middleware = curr[protocol]; if (middleware.length > featuresLen) { middleware.call.apply(middleware, [curr].concat(_toConsumableArray(params), [next])); } else { middleware.call.apply(middleware, [curr].concat(_toConsumableArray(params))); setTimeout(next, 1); } } else { !!callback && callback(); var task = queue.shift(); _isRunning = false; if (!!task) { MiddlewareRunner.run.apply(MiddlewareRunner, _toConsumableArray(task)); } } }; if (typeof preprocess === 'function') preprocess(); next(); } }; ================================================ FILE: lib/plugin/checkbox.js ================================================ 'use strict'; module.exports = function (element, value) { $(element).prop('checked', !!value); }; ================================================ FILE: lib/plugin/input-text.js ================================================ "use strict"; module.exports = function (element, value) { $(element).val(value); }; ================================================ FILE: lib/plugin/select.js ================================================ 'use strict'; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); module.exports = function (element, value) { var selectedIndex = 0; var opts = void 0; if (Array.isArray(value)) { if (!value.length) { return; } else { opts = Array.from(value); } } else { if (typeof value === 'undefined') { return; } else { opts = Array.from([value]); } } element.innerHTML = ''; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = opts.entries()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var _step$value = _slicedToArray(_step.value, 2), index = _step$value[0], opt = _step$value[1]; var label = void 0; var val = void 0; if (typeof opt === 'string') { label = opt; val = opt; } else { label = opt.label; val = opt.value; } if (!!opt.selected) { selectedIndex = index; } $(element).append(''); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } $(element).children('option').eq(selectedIndex).attr('selected', 'selected'); $(element).trigger('change'); }; ================================================ FILE: lib/plugin/text.js ================================================ "use strict"; module.exports = function (element, value) { $(element).text(value); }; ================================================ FILE: lib/plugin.js ================================================ 'use strict'; module.exports = function (type, plugin) { return { type: type, plugin: plugin, wwtype: 'plugin' }; }; ================================================ FILE: lib/popup-view.js ================================================ 'use strict'; var Woowahan = require('./woowahan'); var PopupView = void 0; var app = void 0; var zIndex = 1000; var defaultOverlayCss = { position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, background: '#000', opacity: 0.7 }; var defaultCss = { overflowY: 'auto', display: 'block', position: 'absolute', top: '50%', left: '50%', width: '80%', maxHeight: '80%', background: '#fff', webkitTransform: 'translate(-50%, -50%)', transform: 'translate(-50%, -50%)' }; PopupView = Woowahan.View.create('PopupView', { overlayClassName: '', overlayCss: {}, css: {}, showOverlay: true, useDefaultCss: true, super: function _super() { PopupView.prototype.initialize.apply(this, this.arguments); }, initialize: function initialize() { this.overlay = $('
                '); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } Woowahan.View.prototype.initialize.apply(this, args); }, viewComponentDidMount: function viewComponentDidMount($el) { var model = this.getModel(); Object.keys(model).map(function (key) { switch (key) { case 'css': case 'overlayCss': this[key] = Object.assign({}, this[key], model[key]); break; case 'overlayClassName': case 'showOverlay': case 'useDefaultCss': this[key] = model[key]; break; case 'buttons': var buttons = model.buttons; if (!this.events) { this.events = {}; } for (var button in buttons) { if (buttons.hasOwnProperty(button)) { this.events['click ' + button] = buttons[button].bind(this); } } this.delegateEvents(); break; } }.bind(this)); if (this.showOverlay) { var overlay = this.overlay; overlay.addClass(this.overlayClassName); overlay.css(Object.assign({ zIndex: zIndex }, defaultOverlayCss, this.overlayCss)); this.$el.parent().prepend(overlay); zIndex += 100; $(overlay).on('click', function () { this.dispatch(Woowahan.Event.create('overlayClicked', this)); }.bind(this)); } if (this.useDefaultCss) { $el.css(defaultCss); } $el.css(Object.assign({ zIndex: zIndex }, this.css)); zIndex += 100; } }); PopupView.create = function (viewName, options) { var view = PopupView.extend(options); view.viewname = viewName; Object.defineProperty(view.prototype, 'viewname', { value: viewName, writable: false }); return view; }; module.exports = function (toolset) { if (!app) { app = toolset; } return PopupView; }; ================================================ FILE: lib/reducer.js ================================================ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var MIDDLEWARE = require('./middleware').MIDDLEWARE; var MIDDLEWARE_PROTOCOL = require('./middleware').MIDDLEWARE_PROTOCOL; var MiddlewareRunner = require('./middleware').MiddlewareRunner; var defaultConfiguration = { timeout: 5000 }; var Reducer = void 0; var app = void 0; Reducer = { SUCCESS: 'SUCCESS', FAIL: 'FAIL', queueSuccess: [], queueFail: [], extend: function extend(protoProps) { var child = Object.assign({}, this); if (!!protoProps.onSuccess) { child.queueSuccess.push(protoProps.onSuccess); } if (!!protoProps.onFail) { child.queueFail.push(protoProps.onFail); } return child; }, create: function create(actionName, schema, handler) { var _this2 = this; if (typeof schema === 'function') { handler = schema; schema = void 0; } else { if ((typeof schema === 'undefined' ? 'undefined' : _typeof(schema)) === 'object' && schema.wwtype !== 'schema') { throw new Error('The second argument of reducer will only function, or schema objects.'); } } var _this = this; var Reducer = function Reducer(data, subscriber) { this._timestamp = Date.now(); this._id = actionName.toLowerCase() + this._timestamp; this.subscriber = subscriber; this.queueSuccess = []; this.queueFail = []; this.useraction(data); this.addAction(this._id); }; Reducer.wwtype = 'reducer'; Reducer.actionName = actionName; Reducer.schema = schema; var fn = Object.assign(Reducer.prototype, { onSuccess: _this.onSuccess, onFail: _this.onFail }); fn.useraction = handler; fn.id = function () { return _this2._id; }; fn.actionName = actionName; fn.createtime = function () { return _this2._timestamp; }; fn.addAction = function () { var _app; return (_app = app).addAction.apply(_app, arguments); }; fn.addError = function () { var _app2; return (_app2 = app).addError.apply(_app2, arguments); }; fn.removeAction = function () { var _app3; return (_app3 = app).removeAction.apply(_app3, arguments); }; fn.getStates = function () { var _app4; return (_app4 = app).getStates.apply(_app4, arguments); }; fn.setStates = function () { var _app5; return (_app5 = app).setStates.apply(_app5, arguments); }; fn.use = function (key, handlers) { switch (key) { case _this.SUCCESS: if (!handlers) return; if (Array.isArray(handlers)) { Array.prototype.push.apply(this.queueSuccess, handlers); } else { this.queueSuccess.push(handlers); } break; case _this.FAIL: if (!handlers) return; if (Array.isArray(handlers)) { Array.prototype.push.apply(this.queueFail, handlers); } else { this.queueFail.push(handlers); } break; default: throw new Error('undefined key'); } }; fn.loadScript = function (path, id) { if (!id) { id = path.toLowerCase(); } var script = $('script[id=' + id + ']'); if (!!script.length) { (this.onSuccess || this.success).call(this); return; } script = document.createElement('script'); document.getElementsByTagName('head')[0].appendChild(script); script.addEventListener('load', (this.onSuccess || this.success).bind(this)); script.addEventListener('error', (this.onFail || this.fail).bind(this)); script.id = id; script.type = 'text/javascript'; script.src = path; }; fn.requestData = function (url, settings) { var method = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'GET'; if ((typeof url === 'undefined' ? 'undefined' : _typeof(url)) === 'object') { settings = Object.assign({}, defaultConfiguration, { url: url }); } else { settings = Object.assign({}, defaultConfiguration, settings, { url: url }); } settings.type = method.toUpperCase(); var success = function success() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var queueSuccess = Array.prototype.concat.call(_this.queueSuccess, this.queueSuccess); var middlewares = app.getMiddleware(MIDDLEWARE.REDUCER, MIDDLEWARE_PROTOCOL.AFTER); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.AFTER, [app], function () { if (!!queueSuccess.length || !!this.onSuccess) { var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = queueSuccess[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var item = _step.value; item.apply(this, args); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } !!this.onSuccess && this.onSuccess.apply(this, args); } else { this.success.apply(this, args); } }.bind(this)); }; var fail = function fail() { for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } var queueFail = Array.prototype.concat.call(_this.queueFail, this.queueFail); var jqXHR = args[0]; var middlewares = app.getMiddleware(MIDDLEWARE.REDUCER, MIDDLEWARE_PROTOCOL.AFTER); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.AFTER, [app], function () { if (!!jqXHR) { args = [{ status: jqXHR.status, statusText: jqXHR.statusText || '', response: jqXHR.responseJSON || jqXHR.responseText }]; } if (!!queueFail.length || !!this.onFail) { var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = queueFail[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var item = _step2.value; item.apply(this, args); } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } !!this.onFail && this.onFail.apply(this, args); } else { this.fail.apply(this, args); } }.bind(this)); }; var middlewares = app.getMiddleware(MIDDLEWARE.REDUCER, MIDDLEWARE_PROTOCOL.BEFORE); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.BEFORE, [settings, app], function () { return $.ajax(settings).done(success.bind(this)).fail(fail.bind(this)); }.bind(this)); }; fn.getData = function (url, settings) { return this.requestData(url, settings, 'get'); }; fn.putData = function (url, settings) { return this.requestData(url, settings, 'put'); }; fn.postData = function (url, settings) { return this.requestData(url, settings, 'post'); }; fn.deleteData = function (url, settings) { return this.requestData(url, settings, 'delete'); }; fn.success = function (data) {}; fn.fail = function (request, error) { if ('abort' in request) { request.abort(); } this.removeAction(this._id); this.addError(error); }; fn.finish = function () { for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } this.subscriber && this.subscriber.apply(this, args); this.removeAction(this._id); }; fn.env = {}; fn.env.template = function (templateStr, env) { if (typeof templateStr !== 'string') return templateStr; var renderStr = templateStr; var variables = templateStr.match(/{{\w+}}/g); if (variables) { variables.forEach(function (v) { var attrName = v.replace('{{', '').replace('}}', ''); if (attrName in env) { renderStr = renderStr.replace(v, env[attrName]); } }); } return renderStr; }; return Reducer; } }; module.exports = function (toolset) { if (!app) { app = toolset; } return Reducer; }; ================================================ FILE: lib/router.js ================================================ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var MIDDLEWARE = require('./middleware').MIDDLEWARE; var MIDDLEWARE_PROTOCOL = require('./middleware').MIDDLEWARE_PROTOCOL; var MiddlewareRunner = require('./middleware').MiddlewareRunner; var app = void 0; function urlBuilder(path) { return function (params) { var url = path; if (!params) { return url; } if (Array.isArray(params)) { var keys = path.match(/\:\w+/g); if (keys.length !== params.length) { console.error('It does not match the required input values.'); return url; } keys.forEach(function (key, index) { url = url.replace(key, encodeURIComponent(params[index])); }); return url; } if ((typeof params === 'undefined' ? 'undefined' : _typeof(params)) === 'object') { for (var key in params) { if (params.hasOwnProperty(key)) { url = url.replace(':' + key, encodeURIComponent(params[key])); } } return url; } console.error('Invalid params type'); return url; }; } module.exports = { routeTables: {}, settings: null, layouts: [], currentView: '', currentLayout: '', bindLayout: function bindLayout(layout) { this.layouts.push(layout); }, design: function design(pages) { var settings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var toolset = arguments[2]; this.settings = settings; this.router = null; app = toolset; this.bindRouter(Array.isArray(pages) ? pages : [pages]); }, bindRouter: function bindRouter(pages) { var _this = this; var options = { routes: {} }; var page = void 0, routeId = void 0; pages = Array.from(pages); while (!!pages.length) { page = pages.shift(); this.routeTables[page.routeName || page.view.viewname] = urlBuilder(page.url); page.originUrl = page.url; if (page.url.startsWith('/')) { page.url = page.url.substr(1); } routeId = 'r' + page.url.toLowerCase() + Date.now(); options.routes[page.url] = routeId; options[routeId] = function (page) { for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } var currentHref = window.location.href; var pageFeature = Object.assign({}, page); if (!!pageFeature.view) delete pageFeature.view; if (!!pageFeature.pages) delete pageFeature.pages; var middlewares = app.getMiddleware(MIDDLEWARE.ROUTER, MIDDLEWARE_PROTOCOL.BEFORE); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.BEFORE, [pageFeature, app], function () { if (currentHref !== window.location.href) return; var params = {}; var query = {}; var idx = 0; if (page.url.startsWith('*')) { params[page.url.split('*')[1]] = args[0]; } else { var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = page.url.split('/')[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var part = _step.value; if (part.startsWith(':')) { params[part.substr(1)] = decodeURIComponent(args[idx]); ++idx; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } } var queryStr = decodeURIComponent(args[args.length - 1] || (window.location.search || '').substr(1)); if (!!queryStr && !!~queryStr.indexOf('=')) { var queryArr = queryStr.split('&'); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = queryArr[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var q = _step2.value; var arr = q.split('='); if (arr.length === 2) { query[arr[0]] = arr[1]; } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } } if (!!page.layout) { var layout = this.layouts.find(function (layout) { return layout.viewName === page.layout; }); if (!this.currentLayout || this.currentLayout.viewname !== page.layout) { if (!!layout) { !!this.currentLayout && this.currentLayout.close(); layout.view.prototype.params = params; layout.view.prototype.query = query; layout.view.prototype.container = layout.container; this.currentLayout = new layout.view(); } } else { if (layout.options.update) { this.currentLayout['params'] = params; this.currentLayout['query'] = query; this.currentLayout.updateView(); } } } page.view.prototype.params = params; page.view.prototype.query = query; page.view.prototype.container = page.container; var view = new page.view(); if (!!this.currentView) { this.currentView.close(); } this.currentView = view; middlewares = app.getMiddleware(MIDDLEWARE.ROUTER, MIDDLEWARE_PROTOCOL.AFTER); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.AFTER, [pageFeature, app]); }.bind(this)); }.bind(this, page); if (!!page.pages && !!page.pages.length) { var url = page.originUrl || ''; var container = page.container || ''; var layout = page.layout || ''; var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = page.pages[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { var subPage = _step3.value; if (!subPage.url.startsWith('/')) { subPage.url = (url === '/' ? '' : url) + '/' + subPage.url; } if (!subPage.container) { subPage.container = container; } if (!subPage.layout) { subPage.layout = layout; } pages.push(subPage); } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } } } options.routes['*actions'] = '___NOT_FOUND___'; options['___NOT_FOUND___'] = function (actions) { if ('empty' in _this.settings) { _this.settings.empty(actions); } }; this.router = new (Backbone.Router.extend(options))(); } }; ================================================ FILE: lib/schema.js ================================================ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; module.exports = { create: function create(schemaName, defineSchema) { var Schema = { wwtype: 'schema', schemaName: schemaName }; function mixedDataWithSchema(data) { var schema = {}; for (var key in defineSchema) { if (defineSchema.hasOwnProperty(key)) { schema[key] = void 0; } } return Object.assign(schema, data); } Schema.validate = function (data) { var mixedData = mixedDataWithSchema(data); var errors = []; for (var key in mixedData) { if (mixedData.hasOwnProperty(key)) { var type = defineSchema[key]; if (type && type.hasOwnProperty('__validate__')) { var error = type.__validate__.call(type, key, data[key]); if (error) errors.push(error); } else { (typeof window === 'undefined' ? 'undefined' : _typeof(window)) === 'object' && console.warn('Is not defined in the schema field "' + key + '" is present.'); } } } return errors.length === 0 ? void 0 : errors; }; Schema.toSchema = function () { return defineSchema; }; return Schema; } }; ================================================ FILE: lib/store.js ================================================ 'use strict'; module.exports = { create: function create(states) { return { wwtype: 'store', store: states }; } }; ================================================ FILE: lib/types.js ================================================ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var Error = require('./error'); var TYPE = { STRING: 'string', NUMBER: 'number', ARRAY: 'array', EMAIL: 'email', PHONE: 'phone', BOOLEAN: 'boolean' }; var REQUIRED = 'required'; var DEFAULT_VALUE = 'defaultValue'; var MIN = 'min'; var MAX = 'max'; var FORMAT = 'format'; var defaultTypeOptions = {}; var partialValidator = {}; var validator = function validator(key, value) { if (REQUIRED in this && !partialValidator[REQUIRED].call(this, value)) { return Error.create('Required attribute "' + key + '" is missing.', { key: key, value: value }); } if (value === void 0) return; if (!partialValidator[this.name].call(this, value)) { return Error.create('"' + key + '" type property must be "' + this.name + '".', { key: key, value: value }); } if (this.name === TYPE.NUMBER) { if (MIN in this && this[MIN] !== null && !partialValidator[MIN].call(this, value)) { return Error.create('"' + key + '" is greater than ' + this[MIN] + '.', { key: key, value: value }); } if (MAX in this && this[MAX] !== null && !partialValidator[MAX].call(this, value)) { return Error.create('"' + key + '" may have a value of ' + this[MAX] + ' or less.', { key: key, value: value }); } } else if (this.name === TYPE.STRING) { if (MIN in this && this[MIN] !== null && !partialValidator[MIN].call(this, value)) { return Error.create('"' + key + '" must be more than ' + this[MIN] + ' characters long.', { key: key, value: value }); } if (MAX in this && this[MAX] !== null && !partialValidator[MAX].call(this, value)) { return Error.create('"' + key + '" should be no longer than ' + this[MAX] + ' characters.', { key: key, value: value }); } } }; var typeGenerator = function typeGenerator(name, supportOptions, options) { var defaults = {}, type = void 0; supportOptions.forEach(function (option) { defaults[option] = defaultTypeOptions[option]; }); type = Object.assign({ name: name }, defaults, options); type.__validate__ = validator; return type; }; defaultTypeOptions[REQUIRED] = false; defaultTypeOptions[DEFAULT_VALUE] = null; defaultTypeOptions[MIN] = null; defaultTypeOptions[MAX] = null; defaultTypeOptions[FORMAT] = null; partialValidator[TYPE.STRING] = function (value) { return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === TYPE.STRING; }; partialValidator[TYPE.NUMBER] = function (value) { if (typeof value === 'number') return true; var stringType = String(value); var match = stringType.match(/^[+-]?(\d+\.?\d*)$|(\d*\.?\d+)$/g); if (!match) return false; if (match.length > 1) return false; return match[0].length === stringType.length; }; partialValidator[TYPE.ARRAY] = function (value) { return Array.isArray(value); }; partialValidator[TYPE.EMAIL] = function (value) { var regexp = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return regexp.test(value); }; partialValidator[TYPE.BOOLEAN] = function (value) { return Object.prototype.toString.call(value) === '[object Boolean]'; }; partialValidator[REQUIRED] = function (value) { if (this[REQUIRED]) return value !== void 0 && value !== null; return true; }; partialValidator[MIN] = function (value) { if (this.name === TYPE.NUMBER) { return value >= this[MIN]; } else if (this.name === TYPE.STRING) { return value.length >= this[MIN]; } return true; }; partialValidator[MAX] = function (value) { if (this.name === TYPE.NUMBER) { return value <= this[MAX]; } else if (this.name === TYPE.STRING) { return value.length <= this[MAX]; } return true; }; module.exports = { String: function String(options) { return typeGenerator(TYPE.STRING, [REQUIRED, DEFAULT_VALUE, MIN, MAX, FORMAT], Object.assign({ defaultValue: '' }, options)); }, Number: function Number(options) { return typeGenerator(TYPE.NUMBER, [REQUIRED, DEFAULT_VALUE, MIN, MAX], Object.assign({ defaultValue: 0 }, options)); }, Array: function Array(options) { return typeGenerator(TYPE.ARRAY, [REQUIRED, DEFAULT_VALUE], Object.assign({ defaultValue: [] }, options)); }, Email: function Email(options) { return typeGenerator(TYPE.EMAIL, [REQUIRED], Object.assign({}, options)); }, Boolean: function Boolean(options) { return typeGenerator(TYPE.BOOLEAN, [REQUIRED], Object.assign({}, options)); } }; ================================================ FILE: lib/view.js ================================================ 'use strict'; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } var Backbone = require('backbone'); var MIDDLEWARE = require('./middleware').MIDDLEWARE; var MIDDLEWARE_PROTOCOL = require('./middleware').MIDDLEWARE_PROTOCOL; var MiddlewareRunner = require('./middleware').MiddlewareRunner; var PluginText = require('./plugin/text'); var PluginInputText = require('./plugin/input-text'); var PluginCheckbox = require('./plugin/checkbox'); var PluginSelect = require('./plugin/select'); var delegateEventSplitter = /^(\S+)\s*(.*)$/; var childEventSplitter = /^\@(\w+)\s*(.*)$/; var DEFAULT_ATTR_TYPE = 'text'; var View = null; var viewMount = null; var app = null; viewMount = function viewMount() { var tagName = this.tagName; var container = this.container; var template = this.template; var domStr = void 0; var $dom = void 0; if (!container) { throw new Error('[' + this.viewname + '] Required attribute "container" is missing.'); } else { if (typeof container === 'string') { container = $(container); } } if (!container || !container.length) { throw new Error('[' + this.viewname + '] "container" is undefined.'); } var renderData = this.getModel(); if (typeof this.viewWillMount === 'function') { renderData = this.viewWillMount(renderData) || renderData; } if (!!template) { if (typeof template === 'string') { domStr = template; } else { domStr = template(renderData); } if (tagName === 'div') { var proto = this; tagName = ''; do { if (proto.hasOwnProperty('tagName') && !!proto.tagName) { tagName = proto.tagName; break; } } while ((proto = proto.__proto__) && proto.viewname !== '___WOOWA_VIEW___'); } if (!!tagName || $(domStr).length > 1) { $dom = $('<' + (tagName || 'div') + '>' + domStr + ''); } else { $dom = $(domStr); } if (!!this.className) { $dom.addClass(this.className); } if (this._viewMounted) { if ($.contains(container[0], this.el)) { this.$el.replaceWith($dom); } else { container.html($dom); } } else { if (!!this.append) { container.append($dom); } else if (!!this.prepend) { container.prepend($dom); } else if (!!this.after) { container.after($dom); } else { container.html($dom); } } this.setElement($dom); } else { this.setElement(container); } this._viewMounted = true; this._bindRef(); this._bindModel(); if (typeof this.viewComponentDidMount === 'function') { this.viewComponentDidMount($dom); } var viewDidMount = void 0; if (typeof this.viewDidMount === 'function') { viewDidMount = this.viewDidMount.bind(this, $dom); } var forceExcludeMiddleware = false; if ('forceExcludeMiddleware' in this) { forceExcludeMiddleware = typeof this.forceExcludeMiddleware === 'function' ? this.forceExcludeMiddleware() : this.forceExcludeMiddleware; } var middlewares = forceExcludeMiddleware ? [] : app.getMiddleware(MIDDLEWARE.VIEW, MIDDLEWARE_PROTOCOL.AFTER); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.AFTER, [this], function () { var _this2 = this; ['viewDidMount', 'mount'].forEach(function (type) { _this2.dispatch(Woowahan.Event.create(type, _this2)); _this2.trigger(type); }); }.bind(this), viewDidMount); }; View = Backbone.View.extend({ super: function _super() { for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } View.prototype.initialize.apply(this, args); }, initialize: function initialize(model) { this._viewMounted = false; this._views = {}; this.container = this.container; if (!!model) { this.setModel(model); } var forceExcludeMiddleware = false; if ('forceExcludeMiddleware' in this) { forceExcludeMiddleware = typeof this.forceExcludeMiddleware === 'function' ? this.forceExcludeMiddleware() : this.forceExcludeMiddleware; } var middlewares = forceExcludeMiddleware ? [] : app.getMiddleware(MIDDLEWARE.VIEW, MIDDLEWARE_PROTOCOL.BEFORE); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.BEFORE, [this], function () { viewMount.apply(this); }.bind(this)); }, _plugins: { 'text': PluginText, 'input-text': PluginInputText, 'checkbox': PluginCheckbox, 'select': PluginSelect }, delegateEvents: function delegateEvents(events) { events = events || this.events; if (!events) return this; this.undelegateEvents(); for (var key in events) { if (events.hasOwnProperty(key)) { var method = events[key]; var match = key.match(delegateEventSplitter); var childMatch = key.match(childEventSplitter); var eventName = void 0; var selector = void 0; var listener = void 0; if (!!childMatch) { var index = method.indexOf('('); var params = []; eventName = childMatch[1]; selector = childMatch[2]; if (!!~index) { params = method.substring(index + 1, method.length - 1).split(',').map(function (el) { return $.trim(el); }); method = method.substring(0, index); } listener = function (eventName, selector, method, params, event) { var _this = this; var getVal = function getVal($el) { if ($el.is('input[type=checkbox]') || $el.is('input[type=radio]')) { return $el.is(':checked'); } else if ($el.is('select')) { return $el.val(); } else { return $el.val() || $el.text(); } }; var values = params.map(function (param) { return getVal(_this.$(param)); }); if (eventName === 'submit') { var inputs = {}; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = _this.$(selector).find('input, select, textarea')[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var el = _step.value; inputs[$(el).attr('name')] = getVal($(el)); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } values.push(inputs); } if (Object.prototype.toString.call(method) !== '[object Function]') { method = this[method]; } for (var _len2 = arguments.length, args = Array(_len2 > 5 ? _len2 - 5 : 0), _key2 = 5; _key2 < _len2; _key2++) { args[_key2 - 5] = arguments[_key2]; } return method.apply(this, Array.prototype.concat.call(values, args, event)); }.bind(this, eventName, selector, method, params); } else { if (Object.prototype.toString.call(method) !== '[object Function]') { method = this[method]; } if (!method) continue; eventName = match[1]; selector = match[2]; listener = method.bind(this); } this.delegate(eventName, selector, listener); } } return this; }, updateView: function updateView(container, ChildView) { for (var _len3 = arguments.length, args = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) { args[_key3 - 2] = arguments[_key3]; } if (arguments.length === 0) { this.close(false); viewMount.apply(this); return; } var viewContainer = void 0; var viewId = void 0; viewContainer = this.$(container); if (!viewContainer.length) { viewContainer = $(container); } if (!viewContainer.length) { throw new Error('View must have container'); } viewId = viewContainer.data('ref') || viewContainer.selector || container; if (!!container && !ChildView) { if (!!this._views[viewId]) { this._views[viewId].close(); delete this._views[viewId]; } return; } if (typeof ChildView !== 'function') { args = ChildView; } var view = this._views[viewId]; if (!!view) { view.setModel.apply(view, Array.prototype.concat.call(args, { silent: true })); view.container = viewContainer; var forceExcludeMiddleware = false; if ('forceExcludeMiddleware' in view) { forceExcludeMiddleware = typeof view.forceExcludeMiddleware === 'function' ? view.forceExcludeMiddleware() : view.forceExcludeMiddleware; } var middlewares = forceExcludeMiddleware ? [] : app.getMiddleware(MIDDLEWARE.VIEW, MIDDLEWARE_PROTOCOL.UNMOUNT); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.UNMOUNT, [this], function () { if (typeof view.viewWillUnmount === 'function') { view.viewWillUnmount.call(view); } view.dispatch(Woowahan.Event.create('unmount', this)); view.trigger('unmount'); viewMount.apply(this._views[viewId]); }.bind(this)); } else { ChildView.prototype.container = viewContainer; view = new (Function.prototype.bind.apply(ChildView, Array.prototype.concat.call(ChildView, args)))(); this._views[viewId] = view; } return view; }, addView: function addView(container, ChildView) { this.removeView(container); for (var _len4 = arguments.length, args = Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) { args[_key4 - 2] = arguments[_key4]; } return this.updateView.apply(this, [container, ChildView].concat(args)); }, removeView: function removeView(container) { if (!!$(container).length) { this.updateView(container); } }, addPopup: function addPopup(view) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var callback = arguments[2]; if (typeof options === 'function') { callback = options; options = {}; } view = typeof view === 'string' ? this.getComponent(view) : view; var name = view.viewname; var containerName = void 0; var container = void 0; var popup = void 0; if (!!view) { var _id = options._id || name + 'Container' + Date.now(); if (!!$('div[data-id=' + _id + ']').length) { return; } containerName = _id; container = $('
                '); $('body').append(container); popup = this.addView('div[data-id=' + containerName + ']', view, Object.assign(options, { _id: _id })); popup.on('remove', function () { popup.off('remove'); $('div[data-id=' + containerName + ']').remove(); }); popup.closePopup = function (containerName, callback, data) { this.removeView('div[data-id=' + containerName + ']'); if (!!callback) { callback.call(this, data); } }.bind(this, containerName, callback); return popup; } else { console.error('undefined popup name [' + name + ']'); } }, getStates: function getStates(key) { return app.getStates(key); }, setStates: function setStates(key, value) { app.setStates(key, value); }, getComponent: function getComponent(name) { return app.getComponent(name).extend({}); }, getRouteTables: function getRouteTables(routeName, params, query) { if (routeName === void 0) { return app.getRouteTables(); } var path = app.getRouteTables()[routeName]; if (!path) { console.error('"' + routeName + '" not found'); return; } if (typeof params === 'string') { return path() + '?' + encodeURIComponent(params); } else { if (typeof query === 'string') { return path(params) + '?' + encodeURIComponent(query); } else { return path(params); } } }, dispatch: function dispatch(action, subscriber, options) { var _$el; action.__options = options || {}; switch (action.wwtype) { case 'event': (_$el = this.$el).trigger.apply(_$el, [action.type].concat(_toConsumableArray(action.data))); break; case 'action': if (!!subscriber) { subscriber = subscriber.bind(this); } app.dispatch(action, subscriber); break; } }, setModel: function setModel(key, value) { var attrs = void 0; if (typeof key === 'string' && typeof value !== 'undefined') { attrs = _defineProperty({}, key, value); } else { attrs = key; } if (attrs instanceof Backbone.Model) { if (!!this.model) { this._unbindModel(); } this.model = attrs.clone(); if (this._viewMounted) { this._bindModel(); } return; } if (Object.prototype.toString.call(attrs) === '[object Null]' || !this.model || !(this.model instanceof Backbone.Model)) { this.model = new Backbone.Model(); if (this._viewMounted) { this._bindModel(); } } for (var attr in attrs) { if (attrs.hasOwnProperty(attr)) { var _value = this.model.get(attr); if (_value !== attrs[attr]) { this.model.set(attr, attrs[attr]); } } } }, getModel: function getModel(key) { if (!this.model || !(this.model instanceof Backbone.Model)) { this.model = new Backbone.Model(); } if (!key) { return this.model.clone().toJSON(); } return this.model.clone().get(key); }, log: function log() { console.warn('View.log:: Deprecated and will be removed in a future release.'); }, logStamp: function logStamp() { for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { args[_key5] = arguments[_key5]; } this.log(args); }, close: function close(remove) { this._unbindModel(); var forceExcludeMiddleware = false; if ('forceExcludeMiddleware' in this) { forceExcludeMiddleware = typeof this.forceExcludeMiddleware === 'function' ? this.forceExcludeMiddleware() : this.forceExcludeMiddleware; } var middlewares = forceExcludeMiddleware ? [] : app.getMiddleware(MIDDLEWARE.VIEW, MIDDLEWARE_PROTOCOL.UNMOUNT); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.UNMOUNT, [this], function () { var _this3 = this; if (typeof this.viewWillUnmount === 'function') { this.viewWillUnmount(); } if (this.refs) { Object.keys(this.refs).forEach(function (refName) { if (Array.isArray(_this3.refs[refName])) { _this3.refs[refName] = []; } }); } this.dispatch(Woowahan.Event.create('unmount', this)); this.trigger('unmount'); this._removeChild(remove); if (remove + '' !== 'false' && !!this) { this._unbindRef(); this.remove(); } }.bind(this)); }, remove: function remove() { this.dispatch(Woowahan.Event.create('remove', this)); this.trigger('remove'); for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { args[_key6] = arguments[_key6]; } Backbone.View.prototype.remove.apply(this, args); }, _syncElement: function _syncElement(source, target) { var $source = $(source); var $target = $(target); if ($source.is('input[type=text]') || $source.is('input[type=number]') || $source.is('input[type=tel]') || $source.is('textarea')) { $target.val($source.val()); } else if ($source.is('input[type=checkbox]') || $source.is('input[type=radio]')) { $target.prop('checked', $source.is(':checked')); } else if ($source.is('select')) { $target.val($source.val()); } }, _bindRef: function _bindRef() { if (!this.refs) { this.refs = {}; } var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = this.$el.find('[data-ref]')[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var element = _step2.value; var $element = $(element); var refName = $element.data('ref'); var refGroup = $element.data('refGroup') || false; var refFormRestore = $element.data('refFormRestore') || false; if (refGroup) { if (this.refs[refName]) { this.refs[refName].push(element); } else { this.refs[refName] = [element]; } } else { var currentElement = this.refs[refName]; this.refs[refName] = element; if (currentElement) { refFormRestore && this._syncElement(currentElement, this.refs[refName]); currentElement = null; } } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } }, _bindModel: function _bindModel() { var _this4 = this; this._unbindModel(); var targetElements = this.$el.find('[data-role=bind]'); var element = void 0; var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = targetElements[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { element = _step3.value; var key = $(element).data('name'); var eventName = 'change:' + key; var type = ($(element).data('type') || DEFAULT_ATTR_TYPE).toLowerCase(); var value = this.model.get(key); this.listenTo(this.model, eventName, function (element, key, type) { var value = this.model.get(key); this._plugins[type].call(this, element, value); }.bind(this, element, key, type)); if (typeof value !== 'undefined') this._plugins[type].call(this, element, value); } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } targetElements = this.$el.find('[data-role=plugin]'); var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { for (var _iterator4 = targetElements[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { element = _step4.value; var plugins = $(element).data('plugins'); if (!plugins) throw new Error('plugin must have plugins'); plugins.split('+').map(function (s) { return $.trim(s); }).forEach(function (plugin) { var _plugin$split$map = plugin.split('=>').map(function (s) { return $.trim(s); }), _plugin$split$map2 = _slicedToArray(_plugin$split$map, 2), keys = _plugin$split$map2[0], type = _plugin$split$map2[1]; keys = keys.split(',').map(function (k) { return $.trim(k); }); type = type.toLowerCase(); keys.forEach(function (key) { if (key === '') return; var value = _this4.model.get(key); _this4.listenTo(_this4.model, 'change:' + key, function (element, key, type) { var value = this.model.get(key); this._plugins[type].call(this, element, value); }.bind(_this4, element, key, type)); if (typeof value !== 'undefined') _this4._plugins[type].call(_this4, element, value); }); }); } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } }, _unbindRef: function _unbindRef() { for (var ref in this.refs) { if (this.refs.hasOwnProperty(ref)) { this.refs[ref] = null; } } this.refs = null; }, _unbindModel: function _unbindModel() { this.stopListening(this.model); }, _removeChild: function _removeChild(remove) { for (var key in this._views) { if (this._views.hasOwnProperty(key)) { this._views[key].close.call(this._views[key], remove); delete this._views[key]; } } } }); View.create = function (viewName, options) { var view = View.extend(options); view.viewname = viewName; Object.defineProperty(view.prototype, 'viewname', { value: viewName, writable: false }); return view; }; module.exports = function (toolset) { if (!app) { app = toolset; } return View; }; ================================================ FILE: lib/woowahan.js ================================================ 'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var Backbone = require('backbone'); var Router = require('./router'); var MIDDLEWARE = require('./middleware').MIDDLEWARE; var MIDDLEWARE_PROTOCOL = require('./middleware').MIDDLEWARE_PROTOCOL; var MiddlewareRunner = require('./middleware').MiddlewareRunner; var INTERVAL = 1000 / 60; var toolset = { get dispatch() { return instance.dispatch.bind(instance); }, get getMiddleware() { return instance.getMiddleware.bind(instance); }, get getStates() { return instance.getStates.bind(instance); }, get setStates() { return instance.setStates.bind(instance); }, get getComponent() { return instance.getComponent.bind(instance); }, get getRouteTables() { return instance.getRouteTables.bind(instance); }, get addAction() { return instance.addAction.bind(instance); }, get removeAction() { return instance.removeAction.bind(instance); }, get addError() { return instance.addError.bind(instance); } }; var instance = void 0; if (global.__backboneAgent) { global.__backboneAgent.handleBackbone(Backbone); } Backbone.Model.prototype.idAttribute = '___ID_ATTR___'; Backbone.View.prototype.viewname = '___WOOWA_VIEW___'; var Woowahan = function () { function Woowahan() { var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, Woowahan); this.reducers = settings.reducers || {}; this.components = settings.components || {}; this.middlewares = { app: { before: [], after: [] }, router: { before: [], after: [] }, reducer: { before: [], after: [] }, view: { before: [], after: [], unmount: [] } }; this.importViews = {}; this.store = null; this.queue = []; this.pretasks = []; this.actionObject = {}; this.queuemonitor = null; instance = this; this.enableQueue(); } _createClass(Woowahan, [{ key: 'import', value: function _import(Package) { var _this = this; Object.keys(Package.reducers || {}).forEach(function (reducerName) { return _this.use(Package.reducers[reducerName]); }); Object.keys(Package.views || {}).forEach(function (viewname) { return _this.importViews[viewname] = Package.views[viewname]; }); } }, { key: 'getView', value: function getView(viewname) { return this.importViews[viewname]; } }, { key: 'enableQueue', value: function enableQueue() { this.queuemonitor = setInterval(this.queuing.bind(this), INTERVAL); } }, { key: 'disableQueue', value: function disableQueue() { this.queuemonitor = clearInterval(this.queuemonitor); } }, { key: 'addAction', value: function addAction(id) { this.actionObject[id] = Date.now(); if (this.numberOfWorkAction() === 1) { this.trigger('start'); } } }, { key: 'removeAction', value: function removeAction(id) { delete this.actionObject[id]; if (this.numberOfWorkAction() === 0) { this.trigger('finish'); } } }, { key: 'addError', value: function addError(err) { this.trigger('error', err); } }, { key: 'queuing', value: function queuing() { this.disableQueue(); var item = this.queue.shift(); if (!!item) { var reducer = this.reducers[item.action.type]; if (!reducer) { this.enableQueue(); throw new Error('The unregistered reducer. Please check the type of action, if there is a written reducer use after registration.'); } item.subscriber = item.subscriber || function () {}; if (typeof item.subscriber !== 'function') { this.enableQueue(); throw new Error('The listener must be a function. If you do not need the listener it may not be specified.'); } if (reducer.schema) { var errors = reducer.schema.validate(item.action.data); if (errors) { this.trigger('error', errors); } else { new (Function.prototype.bind.apply(reducer, Array.prototype.concat.call(reducer, item.action.data, item.subscriber.bind(this))))(); } } else { new (Function.prototype.bind.apply(reducer, Array.prototype.concat.call(reducer, item.action.data, item.subscriber.bind(this))))(); } } this.enableQueue(); } }, { key: 'bindStore', value: function bindStore(store) { this.store = store; } }, { key: 'bindReducer', value: function bindReducer(reducer) { this.reducers[reducer.actionName] = reducer; } }, { key: 'bindComponent', value: function bindComponent(component) { this.components[component.name] = component; } }, { key: 'bindPlugin', value: function bindPlugin(plugin) { var type = plugin.type.toLowerCase(); if (Woowahan.View.prototype._plugins.hasOwnProperty(type)) { throw new Error('Duplicate plugin name'); } Woowahan.View.prototype._plugins[type] = plugin.plugin; } }, { key: 'combineReducer', value: function combineReducer(reducers) { var _this2 = this; if (!reducers) return; reducers.forEach(function (reducer) { _this2.bindReducer(reducer); }); } }, { key: 'getStates', value: function getStates(key) { return typeof key !== 'undefined' ? this.store[key] : this.store; } }, { key: 'setStates', value: function setStates(key, value) { var store = void 0; if (typeof key === 'string' && typeof value !== 'undefined') { store = _defineProperty({}, key, value); } else { store = key; } if (!this.store) { this.store = {}; } Object.assign(this.store, store); } }, { key: 'getMiddleware', value: function getMiddleware(type, delegate) { return this.middlewares[type][delegate]; } }, { key: 'getComponent', value: function getComponent(name) { var component = this.components[name]; if (!!component) { return component.view; } } }, { key: 'getRouteTables', value: function getRouteTables() { return Router.routeTables; } }, { key: 'dispatch', value: function dispatch(action, subscriber) { this.queue.push({ action: action, subscriber: subscriber }); } }, { key: 'use', value: function use(module) { var _this3 = this; if (Array.isArray(module)) { module.forEach(function (m) { return _this3.useModule(m); }); } else { if ((typeof module === 'undefined' ? 'undefined' : _typeof(module)) === 'object' && !('wwtype' in module)) { Object.keys(module).forEach(function (key) { if (typeof module[key] === 'function') _this3.useModule(module[key]); }); } else { this.useModule(module); } } } }, { key: 'useModule', value: function useModule(module) { switch (module.wwtype) { case 'reducer': this.bindReducer(module); break; case 'layout': Router.bindLayout(module); break; case 'store': this.bindStore(module.store); break; case 'component': console.warn('Component:: Deprecated and will be removed in a future release.'); this.bindComponent(module); break; case 'plugin': this.bindPlugin(module); break; } } }, { key: 'set', value: function set(middleware) { var _this4 = this; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var instance = new middleware(options); if (instance.mwtype) { Object.values(MIDDLEWARE_PROTOCOL).forEach(function (delegate) { delegate in instance && _this4.middlewares[instance.mwtype][delegate].push(instance); }); } else { throw new Error('Required attribute "mwtype" is missing.'); } } }, { key: 'start', value: function start(design) { var _this5 = this; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (typeof jQuery === 'undefined') { throw new Error('jQuery is not loaded!!'); } var wait = setInterval(function () { switch (document.readyState) { case 'complete':case 'loaded': break; default: return; } clearInterval(wait); if (Backbone.History.started) { Backbone.history.stop(); } if (!!design) { Router.design(design, options, toolset); } var middlewares = _this5.getMiddleware(MIDDLEWARE.APP, MIDDLEWARE_PROTOCOL.BEFORE); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.BEFORE, [toolset], function () { middlewares = this.getMiddleware(MIDDLEWARE.APP, MIDDLEWARE_PROTOCOL.AFTER); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.AFTER, [toolset], function () { Backbone.history.start({ pushState: !!options.pushState }); }); }.bind(_this5)); }, 1); } }, { key: 'numberOfAction', value: function numberOfAction() { return this.queue.length; } }, { key: 'numberOfWorkAction', value: function numberOfWorkAction() { return Object.keys(this.actionObject).length; } }]); return Woowahan; }(); Object.assign(Woowahan.prototype, Backbone.Events); Woowahan.$ = Backbone.$; Woowahan.View = require('./view')(toolset); Woowahan.Reducer = require('./reducer')(toolset); Woowahan.Error = require('./error'); Woowahan.Types = require('./types'); Woowahan.Store = require('./store'); Woowahan.Action = require('./action'); Woowahan.Event = require('./event'); Woowahan.Schema = require('./schema'); Woowahan.Layout = require('./layout'); Woowahan.Component = require('./component'); Woowahan.Plugin = require('./plugin'); module.exports = global.Woowahan = Woowahan; Woowahan.CollectionView = require('./collection-view')(toolset); Woowahan.ItemView = require('./item-view')(toolset); Woowahan.PopupView = require('./popup-view')(toolset); Woowahan.version = '1.2.2'; ================================================ FILE: package.json ================================================ { "name": "woowahan", "version": "1.2.2", "description": "Web application framework for BackboneJS", "main": "./lib/woowahan.js", "scripts": { "build": "run-s clean:* compile relocation bundling", "clean:lib": "rm -rf lib", "clean:dist": "rm -rf dist", "compile": "babel --no-comments --presets es2015 --out-dir lib src/*js src/**/*js", "relocation": "mv -f lib/src/* lib && rm -rf lib/src", "bundling": "webpack ./index.js dist/woowahan.js --module-bind js=babel-loader --optimize-minimize", "proxy-server": "node ./server/proxy.js", "demo-server": "node ./server/demo.js", "version-patch": "npm version patch", "test": "./node_modules/mocha/bin/mocha --require babel-core/register" }, "repository": { "type": "git", "url": "git+https://github.com/woowabros/WoowahanJS.git" }, "keywords": [ "framework", "backbonejs", "woowahanjs", "webapp" ], "author": "Woowabros", "license": "MIT", "bugs": { "url": "https://github.com/woowabros/WoowahanJS/issues" }, "homepage": "https://github.com/woowabros/WoowahanJS#readme", "dependencies": { "backbone": "^1.3.3", "jquery": "^2.2.4", "lodash": "^4.17.5" }, "devDependencies": { "babel-cli": "^6.26.0", "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-preset-es2015": "^6.24.1", "chai": "^2.3.0", "mocha": "^2.2.1", "morgan": "^1.7.0", "npm-run-all": "^4.1.2", "uglifyjs-webpack-plugin": "^1.1.8", "webpack": "^3.10.0" } } ================================================ FILE: src/action.js ================================================ module.exports = { create(type, data = {}) { return { wwtype: 'action', type: type, data }; } }; ================================================ FILE: src/collection-view.js ================================================ const Collection = require('backbone').Collection; const Woowahan = require('./woowahan'); const events = require('./events'); const ListViewEvents = [ events.SELECTED_ROW, events.SELECTED_CELL ]; let CollectionView; let app; CollectionView = Woowahan.View.create('CollectionView', { super(...args) { CollectionView.prototype.initialize.apply(this, args); }, initialize(...args) { this.collection = this.collection || new Collection(); this.collection.on('add', this.addRowView, this); this.rowViews = []; this.reverse = false; Woowahan.View.prototype.initialize.apply(this, args); }, viewWillUnmount() { let model; while (model = this.collection.first()) { this.collection.remove(model); } this.rowViews = []; }, addRowView(model) { let container = this.$(this.rowContainer); if (!container.length) { container = this.$el; if (!this.$el.is(this.rowContainer)) { throw new Error('undefined rowContainer'); } } this.rowView.prototype.container = container; if (this.reverse) { this.rowView.prototype.prepend = true; } else { this.rowView.prototype.append = true; } let view = new this.rowView(model); this.rowViews.push(view); model.on('remove', () => { this.rowViews.splice(this.rowViews.indexOf(view), 1); view.close(); }, view); model.on('change', data => { view.setModel(data.toJSON()); view.updateView(); }, view); ListViewEvents.forEach(event => view.on(event, this[`on${event.charAt(0).toUpperCase()}${event.slice(1)}`], this)); }, reload(data = [], options = {}) { if (Object.prototype.toString.call(options) !== '[object Object]') { throw new Error('invalid options!!!'); } const uid = options.uid; let renderData = data.filter(item => !!item).map(item => { if (!!uid) { const model = this.collection.findWhere({ [uid]: item[uid] }); if (!!model) { model.set(item); return model; } } return item; }); this.reverse = ('reverse' in options) ? options.reverse : false; this.collection.set(renderData, { remove: ('reset' in options) ? options.reset : true }); }, getCollection() { return this.rowViews.map(view => view.getModel()); }, onSelectedRow() { this.log('selectedRow'); }, onSelectedCell() { this.log('selectedCell'); }, onAction() { this.log('onAction'); }, onClose() { this.rowViews.forEach(row => row.close()); } }); CollectionView.create = (viewName, options) => { let view = CollectionView.extend(options); view.viewname = viewName; Object.defineProperty(view.prototype, 'viewname', { value: viewName, writable: false }); return view; }; module.exports = function(toolset) { if (!app) { app = toolset; } return CollectionView; }; ================================================ FILE: src/component.js ================================================ module.exports = (name, view) => { return { view: view, name: name, viewName: view.viewname, wwtype: 'component' }; }; ================================================ FILE: src/error.js ================================================ module.exports = { create: (message, target) => ({ wwtype: 'error', code: 1, message, target }) }; ================================================ FILE: src/event.js ================================================ module.exports = { create(type, ...args) { return { wwtype: 'event', type: type, data: args }; } }; ================================================ FILE: src/events.js ================================================ module.exports = { SELECTED_ROW: 'selectedRow', SELECTED_CELL: 'selectedCell' }; ================================================ FILE: src/item-view.js ================================================ const Woowahan = require('./woowahan'); const events = require('./events'); let ItemView; let app; ItemView = Woowahan.View.create('ItemView', { events: { 'click': '_onSelectedRow' }, super(...args) { ItemView.prototype.initialize.apply(this, args); }, initialize(...args) { Woowahan.View.prototype.initialize.apply(this, args); }, _onSelectedRow(event) { if (this.onSelectedRow && typeof this.onSelectedRow === 'function') { this.onSelectedRow(event, function(...args) { this.trigger.apply(this, Array.prototype.concat.call([], events.SELECTED_ROW, args)); }.bind(this)); } }, _onSelectedCell(event) { if (this.onSelectedCell && typeof this.onSelectedCell === 'function') { this.onSelectedRow(event, function(...args) { this.trigger.apply(this, Array.prototype.concat.call([], events.SELECTED_CELL, args)); }.bind(this)); } } }); ItemView.create = (viewName, options) => { let view = ItemView.extend(options); view.viewname = viewName; Object.defineProperty(view.prototype, 'viewname', { value: viewName, writable: false }); return view; }; module.exports = function(toolset) { if (!app) { app = toolset; } return ItemView; }; ================================================ FILE: src/layout.js ================================================ module.exports = (container, view, options) => { return { view, container, options: Object.assign({ update: true }, options), viewName: view.viewname, wwtype: 'layout' }; }; ================================================ FILE: src/middleware.js ================================================ export const MIDDLEWARE = { APP: 'app', VIEW: 'view', REDUCER: 'reducer', ROUTER: 'router', }; export const MIDDLEWARE_PROTOCOL = { BEFORE: 'before', AFTER: 'after', UNMOUNT: 'unmount', }; const queue = []; let _isRunning = false; export const MiddlewareRunner = { get isRunning() { return _isRunning; }, run(middlewares, protocol, params, callback, preprocess) { if (!Array.isArray(middlewares) || typeof protocol !== 'string') throw new Error('MiddlewareRunner arguments error'); if (_isRunning) { queue.push([middlewares, protocol, params, callback, preprocess]); return; } _isRunning = true; const featuresLen = params.length; let index = 0; const next = function() { const curr = middlewares[index++]; if (curr) { const middleware = curr[protocol]; if (middleware.length > featuresLen) { middleware.call(curr, ...params, next); } else { middleware.call(curr, ...params); // next(); setTimeout(next, 1); } } else { !!callback && callback(); const task = queue.shift(); _isRunning = false; if (!!task) { MiddlewareRunner.run(...task); } } }; if (typeof preprocess === 'function') preprocess(); next(); } }; ================================================ FILE: src/plugin/checkbox.js ================================================ module.exports = function(element, value) { $(element).prop('checked', !!value); }; ================================================ FILE: src/plugin/input-text.js ================================================ module.exports = function(element, value) { $(element).val(value); }; ================================================ FILE: src/plugin/select.js ================================================ module.exports = function(element, value) { let selectedIndex = 0; let opts; if (Array.isArray(value)) { if (!value.length) { return; } else { opts = Array.from(value); } } else { if (typeof value === 'undefined') { return; } else { opts = Array.from([value]); } } element.innerHTML = ''; for (const [index, opt] of opts.entries()) { let label; let val; if (typeof opt === 'string') { label = opt; val = opt; } else { label = opt.label; val = opt.value; } if (!!opt.selected) { selectedIndex = index; } $(element).append(``); } $(element).children('option').eq(selectedIndex).attr('selected', 'selected'); $(element).trigger('change'); }; ================================================ FILE: src/plugin/text.js ================================================ module.exports = function(element, value) { $(element).text(value); }; ================================================ FILE: src/plugin.js ================================================ module.exports = (type, plugin) => { return { type: type, plugin: plugin, wwtype: 'plugin' }; }; ================================================ FILE: src/popup-view.js ================================================ const Woowahan = require('./woowahan'); let PopupView; let app; let zIndex = 1000; const defaultOverlayCss = { position: 'fixed', top: 0, left: 0, right: 0, bottom: 0, background: '#000', opacity: 0.7 }; const defaultCss = { overflowY: 'auto', display: 'block', position: 'absolute', top: '50%', left: '50%', width: '80%', maxHeight: '80%', background: '#fff', webkitTransform: 'translate(-50%, -50%)', transform: 'translate(-50%, -50%)' }; PopupView = Woowahan.View.create('PopupView', { overlayClassName: '', overlayCss: {}, css: {}, showOverlay: true, useDefaultCss: true, super() { PopupView.prototype.initialize.apply(this, this.arguments); }, initialize(...args) { this.overlay = $('
                '); Woowahan.View.prototype.initialize.apply(this, args); }, viewComponentDidMount($el) { const model = this.getModel(); Object.keys(model).map(function(key) { switch (key) { case 'css': case 'overlayCss': this[key] = Object.assign({}, this[key], model[key]); break; case 'overlayClassName': case 'showOverlay': case 'useDefaultCss': this[key] = model[key]; break; case 'buttons': const buttons = model.buttons; if (!this.events) { this.events = {}; } for (const button in buttons) { if (buttons.hasOwnProperty(button)) { this.events[`click ${button}`] = buttons[button].bind(this); } } this.delegateEvents(); break; } }.bind(this)); if (this.showOverlay) { const overlay = this.overlay; overlay.addClass(this.overlayClassName); overlay.css(Object.assign({ zIndex }, defaultOverlayCss, this.overlayCss)); this.$el.parent().prepend(overlay); zIndex += 100; $(overlay).on('click', function() { this.dispatch(Woowahan.Event.create('overlayClicked', this)); }.bind(this)); } if (this.useDefaultCss) { $el.css(defaultCss); } $el.css(Object.assign({ zIndex }, this.css)); zIndex += 100; } }); PopupView.create = (viewName, options) => { let view = PopupView.extend(options); view.viewname = viewName; Object.defineProperty(view.prototype, 'viewname', { value: viewName, writable: false }); return view; }; module.exports = function(toolset) { if (!app) { app = toolset; } return PopupView; }; ================================================ FILE: src/reducer.js ================================================ const MIDDLEWARE = require('./middleware').MIDDLEWARE; const MIDDLEWARE_PROTOCOL = require('./middleware').MIDDLEWARE_PROTOCOL; const MiddlewareRunner = require('./middleware').MiddlewareRunner; const defaultConfiguration = { timeout: 5000 }; let Reducer; let app; Reducer = { SUCCESS: 'SUCCESS', FAIL: 'FAIL', queueSuccess: [], queueFail: [], extend(protoProps) { const child = Object.assign({}, this); if (!!protoProps.onSuccess) { child.queueSuccess.push(protoProps.onSuccess); } if (!!protoProps.onFail) { child.queueFail.push(protoProps.onFail); } return child; }, create(actionName, schema, handler) { if (typeof schema === 'function') { handler = schema; schema = void 0; } else { if (typeof schema === 'object' && schema.wwtype !== 'schema') { throw new Error('The second argument of reducer will only function, or schema objects.'); } } const _this = this; let Reducer = function(data, subscriber) { this._timestamp = Date.now(); this._id = actionName.toLowerCase() + this._timestamp; this.subscriber = subscriber; this.queueSuccess = []; this.queueFail = []; this.useraction(data); this.addAction(this._id); }; Reducer.wwtype = 'reducer'; Reducer.actionName = actionName; Reducer.schema = schema; let fn = Object.assign(Reducer.prototype, { onSuccess: _this.onSuccess, onFail: _this.onFail }); fn.useraction = handler; fn.id = () => this._id; fn.actionName = actionName; fn.createtime = () => this._timestamp; fn.addAction = (...args) => app.addAction(...args); fn.addError = (...args) => app.addError(...args); fn.removeAction = (...args) => app.removeAction(...args); fn.getStates = (...args) => app.getStates(...args); fn.setStates = (...args) => app.setStates(...args); fn.use = function(key, handlers) { switch (key) { case _this.SUCCESS: if (!handlers) return; if (Array.isArray(handlers)) { Array.prototype.push.apply(this.queueSuccess, handlers); } else { this.queueSuccess.push(handlers); } break; case _this.FAIL: if (!handlers) return; if (Array.isArray(handlers)) { Array.prototype.push.apply(this.queueFail, handlers); } else { this.queueFail.push(handlers); } break; default: throw new Error('undefined key'); } }; fn.loadScript = function(path, id) { if (!id) { id = path.toLowerCase(); } let script = $('script[id=' + id + ']'); if (!!script.length) { (this.onSuccess || this.success).call(this); return; } script = document.createElement('script'); document.getElementsByTagName('head')[0].appendChild(script); script.addEventListener('load', (this.onSuccess || this.success).bind(this)); script.addEventListener('error', (this.onFail || this.fail).bind(this)); script.id = id; script.type = 'text/javascript'; script.src = path; }; fn.requestData = function(url, settings, method = 'GET') { if (typeof url === 'object') { settings = Object.assign({}, defaultConfiguration, { url }); } else { settings = Object.assign({}, defaultConfiguration, settings, { url }); } settings.type = method.toUpperCase(); let success = function(...args) { const queueSuccess = Array.prototype.concat.call(_this.queueSuccess, this.queueSuccess); let middlewares = app.getMiddleware(MIDDLEWARE.REDUCER, MIDDLEWARE_PROTOCOL.AFTER); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.AFTER, [app], function() { if (!!queueSuccess.length || !!this.onSuccess) { for (const item of queueSuccess) { item.apply(this, args); } !!this.onSuccess && this.onSuccess.apply(this, args); } else { this.success.apply(this, args); } }.bind(this)); }; let fail = function(...args) { const queueFail = Array.prototype.concat.call(_this.queueFail, this.queueFail); const jqXHR = args[0]; let middlewares = app.getMiddleware(MIDDLEWARE.REDUCER, MIDDLEWARE_PROTOCOL.AFTER); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.AFTER, [app], function() { if (!!jqXHR) { args = [{ status: jqXHR.status, statusText: jqXHR.statusText || '', response: jqXHR.responseJSON || jqXHR.responseText }]; } if (!!queueFail.length || !!this.onFail) { for (const item of queueFail) { item.apply(this, args); } !!this.onFail && this.onFail.apply(this, args); } else { this.fail.apply(this, args); } }.bind(this)); }; let middlewares = app.getMiddleware(MIDDLEWARE.REDUCER, MIDDLEWARE_PROTOCOL.BEFORE); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.BEFORE, [settings, app], function() { return $.ajax(settings) .done(success.bind(this)) .fail(fail.bind(this)); }.bind(this)); }; /** * * @param url * @param settings */ fn.getData = function(url, settings) { return this.requestData(url, settings, 'get'); }; /** * * @param url * @param settings */ fn.putData = function(url, settings) { return this.requestData(url, settings, 'put'); }; /** * * @param url * @param settings */ fn.postData = function(url, settings) { return this.requestData(url, settings, 'post'); }; /** * * @param url * @param settings */ fn.deleteData = function(url, settings) { return this.requestData(url, settings, 'delete'); }; fn.success = function(data) { }; fn.fail = function(request, error) { if ('abort' in request) { request.abort(); } // TODO: 오류 발생시 바로 삭제하지 않고 작업을 Disable 시킨 후 오류 처리시 Retry 등의 로직을 수행할 수 있도록 선택지를 만듬 this.removeAction(this._id); this.addError(error); }; fn.finish = function(...args) { this.subscriber && this.subscriber.apply(this, args); this.removeAction(this._id); }; fn.env = {}; fn.env.template = function(templateStr, env) { if (typeof templateStr !== 'string') return templateStr; let renderStr = templateStr; let variables = templateStr.match(/{{\w+}}/g); if (variables) { variables.forEach(v => { let attrName = v.replace('{{', '').replace('}}', ''); if (attrName in env) { renderStr = renderStr.replace(v, env[attrName]); } }); } return renderStr; }; return Reducer; } }; module.exports = function(toolset) { if (!app) { app = toolset; } return Reducer; }; ================================================ FILE: src/router.js ================================================ const MIDDLEWARE = require('./middleware').MIDDLEWARE; const MIDDLEWARE_PROTOCOL = require('./middleware').MIDDLEWARE_PROTOCOL; const MiddlewareRunner = require('./middleware').MiddlewareRunner; let app; function urlBuilder(path) { return function(params) { let url = path; if (!params) { return url; } if (Array.isArray(params)) { let keys = path.match(/\:\w+/g); if (keys.length !== params.length) { console.error('It does not match the required input values.'); return url; } keys.forEach((key, index) => { url = url.replace(key, encodeURIComponent(params[index])); }); return url; } if (typeof params === 'object') { for (let key in params) { if (params.hasOwnProperty(key)) { url = url.replace(':' + key, encodeURIComponent(params[key])); } } return url; } console.error('Invalid params type'); return url; }; } module.exports = { routeTables: {}, settings: null, layouts: [], currentView: '', currentLayout: '', bindLayout(layout) { this.layouts.push(layout); }, design(pages, settings = {}, toolset) { this.settings = settings; this.router = null; app = toolset; this.bindRouter(Array.isArray(pages) ? pages : [pages]); }, bindRouter(pages) { const options = { routes: {} }; let page, routeId; pages = Array.from(pages); while (!!pages.length) { page = pages.shift(); this.routeTables[page.routeName || page.view.viewname] = urlBuilder(page.url); page.originUrl = page.url; if (page.url.startsWith('/')) { page.url = page.url.substr(1); } routeId = 'r' + page.url.toLowerCase() + Date.now(); options.routes[page.url] = routeId; options[routeId] = function(page, ...args) { const currentHref = window.location.href; const pageFeature = Object.assign({}, page); if (!!pageFeature.view) delete pageFeature.view; if (!!pageFeature.pages) delete pageFeature.pages; let middlewares = app.getMiddleware(MIDDLEWARE.ROUTER, MIDDLEWARE_PROTOCOL.BEFORE); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.BEFORE, [pageFeature, app], function() { if (currentHref !== window.location.href) return; const params = {}; const query = {}; let idx = 0; if (page.url.startsWith('*')) { params[page.url.split('*')[1]] = args[0]; } else { for (const part of page.url.split('/')) { if (part.startsWith(':')) { params[part.substr(1)] = decodeURIComponent(args[idx]); ++idx; } } } const queryStr = decodeURIComponent(args[args.length - 1] || (window.location.search || '').substr(1)); if (!!queryStr && !!~queryStr.indexOf('=')) { const queryArr = queryStr.split('&'); for (const q of queryArr) { const arr = q.split('='); if (arr.length === 2) { query[arr[0]] = arr[1]; } } } if (!!page.layout) { const layout = this.layouts.find(layout => layout.viewName === page.layout); if (!this.currentLayout || this.currentLayout.viewname !== page.layout) { if (!!layout) { !!this.currentLayout && this.currentLayout.close(); layout.view.prototype.params = params; layout.view.prototype.query = query; layout.view.prototype.container = layout.container; this.currentLayout = new layout.view(); } } else { if (layout.options.update) { this.currentLayout['params'] = params; this.currentLayout['query'] = query; this.currentLayout.updateView(); } } } page.view.prototype.params = params; page.view.prototype.query = query; page.view.prototype.container = page.container; const view = new page.view(); if (!!this.currentView) { this.currentView.close(); } this.currentView = view; middlewares = app.getMiddleware(MIDDLEWARE.ROUTER, MIDDLEWARE_PROTOCOL.AFTER); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.AFTER, [pageFeature, app]); }.bind(this)); }.bind(this, page); if (!!page.pages && !!page.pages.length) { const url = page.originUrl || ''; const container = page.container || ''; const layout = page.layout || ''; for (const subPage of page.pages) { if (!subPage.url.startsWith('/')) { subPage.url = `${url === '/' ? '' : url}/${subPage.url}`; } if (!subPage.container) { subPage.container = container; } if (!subPage.layout) { subPage.layout = layout; } pages.push(subPage); } } } options.routes['*actions'] = '___NOT_FOUND___'; options['___NOT_FOUND___'] = actions => { if ('empty' in this.settings) { this.settings.empty(actions); } }; this.router = new (Backbone.Router.extend(options)); } }; ================================================ FILE: src/schema.js ================================================ module.exports = { create(schemaName, defineSchema) { const Schema = { wwtype: 'schema', schemaName }; function mixedDataWithSchema(data) { let schema = {}; for (let key in defineSchema) { if (defineSchema.hasOwnProperty(key)) { schema[key] = void 0; } } return Object.assign(schema, data); } Schema.validate = function(data) { const mixedData = mixedDataWithSchema(data); let errors = []; for (let key in mixedData) { if (mixedData.hasOwnProperty(key)) { let type = defineSchema[key]; if (type && type.hasOwnProperty('__validate__')) { let error = type.__validate__.call(type, key, data[key]); if (error) errors.push(error); } else { typeof window === 'object' && console.warn(`Is not defined in the schema field "${key}" is present.`); } } } return errors.length === 0 ? void 0 : errors; }; Schema.toSchema = function() { return defineSchema; }; return Schema; } }; ================================================ FILE: src/store.js ================================================ module.exports = { create(states) { return { wwtype: 'store', store: states }; } }; ================================================ FILE: src/types.js ================================================ const Error = require('./error'); const TYPE = { STRING: 'string', NUMBER: 'number', ARRAY: 'array', EMAIL: 'email', PHONE: 'phone', BOOLEAN: 'boolean' }; const REQUIRED = 'required'; const DEFAULT_VALUE = 'defaultValue'; const MIN = 'min'; const MAX = 'max'; const FORMAT = 'format'; const defaultTypeOptions = {}; const partialValidator = {}; const validator = function(key, value) { if (REQUIRED in this && !partialValidator[REQUIRED].call(this, value)) { return Error.create(`Required attribute "${key}" is missing.`, { key, value }); } if (value === void 0) return; // Data type checking if (!partialValidator[this.name].call(this, value)) { return Error.create(`"${key}" type property must be "${this.name}".`, { key, value }); } if (this.name === TYPE.NUMBER) { if (MIN in this && this[MIN] !== null && !partialValidator[MIN].call(this, value)) { return Error.create(`"${key}" is greater than ${this[MIN]}.`, { key, value }); } if (MAX in this && this[MAX] !== null && !partialValidator[MAX].call(this, value)) { return Error.create(`"${key}" may have a value of ${this[MAX]} or less.`, { key, value }); } } else if (this.name === TYPE.STRING) { if (MIN in this && this[MIN] !== null && !partialValidator[MIN].call(this, value)) { return Error.create(`"${key}" must be more than ${this[MIN]} characters long.`, { key, value }); } if (MAX in this && this[MAX] !== null && !partialValidator[MAX].call(this, value)) { return Error.create(`"${key}" should be no longer than ${this[MAX]} characters.`, { key, value }); } } }; const typeGenerator = function(name, supportOptions, options) { let defaults = {}, type; supportOptions.forEach(option => { defaults[option] = defaultTypeOptions[option]; }); type = Object.assign({ name: name }, defaults, options); type.__validate__ = validator; return type; }; defaultTypeOptions[REQUIRED] = false; defaultTypeOptions[DEFAULT_VALUE] = null; defaultTypeOptions[MIN] = null; defaultTypeOptions[MAX] = null; defaultTypeOptions[FORMAT] = null; partialValidator[TYPE.STRING] = function(value) { return typeof value === TYPE.STRING; }; partialValidator[TYPE.NUMBER] = function(value) { if (typeof value === 'number') return true; let stringType = String(value); let match = stringType.match(/^[+-]?(\d+\.?\d*)$|(\d*\.?\d+)$/g); if (!match) return false; if (match.length > 1) return false; return (match[0].length === stringType.length); }; partialValidator[TYPE.ARRAY] = function(value) { return Array.isArray(value); }; partialValidator[TYPE.EMAIL] = function(value) { const regexp = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; return regexp.test(value); }; partialValidator[TYPE.BOOLEAN] = function(value) { return Object.prototype.toString.call(value) === '[object Boolean]'; }; partialValidator[REQUIRED] = function(value) { if (this[REQUIRED]) return value !== void 0 && value !== null; return true; }; partialValidator[MIN] = function(value) { if (this.name === TYPE.NUMBER) { return value >= this[MIN]; } else if (this.name === TYPE.STRING) { return value.length >= this[MIN]; } return true; }; partialValidator[MAX] = function(value) { if (this.name === TYPE.NUMBER) { return value <= this[MAX]; } else if (this.name === TYPE.STRING) { return value.length <= this[MAX]; } return true; }; module.exports = { String(options) { return typeGenerator(TYPE.STRING, [ REQUIRED, DEFAULT_VALUE, MIN, MAX, FORMAT ], Object.assign({ defaultValue: '' }, options)); }, Number(options) { return typeGenerator(TYPE.NUMBER, [ REQUIRED, DEFAULT_VALUE, MIN, MAX ], Object.assign({ defaultValue: 0 }, options)); }, Array(options) { return typeGenerator(TYPE.ARRAY, [ REQUIRED, DEFAULT_VALUE ], Object.assign({ defaultValue: [] }, options)); }, Email(options) { return typeGenerator(TYPE.EMAIL, [ REQUIRED ], Object.assign({}, options)); }, Boolean(options) { return typeGenerator(TYPE.BOOLEAN, [ REQUIRED ], Object.assign({}, options)); } }; ================================================ FILE: src/view.js ================================================ const Backbone = require('backbone'); const MIDDLEWARE = require('./middleware').MIDDLEWARE; const MIDDLEWARE_PROTOCOL = require('./middleware').MIDDLEWARE_PROTOCOL; const MiddlewareRunner = require('./middleware').MiddlewareRunner; const PluginText = require('./plugin/text'); const PluginInputText = require('./plugin/input-text'); const PluginCheckbox = require('./plugin/checkbox'); const PluginSelect = require('./plugin/select'); const delegateEventSplitter = /^(\S+)\s*(.*)$/; const childEventSplitter = /^\@(\w+)\s*(.*)$/; const DEFAULT_ATTR_TYPE = 'text'; let View = null; let viewMount = null; let app = null; viewMount = function() { let tagName = this.tagName; let container = this.container; let template = this.template; let domStr; let $dom; if (!container) { throw new Error(`[${this.viewname}] Required attribute "container" is missing.`); } else { if (typeof container === 'string') { container = $(container); } } if (!container || !container.length) { throw new Error(`[${this.viewname}] "container" is undefined.`); } let renderData = this.getModel(); if (typeof this.viewWillMount === 'function') { renderData = this.viewWillMount(renderData) || renderData; } if (!!template) { if (typeof template === 'string') { domStr = template; } else { domStr = template(renderData); } if (tagName === 'div') { let proto = this; tagName = ''; do { if (proto.hasOwnProperty('tagName') && !!proto.tagName) { tagName = proto.tagName; break; } } while ((proto = proto.__proto__) && (proto.viewname !== '___WOOWA_VIEW___')); } if (!!tagName || $(domStr).length > 1) { $dom = $(`<${tagName || 'div'}>${domStr}`); } else { $dom = $(domStr); } if (!!this.className) { $dom.addClass(this.className); } if (this._viewMounted) { if ($.contains(container[0], this.el)) { this.$el.replaceWith($dom); } else { container.html($dom); } } else { if (!!this.append) { container.append($dom); } else if (!!this.prepend) { container.prepend($dom); } else if (!!this.after) { container.after($dom); } else { container.html($dom); } } this.setElement($dom); } else { this.setElement(container); } this._viewMounted = true; this._bindRef(); this._bindModel(); if (typeof this.viewComponentDidMount === 'function') { this.viewComponentDidMount($dom); } let viewDidMount; if (typeof this.viewDidMount === 'function') { viewDidMount = this.viewDidMount.bind(this, $dom); } let forceExcludeMiddleware = false; if ('forceExcludeMiddleware' in this) { forceExcludeMiddleware = (typeof this.forceExcludeMiddleware === 'function') ? this.forceExcludeMiddleware() : this.forceExcludeMiddleware; } const middlewares = forceExcludeMiddleware ? [] : app.getMiddleware(MIDDLEWARE.VIEW, MIDDLEWARE_PROTOCOL.AFTER); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.AFTER, [this], function() { ['viewDidMount', 'mount'].forEach(type => { this.dispatch(Woowahan.Event.create(type, this)); this.trigger(type); }); }.bind(this), viewDidMount); }; View = Backbone.View.extend({ super(...args) { View.prototype.initialize.apply(this, args); }, initialize(model) { this._viewMounted = false; this._views = {}; this.container = this.container; if (!!model) { this.setModel(model); } let forceExcludeMiddleware = false; if ('forceExcludeMiddleware' in this) { forceExcludeMiddleware = (typeof this.forceExcludeMiddleware === 'function') ? this.forceExcludeMiddleware() : this.forceExcludeMiddleware; } const middlewares = forceExcludeMiddleware ? [] : app.getMiddleware(MIDDLEWARE.VIEW, MIDDLEWARE_PROTOCOL.BEFORE); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.BEFORE, [this], function() { viewMount.apply(this); }.bind(this)); }, _plugins: { 'text': PluginText, 'input-text': PluginInputText, 'checkbox': PluginCheckbox, 'select': PluginSelect }, delegateEvents(events) { events = events || this.events; if (!events) return this; this.undelegateEvents(); for (let key in events) { if (events.hasOwnProperty(key)) { let method = events[key]; let match = key.match(delegateEventSplitter); let childMatch = key.match(childEventSplitter); let eventName; let selector; let listener; if (!!childMatch) { const index = method.indexOf('('); let params = []; eventName = childMatch[1]; selector = childMatch[2]; if (!!~index) { params = method.substring(index + 1, method.length - 1).split(',').map(el => $.trim(el)); method = method.substring(0, index); } listener = function(eventName, selector, method, params, event, ...args) { const _this = this; const getVal = function($el) { if ($el.is('input[type=checkbox]') || $el.is('input[type=radio]')) { return $el.is(':checked'); } else if ($el.is('select')) { return $el.val(); } else { return $el.val() || $el.text(); } }; const values = params.map(param => getVal(_this.$(param))); if (eventName === 'submit') { const inputs = {}; for (const el of _this.$(selector).find('input, select, textarea')) { inputs[$(el).attr('name')] = getVal($(el)); } values.push(inputs); } if (Object.prototype.toString.call(method) !== '[object Function]') { method = this[method]; } return method.apply(this, Array.prototype.concat.call(values, args, event)); }.bind(this, eventName, selector, method, params); } else { if (Object.prototype.toString.call(method) !== '[object Function]') { method = this[method]; } if (!method) continue; eventName = match[1]; selector = match[2]; listener = method.bind(this); } this.delegate(eventName, selector, listener); } } return this; }, updateView(container, ChildView, ...args) { if (arguments.length === 0) { this.close(false); viewMount.apply(this); return; } let viewContainer; let viewId; viewContainer = this.$(container); if (!viewContainer.length) { viewContainer = $(container); } if (!viewContainer.length) { throw new Error('View must have container'); } viewId = viewContainer.data('ref') || viewContainer.selector || container; if (!!container && !ChildView) { if (!!this._views[viewId]) { this._views[viewId].close(); delete this._views[viewId]; } return; } if (typeof ChildView !== 'function') { args = ChildView; } let view = this._views[viewId]; if (!!view) { view.setModel.apply(view, Array.prototype.concat.call(args, { silent: true })); view.container = viewContainer; let forceExcludeMiddleware = false; if ('forceExcludeMiddleware' in view) { forceExcludeMiddleware = (typeof view.forceExcludeMiddleware === 'function') ? view.forceExcludeMiddleware() : view.forceExcludeMiddleware; } let middlewares = forceExcludeMiddleware ? [] : app.getMiddleware(MIDDLEWARE.VIEW, MIDDLEWARE_PROTOCOL.UNMOUNT); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.UNMOUNT, [this], function() { if (typeof view.viewWillUnmount === 'function') { view.viewWillUnmount.call(view); } view.dispatch(Woowahan.Event.create('unmount', this)); view.trigger('unmount'); viewMount.apply(this._views[viewId]); }.bind(this)); } else { ChildView.prototype.container = viewContainer; view = new (Function.prototype.bind.apply(ChildView, Array.prototype.concat.call(ChildView, args))); this._views[viewId] = view; } return view; }, addView(container, ChildView, ...args) { this.removeView(container); return this.updateView(container, ChildView, ...args); }, removeView(container) { if (!!$(container).length) { this.updateView(container); } }, addPopup(view, options = {}, callback) { // TODO: options 추가 if (typeof options === 'function') { callback = options; options = {}; } view = (typeof view === 'string') ? this.getComponent(view) : view; const name = view.viewname; let containerName; let container; let popup; if (!!view) { let _id = options._id || `${name}Container${Date.now()}`; if (!!$(`div[data-id=${_id}]`).length) { return; } containerName = _id; container = $(`
                `); $('body').append(container); popup = this.addView(`div[data-id=${containerName}]`, view, Object.assign(options, { _id })); popup.on('remove', function() { popup.off('remove'); $(`div[data-id=${containerName}]`).remove(); }); popup.closePopup = function(containerName, callback, data) { this.removeView(`div[data-id=${containerName}]`); if (!!callback) { callback.call(this, data); } }.bind(this, containerName, callback); return popup; } else { console.error(`undefined popup name [${name}]`); } }, getStates(key) { return app.getStates(key); }, setStates(key, value) { app.setStates(key, value); }, getComponent(name) { return app.getComponent(name).extend({}); }, getRouteTables(routeName, params, query) { if (routeName === void 0) { return app.getRouteTables(); } let path = app.getRouteTables()[routeName]; if (!path) { console.error(`"${routeName}" not found`); return; } if (typeof params === 'string') { return `${path()}?${encodeURIComponent(params)}`; } else { if (typeof query === 'string') { return `${path(params)}?${encodeURIComponent(query)}`; } else { return path(params); } } }, dispatch(action, subscriber, options) { action.__options = options || {}; switch (action.wwtype) { case 'event': this.$el.trigger(action.type, ...action.data); break; case 'action': if (!!subscriber) { subscriber = subscriber.bind(this); } app.dispatch(action, subscriber); break; } }, setModel(key, value) { let attrs; if (typeof key === 'string' && typeof value !== 'undefined') { attrs = { [key]: value }; } else { attrs = key; } if (attrs instanceof Backbone.Model) { if (!!this.model) { this._unbindModel(); } this.model = attrs.clone(); if (this._viewMounted) { this._bindModel(); } return; } if (Object.prototype.toString.call(attrs) === '[object Null]' || !this.model || !(this.model instanceof Backbone.Model)) { this.model = new Backbone.Model(); if (this._viewMounted) { this._bindModel(); } } for (let attr in attrs) { if (attrs.hasOwnProperty(attr)) { let value = this.model.get(attr); if (value !== attrs[attr]) { this.model.set(attr, attrs[attr]); } } } }, getModel(key) { if (!this.model || !(this.model instanceof Backbone.Model)) { this.model = new Backbone.Model(); } if (!key) { return this.model.clone().toJSON(); } return this.model.clone().get(key); }, log() { console.warn('View.log:: Deprecated and will be removed in a future release.'); }, logStamp(...args) { this.log(args); }, close(remove) { this._unbindModel(); let forceExcludeMiddleware = false; if ('forceExcludeMiddleware' in this) { forceExcludeMiddleware = (typeof this.forceExcludeMiddleware === 'function') ? this.forceExcludeMiddleware() : this.forceExcludeMiddleware; } let middlewares = forceExcludeMiddleware ? [] : app.getMiddleware(MIDDLEWARE.VIEW, MIDDLEWARE_PROTOCOL.UNMOUNT); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.UNMOUNT, [this], function() { if (typeof this.viewWillUnmount === 'function') { this.viewWillUnmount(); } if (this.refs) { Object.keys(this.refs).forEach(refName => { if (Array.isArray(this.refs[refName])) { this.refs[refName] = []; } }); } this.dispatch(Woowahan.Event.create('unmount', this)); this.trigger('unmount'); this._removeChild(remove); if (remove + '' !== 'false' && !!this) { this._unbindRef(); this.remove(); } }.bind(this)); }, remove(...args) { this.dispatch(Woowahan.Event.create('remove', this)); this.trigger('remove'); Backbone.View.prototype.remove.apply(this, args); }, _syncElement(source, target) { let $source = $(source); let $target = $(target); if ($source.is('input[type=text]') || $source.is('input[type=number]') || $source.is('input[type=tel]') || $source.is('textarea')) { $target.val($source.val()); } else if ($source.is('input[type=checkbox]') || $source.is('input[type=radio]')) { $target.prop('checked', $source.is(':checked')); } else if ($source.is('select')) { $target.val($source.val()); } }, _bindRef() { if (!this.refs) { this.refs = {}; } for (const element of this.$el.find('[data-ref]')) { let $element = $(element); let refName = $element.data('ref'); let refGroup = $element.data('refGroup') || false; let refFormRestore = $element.data('refFormRestore') || false; if (refGroup) { if (this.refs[refName]) { this.refs[refName].push(element); } else { this.refs[refName] = [element]; } } else { let currentElement = this.refs[refName]; this.refs[refName] = element; if (currentElement) { refFormRestore && this._syncElement(currentElement, this.refs[refName]); currentElement = null; } } } }, _bindModel() { this._unbindModel(); let targetElements = this.$el.find('[data-role=bind]'); let element; for (element of targetElements) { let key = $(element).data('name'); let eventName = `change:${key}`; let type = ($(element).data('type') || DEFAULT_ATTR_TYPE).toLowerCase(); let value = this.model.get(key); this.listenTo(this.model, eventName, function(element, key, type) { let value = this.model.get(key); this._plugins[type].call(this, element, value); }.bind(this, element, key, type)); if (typeof value !== 'undefined') this._plugins[type].call(this, element, value); } targetElements = this.$el.find('[data-role=plugin]'); for (element of targetElements) { let plugins = $(element).data('plugins'); if (!plugins) throw new Error('plugin must have plugins'); plugins.split('+').map(s => $.trim(s)).forEach(plugin => { let [keys, type] = plugin.split('=>').map(s => $.trim(s)); keys = keys.split(',').map(k => $.trim(k)); type = type.toLowerCase(); keys.forEach(key => { if (key === '') return; let value = this.model.get(key); this.listenTo(this.model, `change:${key}`, function(element, key, type) { let value = this.model.get(key); this._plugins[type].call(this, element, value); }.bind(this, element, key, type)); if (typeof value !== 'undefined') this._plugins[type].call(this, element, value); }); }); } }, _unbindRef() { for (const ref in this.refs) { if (this.refs.hasOwnProperty(ref)) { this.refs[ref] = null; } } this.refs = null; }, _unbindModel() { this.stopListening(this.model); }, _removeChild(remove) { for (let key in this._views) { if (this._views.hasOwnProperty(key)) { this._views[key].close.call(this._views[key], remove); delete this._views[key]; } } } }); View.create = (viewName, options) => { let view = View.extend(options); view.viewname = viewName; Object.defineProperty(view.prototype, 'viewname', { value: viewName, writable: false }); return view; }; module.exports = function(toolset) { if (!app) { app = toolset; } return View; }; ================================================ FILE: src/woowahan.js ================================================ const Backbone = require('backbone'); const Router = require('./router'); const MIDDLEWARE = require('./middleware').MIDDLEWARE; const MIDDLEWARE_PROTOCOL = require('./middleware').MIDDLEWARE_PROTOCOL; const MiddlewareRunner = require('./middleware').MiddlewareRunner; const INTERVAL = 1000/60; const toolset = { get dispatch() { return instance.dispatch.bind(instance); }, get getMiddleware() { return instance.getMiddleware.bind(instance); }, get getStates() { return instance.getStates.bind(instance); }, get setStates() { return instance.setStates.bind(instance); }, get getComponent() { return instance.getComponent.bind(instance); }, get getRouteTables() { return instance.getRouteTables.bind(instance); }, get addAction() { return instance.addAction.bind(instance); }, get removeAction() { return instance.removeAction.bind(instance); }, get addError() { return instance.addError.bind(instance); } }; let instance; /* Enable backbone.js devtools for chrome */ if (global.__backboneAgent) { global.__backboneAgent.handleBackbone(Backbone); } Backbone.Model.prototype.idAttribute = '___ID_ATTR___'; Backbone.View.prototype.viewname = '___WOOWA_VIEW___'; class Woowahan { constructor(settings = {}) { this.reducers = settings.reducers || {}; this.components = settings.components || {}; this.middlewares = { app: { before: [], after: [], }, router: { before: [], after: [], }, reducer: { before: [], after: [], }, view: { before: [], after: [], unmount: [], }, }; this.importViews = {}; this.store = null; this.queue = []; this.pretasks = []; this.actionObject = {}; this.queuemonitor = null; instance = this; this.enableQueue(); } import(Package) { Object.keys(Package.reducers || {}).forEach(reducerName => this.use(Package.reducers[reducerName])); Object.keys(Package.views || {}).forEach(viewname => this.importViews[viewname] = Package.views[viewname]); } getView(viewname) { return this.importViews[viewname]; } enableQueue() { this.queuemonitor = setInterval(this.queuing.bind(this), INTERVAL); } disableQueue() { this.queuemonitor = clearInterval(this.queuemonitor); } addAction(id) { this.actionObject[id] = Date.now(); if (this.numberOfWorkAction() === 1) { this.trigger('start'); } } removeAction(id) { delete this.actionObject[id]; if (this.numberOfWorkAction() === 0) { this.trigger('finish'); } } addError(err) { this.trigger('error', err); } queuing() { this.disableQueue(); let item = this.queue.shift(); if (!!item) { let reducer = this.reducers[item.action.type]; if (!reducer) { this.enableQueue(); throw new Error('The unregistered reducer. Please check the type of action, if there is a written reducer use after registration.'); } // 리스너가 없는 경우 허용 item.subscriber = item.subscriber || function() {}; if (typeof item.subscriber !== 'function') { this.enableQueue(); throw new Error('The listener must be a function. If you do not need the listener it may not be specified.'); } if (reducer.schema) { let errors = reducer.schema.validate(item.action.data); if (errors) { this.trigger('error', errors); } else { new (Function.prototype.bind.apply(reducer, Array.prototype.concat.call(reducer, item.action.data, item.subscriber.bind(this))))(); } } else { new (Function.prototype.bind.apply(reducer, Array.prototype.concat.call(reducer, item.action.data, item.subscriber.bind(this))))(); } } this.enableQueue(); } bindStore(store) { this.store = store; } bindReducer(reducer) { this.reducers[reducer.actionName] = reducer; } bindComponent(component) { this.components[component.name] = component; } bindPlugin(plugin) { const type = plugin.type.toLowerCase(); if (Woowahan.View.prototype._plugins.hasOwnProperty(type)) { throw new Error('Duplicate plugin name'); } Woowahan.View.prototype._plugins[type] = plugin.plugin; } combineReducer(reducers) { if (!reducers) return; reducers.forEach(reducer => { this.bindReducer(reducer); }); } getStates(key) { return (typeof key !== 'undefined') ? this.store[key] : this.store; } setStates(key, value) { let store; if (typeof key === 'string' && typeof value !== 'undefined') { store = { [key]: value }; } else { store = key; } if (!this.store) { this.store = {}; } Object.assign(this.store, store); } getMiddleware(type, delegate) { return this.middlewares[type][delegate]; } getComponent(name) { const component = this.components[name]; if (!!component) { return component.view; } } getRouteTables() { return Router.routeTables; } dispatch(action, subscriber) { this.queue.push({ action, subscriber }); } use(module) { if (Array.isArray(module)) { module.forEach(m => this.useModule(m)); } else { if (typeof module === 'object' && !('wwtype' in module)) { Object.keys(module).forEach(key => { if (typeof module[key] === 'function') this.useModule(module[key]); }); } else { // function this.useModule(module); } } } useModule(module) { switch (module.wwtype) { case 'reducer': this.bindReducer(module); break; case 'layout': Router.bindLayout(module); break; case 'store': this.bindStore(module.store); break; case 'component': console.warn('Component:: Deprecated and will be removed in a future release.'); this.bindComponent(module); break; case 'plugin': this.bindPlugin(module); break; } } set(middleware, options = {}) { let instance = new middleware(options); if (instance.mwtype) { Object.values(MIDDLEWARE_PROTOCOL).forEach(delegate => { delegate in instance && this.middlewares[instance.mwtype][delegate].push(instance); }); } else { throw new Error('Required attribute "mwtype" is missing.'); } } start(design, options = {}) { if (typeof jQuery === 'undefined') { throw new Error('jQuery is not loaded!!'); } let wait = setInterval(() => { switch (document.readyState) { case 'complete': case 'loaded': break; default: return; } clearInterval(wait); if (Backbone.History.started) { Backbone.history.stop(); } if (!!design) { Router.design(design, options, toolset); } let middlewares = this.getMiddleware(MIDDLEWARE.APP, MIDDLEWARE_PROTOCOL.BEFORE); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.BEFORE, [toolset], function() { middlewares = this.getMiddleware(MIDDLEWARE.APP, MIDDLEWARE_PROTOCOL.AFTER); MiddlewareRunner.run(middlewares, MIDDLEWARE_PROTOCOL.AFTER, [toolset], function() { Backbone.history.start({ pushState: !!options.pushState }); }); }.bind(this)); }, 1); } numberOfAction() { return this.queue.length; } numberOfWorkAction() { return Object.keys(this.actionObject).length; } } Object.assign(Woowahan.prototype, Backbone.Events); Woowahan.$ = Backbone.$; Woowahan.View = require('./view')(toolset); Woowahan.Reducer = require('./reducer')(toolset); Woowahan.Error = require('./error'); Woowahan.Types = require('./types'); Woowahan.Store = require('./store'); Woowahan.Action = require('./action'); Woowahan.Event = require('./event'); Woowahan.Schema = require('./schema'); Woowahan.Layout = require('./layout'); Woowahan.Component = require('./component'); Woowahan.Plugin = require('./plugin'); module.exports = global.Woowahan = Woowahan; /** components */ Woowahan.CollectionView = require('./collection-view')(toolset); Woowahan.ItemView = require('./item-view')(toolset); Woowahan.PopupView = require('./popup-view')(toolset); Woowahan.version = '1.2.2'; ================================================ FILE: test/mocha.opts ================================================ ================================================ FILE: test/schema.js ================================================ import { assert } from 'chai'; import Woowahan from '../'; describe('Schema & Validation:', () => { let defaultSchema = Woowahan.Schema.create('defaultSchema', { name: Woowahan.Types.String(), age: Woowahan.Types.Number() }); let attrsSchema = Woowahan.Schema.create('attrsSchema', { name: Woowahan.Types.String({ required: true }), age: Woowahan.Types.Number({ min: 18, max: 120 }), email: Woowahan.Types.Email() }); it('Set woowahan type (wwtype) name', () => { assert.equal(defaultSchema.wwtype, 'schema'); }); it('Set schema name', () => { assert.equal(defaultSchema.schemaName, 'defaultSchema'); }); it('Check required attribute', () => { assert.lengthOf(attrsSchema.validate({}), 1); }); it('Check string data ', () => { assert.equal(defaultSchema.validate({ name: 'kim' }), void 0); assert.lengthOf(defaultSchema.validate({ name: 1 }), 1); }); it('Check invalide number data', () => { assert.lengthOf(defaultSchema.validate({ name: 'kim', age: '10살' }), 1); }); it('Check valide string number data', () => { assert.equal(defaultSchema.validate({ name: 'kim', age: '30' }), void 0); assert.equal(defaultSchema.validate({ name: 'kim', age: '+30' }), void 0); assert.lengthOf(defaultSchema.validate({ name: 'kim', age: '30.1 343' }), 1); assert.lengthOf(defaultSchema.validate({ name: 'kim', age: '30.1.343' }), 1); }); it('Check min value for number type', () => { assert.equal(attrsSchema.validate({ name: 'kim', age: 25 }), void 0); assert.equal(attrsSchema.validate({ name: 'kim', age: '25' }), void 0); assert.lengthOf(attrsSchema.validate({ name: 'kim', age: 10 }), 1); assert.lengthOf(attrsSchema.validate({ name: 'kim', age: '10' }), 1); }); it('Check max value for number type', () => { assert.equal(attrsSchema.validate({ name: 'kim', age: 20 }), void 0); assert.equal(attrsSchema.validate({ name: 'kim', age: '20' }), void 0); assert.lengthOf(attrsSchema.validate({ name: 'kim', age: 145 }), 1); assert.lengthOf(attrsSchema.validate({ name: 'kim', age: '145' }), 1); assert.lengthOf(attrsSchema.validate({ name: 'kim', age: '-145' }), 1); }); it('Multiple validation', () => { assert.lengthOf(attrsSchema.validate({ age: 200 }), 2); }); it('Check valide email', () => { assert.equal(attrsSchema.validate({ name: 'kim', age: 30, email: 'your.name@company.com' }), void 0); assert.equal(attrsSchema.validate({ name: 'kim', age: 30, email: 'your-name@company.kr' }), void 0); assert.equal(attrsSchema.validate({ name: 'kim', age: 30, email: 'yourname@company.co.kr' }), void 0); }); it('Check invalide email', () => { assert.lengthOf(attrsSchema.validate({ name: 'kim', age: 30, email: '@company.com' }), 1); assert.lengthOf(attrsSchema.validate({ name: 'kim', age: 30, email: 'company.com' }), 1); assert.lengthOf(attrsSchema.validate({ name: 'kim', age: 30, email: '@@test' }), 1); assert.lengthOf(attrsSchema.validate({ name: 'kim', age: 30, email: 'foo' }), 1); }); describe('Default value', () => { it('Default String', () => { let defaultString = 'my xyz string'; let schema = Woowahan.Schema.create('schema', { name: Woowahan.Types.String({ defaultValue: defaultString }) }); }); }); }); ================================================ FILE: test/store.js ================================================ import { assert } from 'chai'; import Woowahan from '../'; describe('Store', () => { it('Create Store', () => { let app = new Woowahan(); app.use(Woowahan.Store.create({ foo: {} })); assert.typeOf(app.getStates().foo, 'object'); }); }); ================================================ FILE: test/types.js ================================================ import { assert } from 'chai'; import Woowahan from '../'; describe('Types', () => { describe('Create String Type', () => { it('Default Attributes', () => { let type = Woowahan.Types.String(); assert.typeOf(type, 'object'); assert.equal(type.name, 'string'); assert.equal(type.defaultValue, ''); assert.equal(type.required, false); }); it('Set Required Attributes', () => { let type = Woowahan.Types.String({ required: true }); assert.equal(type.required, true); }); it('Set DefaultValue Attributes', () => { let defaultValue = 'Do Something'; let type = Woowahan.Types.String({ defaultValue }); assert.equal(type.defaultValue, defaultValue); }); it('Set Min, Max Attributes', () => { let type = Woowahan.Types.String({ min: 4, max: 20 }); assert.equal(type.min, 4); assert.equal(type.max, 20); }); }); describe('Create Number Type', () => { it('Default Attributes', () => { let type = Woowahan.Types.Number(); assert.typeOf(type, 'object'); assert.equal(type.name, 'number'); assert.equal(type.defaultValue, 0); assert.equal(type.required, false); }); it('Set Required Attributes', () => { let type = Woowahan.Types.Number({ required: true }); assert.equal(type.required, true); }); it('Set DefaultValue Attributes', () => { let defaultValue = 10; let type = Woowahan.Types.Number({ defaultValue }); assert.equal(type.defaultValue, defaultValue); }); it('Set Min, Max Attributes', () => { let type = Woowahan.Types.Number({ min: 4, max: 20 }); assert.equal(type.min, 4); assert.equal(type.max, 20); }); }); describe('Create Array Type', () => { it('Default Attributes', () => { let type = Woowahan.Types.Array(); assert.typeOf(type, 'object'); assert.equal(type.name, 'array'); }); it('Set Required Attributes', () => { let type = Woowahan.Types.Array({ required: true }); assert(type.required, true); }); }); describe('Create Email Type', () => { it('Default Attributes', () => { let type = Woowahan.Types.Email(); assert.typeOf(type, 'object'); assert.equal(type.name, 'email'); }); it('Set Required Attributes', () => { let type = Woowahan.Types.Email({ required: true }); assert(type.required, true); }); }); });