You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2020/07/31 11:09:48 UTC

[shardingsphere-elasticjob] branch master updated: Remove cloud console (#1311)

This is an automated email from the ASF dual-hosted git repository.

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere-elasticjob.git


The following commit(s) were added to refs/heads/master by this push:
     new 96d0917  Remove cloud console (#1311)
96d0917 is described below

commit 96d0917e6dbe1b16b682bb0e05b6bad55fbf83c6
Author: Haoran Meng <me...@gmail.com>
AuthorDate: Fri Jul 31 19:09:39 2020 +0800

    Remove cloud console (#1311)
---
 .../cloud/console/config/WebMvcConfig.java         |   10 -
 .../src/main/resources/application.properties      |    5 -
 .../src/main/resources/console/css/common.css      |  161 -
 .../src/main/resources/console/favicon.ico         |  Bin 1150 -> 0 bytes
 .../main/resources/console/html/app/add_app.html   |   98 -
 .../resources/console/html/app/apps_overview.html  |   99 -
 .../resources/console/html/app/detail_app.html     |   89 -
 .../resources/console/html/app/modify_app.html     |   98 -
 .../console/html/history/job_dashboard.html        |  131 -
 .../console/html/history/job_exec_details.html     |  101 -
 .../console/html/history/job_exec_status.html      |  122 -
 .../main/resources/console/html/job/add_job.html   |  171 -
 .../resources/console/html/job/detail_job.html     |  163 -
 .../resources/console/html/job/job_status.html     |  117 -
 .../resources/console/html/job/jobs_overview.html  |  126 -
 .../resources/console/html/job/modify_job.html     |  171 -
 .../main/resources/console/i18n/message.properties |   16 -
 .../resources/console/i18n/message_en.properties   |  185 -
 .../resources/console/i18n/message_zh.properties   |  185 -
 .../src/main/resources/console/index.html          |  301 -
 .../src/main/resources/console/js/app/add_app.js   |   21 -
 .../main/resources/console/js/app/app_common.js    |  132 -
 .../main/resources/console/js/app/apps_overview.js |  179 -
 .../main/resources/console/js/app/modify_app.js    |   21 -
 .../src/main/resources/console/js/common/common.js |  161 -
 .../resources/console/js/history/history_common.js |   59 -
 .../resources/console/js/history/job_dashboard.js  |  274 -
 .../console/js/history/job_exec_details.js         |   68 -
 .../console/js/history/job_exec_status.js          |   82 -
 .../src/main/resources/console/js/index.js         |   45 -
 .../src/main/resources/console/js/job/add_job.js   |   21 -
 .../main/resources/console/js/job/job_common.js    |  222 -
 .../main/resources/console/js/job/jobs_overview.js |  204 -
 .../main/resources/console/js/job/modify_job.js    |   21 -
 .../console/lib/AdminLTE/css/AdminLTE.min.css      |    7 -
 .../lib/AdminLTE/css/skins/_all-skins.min.css      |    1 -
 .../resources/console/lib/AdminLTE/js/app.min.js   |   13 -
 .../BootstrapValidator/js/bootstrapValidator.js    | 7823 --------------------
 .../js/bootstrapValidator_zh_CN.js                 |  386 -
 .../lib/bootstrap-table/bootstrap-table-zh-CN.js   |   44 -
 .../lib/bootstrap-table/bootstrap-table.css        |  302 -
 .../console/lib/bootstrap-table/bootstrap-table.js | 2801 -------
 .../lib/bootstrap-table/bootstrap-table.min.css    |    1 -
 .../lib/bootstrap-table/bootstrap-table.min.js     |    8 -
 .../console/lib/bootstrap/css/bootstrap.css        | 6800 -----------------
 .../console/lib/bootstrap/css/bootstrap.css.map    |    1 -
 .../console/lib/bootstrap/css/bootstrap.min.css    |    5 -
 .../fonts/glyphicons-halflings-regular.eot         |  Bin 20127 -> 0 bytes
 .../fonts/glyphicons-halflings-regular.svg         |  288 -
 .../fonts/glyphicons-halflings-regular.ttf         |  Bin 45404 -> 0 bytes
 .../fonts/glyphicons-halflings-regular.woff        |  Bin 23424 -> 0 bytes
 .../fonts/glyphicons-halflings-regular.woff2       |  Bin 18028 -> 0 bytes
 .../console/lib/bootstrap/js/bootstrap.js          | 2317 ------
 .../console/lib/bootstrap/js/bootstrap.min.js      |    7 -
 .../main/resources/console/lib/bootstrap/js/npm.js |   13 -
 .../lib/daterangepicker/daterangepicker.css        |  269 -
 .../console/lib/daterangepicker/daterangepicker.js | 1622 ----
 .../console/lib/daterangepicker/moment.js          | 4040 ----------
 .../console/lib/daterangepicker/moment.min.js      |    7 -
 .../lib/font-awesome-4.5.0/css/font-awesome.css    | 2086 ------
 .../font-awesome-4.5.0/css/font-awesome.min.css    |    4 -
 .../lib/font-awesome-4.5.0/fonts/FontAwesome.otf   |  Bin 109688 -> 0 bytes
 .../fonts/fontawesome-webfont.eot                  |  Bin 70807 -> 0 bytes
 .../fonts/fontawesome-webfont.svg                  |  655 --
 .../fonts/fontawesome-webfont.ttf                  |  Bin 142072 -> 0 bytes
 .../fonts/fontawesome-webfont.woff                 |  Bin 83588 -> 0 bytes
 .../fonts/fontawesome-webfont.woff2                |  Bin 66624 -> 0 bytes
 .../console/lib/highcharts/js/highcharts.js        |  383 -
 .../input-mask/jquery.inputmask.date.extensions.js |  488 --
 .../lib/input-mask/jquery.inputmask.extensions.js  |  122 -
 .../console/lib/input-mask/jquery.inputmask.js     | 1627 ----
 .../jquery.inputmask.numeric.extensions.js         |  177 -
 .../jquery.inputmask.phone.extensions.js           |   50 -
 .../jquery.inputmask.regex.extensions.js           |  169 -
 .../lib/input-mask/phone-codes/phone-be.json       |   45 -
 .../lib/input-mask/phone-codes/phone-codes.json    |  294 -
 .../console/lib/input-mask/phone-codes/readme.txt  |    1 -
 .../console/lib/jQuery/jQuery-2.1.4.min.js         |    4 -
 .../lib/jQuery/jquery.i18n.properties-min.js       |    9 -
 79 files changed, 36728 deletions(-)

diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/console/config/WebMvcConfig.java b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/console/config/WebMvcConfig.java
index 9e1e113..131113f 100644
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/console/config/WebMvcConfig.java
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/java/org/apache/shardingsphere/elasticjob/cloud/console/config/WebMvcConfig.java
@@ -36,14 +36,4 @@ public class WebMvcConfig implements WebMvcConfigurer {
         HandlerTypePredicate handlerTypePredicate = HandlerTypePredicate.forAnnotation(RestController.class);
         configurer.addPathPrefix("/api", handlerTypePredicate);
     }
-    
-    @Override
-    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
-        registry.addResourceHandler("/**").addResourceLocations("classpath:/console/");
-    }
-    
-    @Override
-    public void addViewControllers(final ViewControllerRegistry registry) {
-        registry.addViewController("/").setViewName("/index.html");
-    }
 }
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/application.properties b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/application.properties
index 39c6400..b750ea0 100644
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/application.properties
+++ b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/application.properties
@@ -16,8 +16,3 @@
 #
 # Default web server port
 server.port=8899
-# Console login account
-auth.root_username=root
-auth.root_password=root
-auth.guest_username=guest
-auth.guest_password=guest
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/css/common.css b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/css/common.css
deleted file mode 100755
index 6129972..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/css/common.css
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-.form-group.toolbar label {
-    float: left;
-    width: 130px;
-    height: 52px;
-    padding-left: 20px;
-    text-align: center;
-}
-.form-group.toolbar span {
-    float: left;
-    width: 40px;
-    height: 52px;
-    text-align: center;
-}
-.form-horizontal label i{
-    padding: 0 7px 0 0;
-    color: #fb4d59;
-    vertical-align: -2px;
-}
-.form-horizontal :-moz-placeholder { /* Mozilla Firefox 4 to 18 */
-    color: #DCDCDC;
-    opacity: 1;
-}
-.form-horizontal ::-moz-placeholder { /* Mozilla Firefox 19+ */
-    color: #DCDCDC;
-    opacity: 1;
-}
-.form-horizontal ::-webkit-input-placeholder{
-    color: #DCDCDC;
-}
-
-.form-horizontal input:-ms-input-placeholder{
-    color: #DCDCDC;
-    opacity: 1;
-}
-.form-horizontal input::-webkit-input-placeholder{
-    color: #DCDCDC;
-    opacity: 1;
-}
-/* dashboard  css */
-.table-line{
-    background-color:#00c0ef;
-    height:3px;width:100%;
-    margin-bottom:0;
-}
-.chart-right{
-    margin-right:-15px;
-}
-.chart-left{
-    margin-left:-6px;
-}
-.chart-size{
-    padding-left:0;
-    padding-right:0;
-}
-.chart-size.row{
-    margin:auto 0;
-}
-.chart-size-solation{
-    padding-left:0;
-    padding-right:0;
-    height:230px;
-}
-.set-size{
-    margin:0 auto;
-    width:98%;
-    height:220px;
-}
-.page-height-min{
-    min-height:780px;
-}
-/* app_overview job_overview  css */
-.form-group a{
-    width:80px;
-    font-size:14px; 
-    padding: 6px;
-    margin-left:23px;
-}
-.detail-model-size{
-    width:160%;
-    margin-left:-180px;
-}
-.update-model-size{
-    width:210%;
-    margin-left:-290px;
-}
-.size-font{
-    font-size:20px;
-}
-.center-font{
-    text-align:center;
-}
-.right-navigation-bar{
-    margin-left:20px;
-    width:190px;
-}
-.width-appURL{
-    margin-left:74px;
-}
-.app-width-size{
-    width:97%;
-}
-/* index css */
-#control-sidebar-theme-demo-options-tab li {
-    float:left; 
-    width: 33.33333%; 
-    padding: 5px;
-}
-#control-sidebar-theme-demo-options-tab li a {
-    display: block; 
-    box-shadow: 0 0 3px rgba(0,0,0,0.4);
-}
-.top-span {
-    display:block; 
-    width: 100%; 
-    float: left; 
-    height: 7px; 
-}
-#span-black{
-    background: #fefefe;
-}
-.down-span-left {
-    display:block; 
-    width: 20%; 
-    float: left; 
-    height: 20px; 
-    background: #222d32;
-}
-.down-span-right {
-    display:block; 
-    width: 80%; 
-    float: left; 
-    height: 20px; 
-    background: #f4f5f7;
-}
-#modal-dialog-width{
-    width: 60%;
-}
-#execute-result {
-    float: top;
-    padding-left: 20px;
-}
-#logo-font-size {
-    font-size: 18px;
-}
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/favicon.ico b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/favicon.ico
deleted file mode 100755
index 634dc4c..0000000
Binary files a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/favicon.ico and /dev/null differ
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/add_app.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/add_app.html
deleted file mode 100755
index 6bfe0b9..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/add_app.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="box-body">
-    <div role="tabpanel" class="tab-pane active" onsubmit="return false;">
-        <form id="app-form" class="form-horizontal">
-            <div class="row">
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="app-name" class="col-sm-6 control-label" data-lang="app-name"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" placeholder="yourappName" id="app-name" name="appName" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="bootstrap-script" class="col-sm-6 control-label" data-lang="app-bootstrap-script"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" placeholder="bin/start.sh" id="bootstrap-script" name=bootstrapScript class="form-control" data-toggle="tooltip" data-placement="bottom" title="启动脚本,如:bin\start.sh。"/>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="cpu-count" class="col-sm-6 control-label" data-lang="app-cpu-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" value="1.0" min="0.1" step="0.1" id="cpu-count" name="cpuCount" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="app-memory" class="col-sm-6 control-label" data-lang="app-memory"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" value="128" min="16" id="app-memory" name="appMemory" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="event-trace-sampling-count" class="col-sm-6 control-label" data-lang="app-event-trace-sampling-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" value="0" min="0" id="event-trace-sampling-count" name="eventTraceSamplingCount" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="app-cache-enable" class="col-sm-6 control-label" data-lang="app-cache-enable"></label>
-                        <div class="col-sm-6">
-                            <input type="checkbox" checked="checked"  id="app-cache-enable" name="appCacheEnable" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group">
-                    <div class="width-appURL">
-                        <label for="app-url" class="col-sm-2 control-label" data-lang="app-url"><i>*</i></label>
-                        <div class="col-sm-8">
-                            <div class="app-width-size">
-                                <input type="text" placeholder="http://file_host:8080/foo-job.tar.gz" id="app-url" name="appURL" class="form-control" data-toggle="tooltip" data-placement="bottom" title="必须是可以通过网络访问到的路径。如:http://file_host:8080/your-job.tar.gz"/>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="form-group">
-                <div class="center-font">
-                    <button id="save-button" type="submit" class="btn-xs btn-primary" data-lang="operation-submit"></button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
-<script src="lib/BootstrapValidator/js/bootstrapValidator.js"></script>
-<script src="lib/BootstrapValidator/js/bootstrapValidator_zh_CN.js"></script>
-<script src="js/app/app_common.js"></script>
-<script src="js/app/add_app.js"></script>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/apps_overview.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/apps_overview.html
deleted file mode 100755
index 1ba3afd..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/apps_overview.html
+++ /dev/null
@@ -1,99 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="content-wrapper">
-    <div class="page-height-min">
-        <section class="content-header">
-            <h1 data-lang="sidebar-config"></h1>
-            <ol class="breadcrumb">
-                <li class="active"><i class="fa fa-laptop" data-lang="sidebar-app"></i></li>
-                <li class="active" data-lang="sidebar-config"></li>
-            </ol>
-        </section>
-        <section class="content">
-            <table id="app-table" data-pagination="true" data-page-list="[10, 20, 50, 100]" data-search="true" data-show-refresh="true" data-show-toggle="true" data-striped="true" data-show-columns="true">
-                <thead>
-                <tr>
-                    <th data-field="appName" data-sortable="true"><span data-lang="app-name"></span></th>
-                    <th data-field="appURL" data-sortable="true"><span data-lang="app-url"></span></th>
-                    <th data-field="bootstrapScript" data-sortable="true"><span data-lang="app-bootstrap-script"></span></th>
-                    <th data-field="operation" data-formatter="operationApp"><span data-lang="operation"></span></th>
-                </tr>
-                </thead>
-            </table>
-            <button type="button" class="btn-xs btn-success" data-toggle="modal" id="add-app" data-lang="operation-add"></button>
-        </section>
-    </div>
-</div>
-<div class="modal" id="data-detail-app" tabindex="-1" role="dialog" aria-labelledby="detail-modal-label" aria-hidden="true">
-    <div class="modal-dialog" >
-        <div class="update-model-size">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
-                    <h2 class="modal-title" data-lang="app-detail"></h2>
-                </div>
-                <div class="modal-body" id ="detail-app-body">
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-<div class="modal" id="data-update-app" tabindex="-1" role="dialog" aria-labelledby="modify-modal-label" aria-hidden="true">
-    <div class="modal-dialog">
-        <div class="update-model-size">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
-                    <h2 class="modal-title" data-lang="update-app"></h2>
-                </div>
-                <div class="modal-body" id="update-app-body">
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-<div class="modal" id="data-add-app" tabindex="-1" role="dialog" aria-labelledby="add-modal-label" aria-hidden="true">
-    <div class="modal-dialog">
-        <div class="update-model-size">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
-                    <h2 class="modal-title" data-lang="add-app"></h2>
-                </div>
-                <div class="modal-body" id="add-app-body">
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-<div class="modal" id="delete-data-app" tabindex="-1" role="dialog" aria-labelledby="delete-modal-label" aria-hidden="true">
-    <div class="modal-dialog">
-        <div class="modal-content">
-            <div class="modal-body">
-                <h3 class="size-font" data-lang="confirm-to-delete"></h3>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn-xs btn-danger" id="delete-app-confirm" data-dismiss="modal" data-lang="operation-confirm"></button>
-                <button type="button" class="btn-xs btn-success" id="delete-app-remove" data-dismiss="modal" data-lang="operation-cancel"></button>
-            </div>
-        </div>
-    </div>
-</div>
-<script src="lib/bootstrap-table/bootstrap-table.js"></script>
-<script src="js/common/common.js"></script>
-<script src="js/app/apps_overview.js"></script>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/detail_app.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/detail_app.html
deleted file mode 100755
index 90db633..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/detail_app.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="box-body">
-    <div role="tabpanel" class="tab-pane active" onsubmit="return false;">
-        <form id="app-form" class="form-horizontal">
-            <div class="row">
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="app-name" class="col-sm-6 control-label" data-lang="app-name"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" disabled="disabled" placeholder="yourappName" id="app-name" name="appName" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-5" >
-                    <div class="form-group">
-                        <label for="bootstrap-script" class="col-sm-6 control-label" data-lang="app-bootstrap-script"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" disabled="disabled" placeholder="bin/start.sh" id="bootstrap-script" name="bootstrapScript" class="form-control" data-toggle="tooltip" data-placement="bottom" title="启动脚本,如:bin\start.sh。"/>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="cpu-count" class="col-sm-6 control-label" data-lang="app-cpu-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" disabled="disabled" value="1.0" min="1.0" step="0.1" id="cpu-count" name="cpuCount" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="app-memory" class="col-sm-6 control-label" data-lang="app-memory"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" disabled="disabled" value="256" min="1" id="app-memory" name="appMemory" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="event-trace-sampling-count" class="col-sm-6 control-label" data-lang="app-event-trace-sampling-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" disabled="disabled" id="event-trace-sampling-count" value="0" min="0" name="eventTraceSamplingCount" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="app-cache-enable" class="col-sm-6 control-label" data-lang="app-cache-enable"></label>
-                        <div class="col-sm-6">
-                            <input type="checkbox" disabled="disabled" checked="checked" id="app-cache-enable" name="appCacheEnable" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="width-appURL">
-                    <div class="form-group">
-                        <label for="app-url" class="col-sm-2 control-label" data-lang="app-url"><i>*</i></label>
-                        <div class="col-sm-8">
-                           <div class="app-width-size">
-                                <input type="text" disabled="disabled" placeholder="http://file_host:8080/foo-job.tar.gz" id="app-url" name="appURL" class="form-control" data-toggle="tooltip" data-placement="bottom" title="必须是可以通过网络访问到的路径。如:http://file_host:8080/your-job.tar.gz"/>
-                           </div>
-                        </div>
-                    </div>
-                 </div>
-            </div>
-        </form>
-    </div>
-</div>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/modify_app.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/modify_app.html
deleted file mode 100755
index a1d0017..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/app/modify_app.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="box-body">
-    <div role="tabpanel" class="tab-pane active" onsubmit="return false;">
-        <form id="app-form" class="form-horizontal">
-            <div class="row">
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="app-name" class="col-sm-6 control-label" data-lang="app-name"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" disabled="disabled" placeholder="yourappName" id="app-name" name="appName" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-5" >
-                    <div class="form-group">
-                        <label for="bootstrap-script" class="col-sm-6 control-label" data-lang="app-bootstrap-script"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" disabled="disabled" placeholder="bin/start.sh" id="bootstrap-script" name="bootstrapScript" class="form-control" data-toggle="tooltip" data-placement="bottom" title="启动脚本,如:bin\start.sh。"/>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="cpu-count" class="col-sm-6 control-label" data-lang="app-cpu-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" disabled="disabled" value="1.0" min="1.0" step="0.1" id="cpu-count" name="cpuCount" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="app-memory" class="col-sm-6 control-label" data-lang="app-memory"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" disabled="disabled" value="256" min="1" id="app-memory" name="appMemory" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="event-trace-sampling-count" class="col-sm-6 control-label" data-lang="app-event-trace-sampling-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" id="event-trace-sampling-count" value="0" min="0" name="eventTraceSamplingCount" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-5">
-                    <div class="form-group">
-                        <label for="app-cache-enable" class="col-sm-6 control-label" data-lang="app-cache-enable"></label>
-                        <div class="col-sm-6">
-                            <input type="checkbox" checked="checked" id="app-cache-enable" name="appCacheEnable" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="width-appURL">
-                    <div class="form-group">
-                        <label for="app-url" class="col-sm-2 control-label" data-lang="app-url"><i>*</i></label>
-                        <div class="col-sm-8">
-                           <div class="app-width-size">
-                                <input type="text" disabled="disabled" placeholder="http://file_host:8080/foo-job.tar.gz" id="app-url" name="appURL" class="form-control" data-toggle="tooltip" data-placement="bottom" title="必须是可以通过网络访问到的路径。如:http://file_host:8080/your-job.tar.gz"/>
-                           </div>
-                        </div>
-                    </div>
-                 </div>
-            </div>
-            <div class="form-group">
-                <div class="center-font">
-                    <button  id="save-button" class="btn-xs btn-primary" type="submit" data-lang="operation-submit"></button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
-<script src="lib/BootstrapValidator/js/bootstrapValidator.js"></script>
-<script src="lib/BootstrapValidator/js/bootstrapValidator_zh_CN.js"></script>
-<script src="js/app/app_common.js"></script>
-<script src="js/app/modify_app.js"></script>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/history/job_dashboard.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/history/job_dashboard.html
deleted file mode 100755
index 497942b..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/history/job_dashboard.html
+++ /dev/null
@@ -1,131 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="content-wrapper">
-    <section class="content-header">
-        <h1 data-lang="sidebar-job-dashboard"></h1>
-        <ol class="breadcrumb">
-            <li class="active"><i class="fa fa-history" data-lang="sidebar-job-history"></i></li>
-            <li class="active" data-lang="sidebar-job-dashboard"></li>
-        </ol>
-    </section>
-    <hr class="table-line"> 
-    <div class="box-body">
-        <div class="row" >
-            <div class="col-sm-7">
-                <div class="chart-right">
-                    <div class="box box-danger">
-                        <div class="box-header with-border">
-                            <h3 class="box-title" data-lang="dashboard-succ-and-fail-count"></h3>
-                            <div class="box-tools pull-right">
-                                <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
-                            </div>
-                        </div>
-                        <div class="box-body" > 
-                            <div class="chart-size">
-                                <div class="row">
-                                    <div class="col-sm-4">
-                                        <div id="total-jobs-lastMinute" class="chart-size-solation"></div>
-                                    </div>
-                                    <div class="col-sm-4">
-                                        <div id="total-jobs-lastHour" class="chart-size-solation"></div>
-                                    </div>
-                                    <div class="col-sm-4">
-                                        <div id="total-jobs-weekly" class="chart-size-solation"></div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="col-sm-5">
-                <div class="chart-left">
-                    <div class="box box-danger">
-                        <div class="box-header with-border">
-                            <h3 class="box-title" data-lang="dashboard-job-type"></h3>
-                            <div class="box-tools pull-right">
-                                <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
-                            </div>
-                        </div>
-                        <div class="box-body">
-                            <div class="chart-size">
-                                <div class="row">
-                                    <div class="col-sm-6">
-                                        <div id="job-execution-type" class="chart-size-solation"></div>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
-                    </div>
-                </div> 
-            </div>
-        </div>
-        <div class="row">
-            <div class="col-sm-12">
-                <div class="box box-info">
-                    <div class="box-header with-border">
-                        <h3 class="box-title" data-lang="dashboard-succ-and-fail-count"></h3>
-                        <div class="box-tools pull-right">
-                            <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
-                        </div>
-                    </div>
-                    <div class="box-body" >
-                        <div class="row">
-                            <div id="statictis_jobs" class="set-size"></div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="row">
-            <div class="col-sm-12">
-                <div class="box box-info">
-                    <div class="box-header with-border">
-                        <h3 class="box-title" data-lang="dashboard-job-task-running-count"></h3>
-                        <div class="box-tools pull-right">
-                            <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
-                        </div>
-                    </div>
-                    <div class="box-body">
-                        <div class="row" >
-                            <div id="run-jobs" class="set-size"></div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="row">
-            <div class="col-sm-12">
-                <div class="box box-success">
-                    <div class="box-header with-border">
-                        <h3 class="box-title" data-lang="dashboard-current-jobs-count"></h3>
-                        <div class="box-tools pull-right">
-                            <button class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
-                        </div>
-                    </div>
-                    <div class="box-body">
-                        <div class="row">
-                            <div id="regist-jobs" class="set-size"></div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-<script src="js/history/job_dashboard.js"></script>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/history/job_exec_details.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/history/job_exec_details.html
deleted file mode 100755
index d97e756..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/history/job_exec_details.html
+++ /dev/null
@@ -1,101 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="content-wrapper">
-    <div class="page-height-min">
-        <section class="content-header">
-            <h1 data-lang="sidebar-job-trace"></h1>
-            <ol class="breadcrumb">
-                <li class="active"><i class="fa fa-history" data-lang="sidebar-job-history"></i></li>
-                <li class="active" data-lang="sidebar-job-trace"></li>
-            </ol>
-        </section>
-        <section class="content">
-            <div id="job-exec-detail-toolbar-div">
-                <div class="form-inline" role="form">
-                    <div class="form-group toolbar">
-                        <label for="job-name" data-lang="job-name"></label>
-                        <input type="text" class="form-control" id="job-name" placeholder="">
-                    </div>
-                    <div class="form-group toolbar">
-                        <label for="task-id" data-lang="task-id"></label>
-                        <input type="text" class="form-control" size="55" id="task-id" placeholder="">
-                    </div>
-                    <br/>
-                    <div class="form-group toolbar">
-                        <label for="ip" data-lang="server-ip"></label>
-                        <input type="text" class="form-control" data-inputmask="'alias': 'ip'" data-mask="" id="ip">
-                    </div>
-                    <div class="form-group toolbar">
-                        <label for="start-time" data-lang="start-time"></label>
-                        <input type="text" class="form-control pull-right custom-datepicker" id="start-time">
-                    </div>
-                    <div class="form-group toolbar">
-                        <label for="end-time" data-lang="complete-time"></label>
-                        <input type="text" class="form-control pull-right custom-datepicker" id="end-time">
-                    </div><br>
-                    <div id="execute-result">
-                        <div class="form-group">
-                            <label data-lang="execute-result"></label>:
-                            <input type="radio" name="isSuccess" value="1"><label data-lang="execute-result-success"></label>
-                            <input type="radio" name="isSuccess" value="0"><label data-lang="execute-result-failure"></label>
-                            <input type="radio" name="isSuccess" value="" checked="checked"><label data-lang="execute-result-all"></label>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <table id="job-exec-details-table" 
-                data-show-refresh="true"
-                data-show-toggle="true"
-                data-striped="true"
-                data-toggle="table"
-                data-url="/api/job/events/executions"
-                data-flat="true"
-                data-click-to-select="true"
-                data-row-style="rowStyle"
-                data-query-params="queryParams"
-                data-query-params-type="notLimit"
-                data-side-pagination="server"
-                data-pagination="true"
-                data-page-list="[10, 20, 50, 100]"
-                data-show-columns="true"
-                data-toolbar="#job-exec-detail-toolbar-div">
-                <thead>
-                    <tr>
-                        <th data-field="jobName" data-sortable="true"><span data-lang="job-name"></span></th>
-                        <th data-field="taskId"><span data-lang="task-id"></span></th>
-                        <th data-field="ip" data-sortable="true"><span data-lang="server-ip"></span></th>
-                        <th data-field="shardingItem"><span data-lang="job-shrading-item"></span></th>
-                        <th data-field="source" data-sortable="true"><span data-lang="execute-source"></span></th>
-                        <th data-field="success" data-sortable="true" data-formatter="successFormatter"><span data-lang="execute-result"></span></th>
-                        <th data-field="failureCause.plainText" data-formatter="splitFormatter"><span data-lang="failure-reason"></span></th>
-                        <th data-field="startTime" data-sortable="true" data-formatter="dateTimeFormatter"><span data-lang="start-time"></span></th>
-                        <th data-field="completeTime" data-sortable="true" data-formatter="dateTimeFormatter"><span data-lang="complete-time"></span></th>
-                    </tr>
-                </thead>
-            </table>
-        </section>
-    </div>
-</div>
-<script src="lib/bootstrap-table/bootstrap-table.min.js"></script>
-<script src="lib/daterangepicker/moment.min.js"></script>
-<script src="lib/daterangepicker/daterangepicker.js"></script>
-<script src="lib/input-mask/jquery.inputmask.js"></script>
-<script src="lib/input-mask/jquery.inputmask.date.extensions.js"></script>
-<script src="lib/input-mask/jquery.inputmask.extensions.js"></script>
-<script src="js/history/history_common.js"></script>
-<script src="js/history/job_exec_details.js"></script>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/history/job_exec_status.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/history/job_exec_status.html
deleted file mode 100755
index 5a31b46..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/history/job_exec_status.html
+++ /dev/null
@@ -1,122 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="content-wrapper">
-    <div class="page-height-min">
-        <section class="content-header">
-            <h1 data-lang="sidebar-history-status"></h1>
-            <ol class="breadcrumb">
-                <li class="active"><i class="fa fa-history" data-lang="sidebar-job-history"></i></li>
-                <li class="active" data-lang="sidebar-history-status"></li>
-            </ol>
-        </section>
-        <section class="content">
-            <div id="jobExecStatusToolbar">
-                <div class="form-inline" role="form">
-                    <div class="form-group toolbar">
-                        <label for="job-name" data-lang="job-name"></label>
-                        <input type="text" class="form-control" id="job-name" placeholder="">
-                    </div>
-                    <div class="form-group toolbar">
-                        <label for="task-id" data-lang="task-id"></label>
-                        <input type="text" class="form-control" size="54" id="task-id" placeholder="">
-                    </div>
-                    <br/>
-                    <div class="form-group toolbar">
-                        <label for="slave-id" data-lang="server-ip"></label>
-                        <input type="text" class="form-control" id="slave-id" placeholder="">
-                    </div>
-                    <div class="form-group toolbar">
-                        <label for="source" data-lang="execute-source"></label>
-                        <select id="source" name="source" class="form-control" data-toggle="tooltip" data-placement="bottom" >
-                            <option value="" data-lang="execute-result-all"></option>
-                            <option value="CLOUD_SCHEDULER">CLOUD_SCHEDULER</option>
-                            <option value="CLOUD_EXECUTOR">CLOUD_EXECUTOR</option>
-                        </select>
-                    </div>
-                    <div class="form-group toolbar">
-                        <label for="execution-type" data-lang="execute-type"></label>
-                        <select id="execution-type" name="jobExecutionType" class="form-control" data-toggle="tooltip" data-placement="bottom" >
-                            <option value="" data-lang="execute-result-all"></option>
-                            <option value="FAILOVER" >FAILOVER</option>
-                            <option value="READY">READY</option>
-                        </select> 
-                    </div>
-                    <br/>
-                    <div class="form-group toolbar">
-                        <label for="state" data-lang="status"></label>
-                        <select id="state" name="state" class="form-control" data-toggle="tooltip" data-placement="bottom" >
-                            <option value="" data-lang="execute-result-all"></option>
-                            <option value="TASK_STAGING" data-lang="status-staging"></option>
-                            <option value="TASK_FAILED" data-lang="status-task-failed"></option>
-                            <option value="TASK_FINISHED" data-lang="status-task-finished"></option>
-                            <option value="TASK_RUNNING" data-lang="status-running"></option>
-                            <option value="TASK_ERROR" data-lang="status-task-error"></option>
-                            <option value="TASK_KILLED" data-lang="status-task-killed"></option>
-                        </select> 
-                    </div>
-                    <div class="form-group toolbar">
-                        <label for="start-time" data-lang="creation-start-time"></label>
-                        <input type="text" class="form-control pull-right custom-datepicker" id="start-time">
-                    </div>
-                    <div class="form-group toolbar">
-                        <label for="end-time" data-lang="creation-end-time"></label>
-                        <input type="text" class="form-control pull-right custom-datepicker" id="end-time">
-                    </div>
-                </div>
-            </div>
-            <table id="job-exec-status-table" 
-                data-show-refresh="true"
-                data-show-toggle="true"
-                data-striped="true"
-                data-toggle="table"
-                data-url="/api/job/events/statusTraces"
-                data-flat="true"
-                data-click-to-select="true"
-                data-row-style="rowStyle"
-                data-query-params="queryParams"
-                data-query-params-type="notLimit"
-                data-side-pagination="server"
-                data-pagination="true"
-                data-page-list="[10, 20, 50, 100]"
-                data-show-columns="true"
-                data-toolbar="#jobExecStatusToolbar">
-                <thead>
-                    <tr>
-                        <th data-field="jobName" data-sortable="true"><span data-lang="job-name"></span></th>
-                        <th data-field="taskId"><span data-lang="task-id"></span></th>
-                        <th data-field="slaveId" data-sortable="true"><span data-lang="server-ip"></span></th>
-                        <th data-field="source" data-sortable="true"><span data-lang="execute-source"></span></th>
-                        <th data-field="shardingItems"><span data-lang="job-sharding-item"></span></th>
-                        <th data-field="executionType" data-sortable="true"><span data-lang="execute-type"></span></th>
-                        <th data-field="state" data-sortable="true" data-formatter="stateFormatter"><span data-lang="status"></span></th>
-                        <th data-field="creationTime" data-sortable="true" data-formatter="dateTimeFormatter"><span data-lang="creation-time"></span></th>
-                        <th data-field="message" data-formatter="splitRemarkFormatter"><span data-lang="comments"></span></th>
-                    </tr>
-                </thead>
-            </table>
-        </section>
-    </div>
-</div>
-<script src="lib/bootstrap-table/bootstrap-table.min.js"></script>
-<script src="lib/daterangepicker/moment.min.js"></script>
-<script src="lib/daterangepicker/daterangepicker.js"></script>
-<script src="lib/input-mask/jquery.inputmask.js"></script>
-<script src="lib/input-mask/jquery.inputmask.date.extensions.js"></script>
-<script src="lib/input-mask/jquery.inputmask.extensions.js"></script>
-<script src="js/history/history_common.js"></script>
-<script src="js/history/job_exec_status.js"></script>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/add_job.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/add_job.html
deleted file mode 100755
index c1f3e84..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/add_job.html
+++ /dev/null
@@ -1,171 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="box-body">
-    <div role="tabpanel" class="tab-pane active" onsubmit="return false;">
-        <form id="job-form" class="form-horizontal">
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="job-name" class="col-sm-6 control-label" data-lang="job-name"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" placeholder="yourJob" id="job-name" name="jobName" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="job-app-name" class="col-sm-6 control-label" data-lang="app-name"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" placeholder="yourappName" id="job-app-name" name="jobAppName" class="form-control" data-toggle="tooltip" data-placement="bottom" title="作业所在的应用名称,必须是在应用中已注册。"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-3">
-                    <div class="form-group">
-                        <label for="job-execution-type" class="col-sm-6 control-label" data-lang="job-execution-type"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <select id="job-execution-type" name="jobExecutionType" class="form-control" >
-                                <option value="DAEMON">DAEMON</option>
-                                <option value="TRANSIENT">TRANSIENT</option>
-                            </select> 
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="cron" class="col-sm-6 control-label" data-lang="job-cron"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" placeholder="0/5 * * * * ?" id="cron" name="cron" class="form-control" data-toggle="tooltip" data-placement="bottom"  title="作业启动时间的cron表达式。如:0/5 * * * * ?"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="sharding-total-count" class="col-sm-6 control-label" data-lang="job-sharding-total-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" min=1 value=1 id="sharding-total-count" name="shardingTotalCount" class="form-control" data-toggle="tooltip" data-placement="bottom" title="作业分片总数"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-3">
-                    <div class="form-group">
-                        <label for="job-parameter" class="col-sm-6 control-label" data-lang="job-parameter"></label>
-                        <div class="col-sm-6">
-                            <input type="text" id="job-parameter" name="jobParameter" class="form-control" data-toggle="tooltip" data-placement="bottom" title="作业自定义参数,可通过传递该参数为作业调度的业务方法传参,用于实现带参数的作业例:每次获取的数据量、作业实例从数据库读取的主键。" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="cpu-count" class="col-sm-6 control-label" data-lang="job-cpu-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" value="0.001" min="0.001" step="0.001" id="cpu-count" name="cpuCount" class="form-control" data-toggle="tooltip"  data-placement="bottom" title="单片作业所需要的CPU数量,最小值为0.001"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="job-memory" class="col-sm-6 control-label" data-lang="job-memory"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" value="1" min="1" id="job-memory" name="jobMemory" class="form-control" data-toggle="tooltip" data-placement="bottom" title="单片作业所需要的内存MB,最小值为1"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-3">
-                    <div class="form-group">
-                        <label for="bean-name" class="col-sm-6 control-label" data-lang="job-bean-name"></label>
-                        <div class="col-sm-6">
-                            <input type="text" placeholder="yourBeanName" id="bean-name" name="beanName" class="form-control" data-toggle="tooltip" data-placement="bottom" title="Spring容器中配置的bean名称" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="failover" class="col-sm-6 control-label" data-lang="job-failover"></label>
-                        <div class="col-sm-6">
-                            <input type="checkbox" id="failover" name="failover" data-toggle="tooltip" data-placement="bottom" title="是否开启任务执行失效转移,开启表示如果作业在一次任务执行中途宕机,允许将该次未完成的任务在另一作业节点上补偿执行。" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="misfire" class="col-sm-6 control-label" data-lang="job-misfire"></label>
-                        <div class="col-sm-6">
-                            <input type="checkbox" id="misfire" name="misfire" data-toggle="tooltip" data-placement="bottom" title="是否开启任务错过重新执行" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="streaming-process" hidden="hidden" id="streaming-process-box" class="col-sm-6 control-label" data-lang="job-streaming-process"></label>
-                        <div class="col-sm-6" >
-                            <input hidden="hidden" type="checkbox" id="streaming-process" name="streamingProcess" data-toggle="tooltip" data-placement="bottom" title="DATAFLOW类型作业,是否流式处理数据如果流式处理数据, 则fetchData不返回空结果将持续执行作业,如果非流式处理数据, 则处理数据完成后作业结束。" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group">
-                    <label for="application-context" class="col-sm-2 control-label" data-lang="job-application-context"></label>
-                    <div class="col-sm-9">
-                        <input type="text" placeholder="META-INF\applicationContext.xml" id="application-context" name="applicationContext" class="form-control" data-toggle="tooltip" data-placement="bottom" title="Spring方式配置Spring配置文件相对路径以及名称,如:META-INF\applicationContext.xml" />
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group">
-                    <label for="sharding-item-parameters" class="col-sm-2 control-label" data-lang="job-sharding-item-parameters"></label>
-                    <div class="col-sm-9">
-                        <textarea id="sharding-item-parameters" placeholder="0=a,1=b,2=c" name="shardingItemParameters" class="form-control" data-toggle="tooltip" data-placement="bottom" title="分片序列号和参数用等号分隔,多个键值对用逗号分隔,类似map。分片序列号从0开始,不可大于或等于作业分片总数。如:0=a,1=b,2=c"></textarea>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group" id="bootstrap-script-div" hidden="hidden">
-                    <label for="script-command-line" class="col-sm-2 control-label" data-lang="job-script-command-line"><i>*</i></label>
-                    <div class="col-sm-9">
-                        <input type="text" id="script-command-line" name="scriptCommandLine" class="form-control" data-toggle="tooltip" data-placement="bottom" title="SCRIPT类型作业命令行执行脚本" />
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group">
-                    <label for="description" class="col-sm-2 control-label" data-lang="job-description"></label>
-                    <div class="col-sm-9">
-                        <textarea id="description" name="description" class="form-control"></textarea>
-                    </div>
-                </div>
-            </div> 
-            <div class="form-group">
-                <div class="center-font">
-                    <button id="save-button" class="btn-xs btn-primary" type="submit" data-lang="operation-submit"></button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
-<script src="lib/BootstrapValidator/js/bootstrapValidator.js"></script>
-<script src="lib/BootstrapValidator/js/bootstrapValidator_zh_CN.js"></script>
-<script src="js/job/job_common.js"></script>
-<script src="js/job/add_job.js"></script>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/detail_job.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/detail_job.html
deleted file mode 100755
index 476b25d..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/detail_job.html
+++ /dev/null
@@ -1,163 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="box-body">
-    <div role="tabpanel" class="tab-pane active" onsubmit="return false;">
-        <form id="job-form" class="form-horizontal">
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="job-name" class="col-sm-6 control-label" data-lang="job-name"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" disabled="disabled" placeholder="yourJob" id="job-name" name="jobName" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="job-app-name" class="col-sm-6 control-label" data-lang="app-name"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" disabled="disabled" placeholder="yourappName" id="job-app-name" name="jobAppName" class="form-control" data-toggle="tooltip" data-placement="bottom" title="作业所在的应用名称,必须是在应用中已注册。"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-3">
-                    <div class="form-group">
-                        <label for="job-execution-type" class="col-sm-6 control-label" data-lang="job-execution-type"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <select id="job-execution-type" disabled="disabled" name="jobExecutionType" class="form-control" >
-                                <option value="DAEMON">DAEMON</option>
-                                <option value="TRANSIENT">TRANSIENT</option>
-                            </select> 
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="cron" class="col-sm-6 control-label" data-lang="job-cron"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" disabled="disabled" placeholder="0/5 * * * * ?" id="cron" name="cron" class="form-control" data-toggle="tooltip" data-placement="bottom"  title="作业启动时间的cron表达式。如:0/5 * * * * ?"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="sharding-total-count" class="col-sm-6 control-label" data-lang="job-sharding-total-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" disabled="disabled" min=1 value=1 id="sharding-total-count" name="shardingTotalCount" class="form-control" data-toggle="tooltip" data-placement="bottom" title="作业分片总数"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-3">
-                    <div class="form-group">
-                        <label for="job-parameter" class="col-sm-6 control-label" data-lang="job-parameter"></label>
-                        <div class="col-sm-6">
-                            <input type="text" disabled="disabled" id="job-parameter" name="jobParameter" class="form-control" data-toggle="tooltip" data-placement="bottom" title="作业自定义参数,可通过传递该参数为作业调度的业务方法传参,用于实现带参数的作业例:每次获取的数据量、作业实例从数据库读取的主键。" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="cpu-count" class="col-sm-6 control-label" data-lang="job-cpu-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" disabled="disabled" value="0.001" min="0.001" step="0.001" id="cpu-count" name="cpuCount" class="form-control" data-toggle="tooltip"  data-placement="bottom" title="单片作业所需要的CPU数量,最小值为0.001"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="job-memory" class="col-sm-6 control-label" data-lang="job-memory"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" disabled="disabled" value="1" min="1" id="job-memory" name="jobMemory" class="form-control" data-toggle="tooltip" data-placement="bottom" title="单片作业所需要的内存MB,最小值为1"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-3">
-                    <div class="form-group">
-                        <label for="bean-name" class="col-sm-6 control-label" data-lang="job-bean-name"></label>
-                        <div class="col-sm-6">
-                            <input type="text" disabled="disabled" placeholder="yourBeanName" id="bean-name" name="beanName" class="form-control" data-toggle="tooltip" data-placement="bottom" title="Spring容器中配置的bean名称" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="failover" class="col-sm-6 control-label" data-lang="job-failover"></label>
-                        <div class="col-sm-6">
-                            <input type="checkbox" disabled="disabled" id="failover" name="failover" data-toggle="tooltip" data-placement="bottom" title="是否开启任务执行失效转移,开启表示如果作业在一次任务执行中途宕机,允许将该次未完成的任务在另一作业节点上补偿执行。" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="misfire" class="col-sm-6 control-label" data-lang="job-misfire"></label>
-                        <div class="col-sm-6">
-                            <input type="checkbox" disabled="disabled" id="misfire" name="misfire" data-toggle="tooltip" data-placement="bottom" title="是否开启任务错过重新执行" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="streaming-process" hidden="hidden" id="streaming-process-box" class="col-sm-6 control-label" data-lang="job-streaming-process"></label>
-                        <div class="col-sm-6" >
-                            <input hidden="hidden" disabled="disabled" type="checkbox" id="streaming-process" name="streamingProcess" data-toggle="tooltip" data-placement="bottom" title="DATAFLOW类型作业,是否流式处理数据如果流式处理数据, 则fetchData不返回空结果将持续执行作业,如果非流式处理数据, 则处理数据完成后作业结束。" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group">
-                    <label for="application-context" class="col-sm-2 control-label" data-lang="job-application-context"></label>
-                    <div class="col-sm-9">
-                        <input type="text" disabled="disabled" placeholder="META-INF\applicationContext.xml" id="application-context" name="applicationContext" class="form-control" data-toggle="tooltip" data-placement="bottom" title="Spring方式配置Spring配置文件相对路径以及名称,如:META-INF\applicationContext.xml" />
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group">
-                    <label for="sharding-item-parameters" class="col-sm-2 control-label" data-lang="job-sharding-item-parameters"></label>
-                    <div class="col-sm-9">
-                        <textarea id="sharding-item-parameters" disabled="disabled" placeholder="0=a,1=b,2=c" name="shardingItemParameters" class="form-control" data-toggle="tooltip" data-placement="bottom" title="分片序列号和参数用等号分隔,多个键值对用逗号分隔,类似map。分片序列号从0开始,不可大于或等于作业分片总数。如:0=a,1=b,2=c"></textarea>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group" id="bootstrap-script-div" hidden="hidden">
-                    <label for="script-command-line" class="col-sm-2 control-label" data-lang="job-script-command-line"><i>*</i></label>
-                    <div class="col-sm-9">
-                        <input type="text" id="script-command-line" disabled="disabled" name="scriptCommandLine" class="form-control" data-toggle="tooltip" data-placement="bottom" title="SCRIPT类型作业命令行执行脚本" />
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group">
-                    <label for="description" class="col-sm-2 control-label" data-lang="job-description"></label>
-                    <div class="col-sm-9">
-                        <textarea id="description" disabled="disabled" name="description" class="form-control"></textarea>
-                    </div>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
-
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/job_status.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/job_status.html
deleted file mode 100755
index b0fc8af..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/job_status.html
+++ /dev/null
@@ -1,117 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="content-wrapper">
-    <div class="page-height-min">
-        <section class="content-header">
-            <h1 data-lang="job-status"></h1>
-            <ol class="breadcrumb">
-                <li class="active"><i class="fa fa-tasks" data-lang="sidebar-job"></i></li>
-                <li class="active" data-lang="status"></li>
-            </ol>
-        </section>
-        <section class="content">
-            <ul class="nav nav-tabs" role="tablist">
-                <li id="running_tab" role="presentation" class="active"><a href="#running" aria-controls="running" role="tab" data-toggle="tab" data-lang="tab-running-tasks"></a></li>
-                <li id="ready_tab" role="presentation"><a href="#ready" aria-controls="ready" role="tab" data-toggle="tab" data-lang="tab-ready-jobs"></a></li>
-                <li id="failover_tab" role="presentation"><a href="#failover" aria-controls="failover" role="tab" data-toggle="tab" data-lang="tab-failover-tasks"></a></li>
-            </ul>
-            <div class="tab-content">
-                <div role="tabpanel" class="tab-pane active" id="running">
-                    <table id="running" 
-                        data-show-refresh="true"
-                        data-show-toggle="true"
-                        data-striped="true"
-                        data-toggle="table"
-                        data-url="/api/job/tasks/running"
-                        data-flat="true"
-                        data-click-to-select="true"
-                        data-row-style="rowStyle"
-                        data-search="true"
-                        data-strict-search="false"
-                        data-query-params="queryParams"
-                        data-query-params-type="notLimit"
-                        data-pagination="true"
-                        data-page-list="[10, 20, 50, 100]"
-                        data-show-columns="true">
-                        <thead>
-                            <tr>
-                                <th data-field="id" data-sortable="true"><span data-lang="task-id"></span></th>
-                                <th data-field="metaInfo.jobName" data-sortable="true"><span data-lang="task-name"></span></th>
-                                <th data-field="slaveId" data-sortable="true"><span data-lang="server-ip"></span></th>
-                                <th data-field="type" data-sortable="true"><span data-lang="job-execution-type"></span></th>
-                                <th data-field="metaInfo.shardingItems"><span data-lang="job-sharding-item"></span></th>
-                            </tr>
-                        </thead>
-                    </table>
-                </div>
-                <div role="tabpanel" class="tab-pane" id="ready">
-                    <table id="ready" 
-                        data-show-refresh="true"
-                        data-show-toggle="true"
-                        data-striped="true"
-                        data-toggle="table"
-                        data-url="/api/job/tasks/ready"
-                        data-flat="true"
-                        data-click-to-select="true"
-                        data-row-style="rowStyle"
-                        data-search="true"
-                        data-strict-search="false"
-                        data-query-params="queryParams"
-                        data-query-params-type="notLimit"
-                        data-pagination="true"
-                        data-page-list="[10, 20, 50, 100]"
-                        data-show-columns="true">
-                        <thead>
-                            <tr>
-                                <th data-field="jobName" data-sortable="true"><span data-lang="job-name"></span></th>
-                                <th data-field="times" data-sortable="true"><span data-lang="remaining-execute-times"></span></th>
-                            </tr>
-                        </thead>
-                    </table>
-                </div>
-                <div role="tabpanel" class="tab-pane" id="failover">
-                    <table id="failover" 
-                        data-show-refresh="true"
-                        data-show-toggle="true"
-                        data-striped="true"
-                        data-toggle="table"
-                        data-url="/api/job/tasks/failover"
-                        data-flat="true"
-                        data-click-to-select="true"
-                        data-row-style="rowStyle"
-                        data-search="true"
-                        data-strict-search="false"
-                        data-query-params="queryParams"
-                        data-query-params-type="notLimit"
-                        data-pagination="true"
-                        data-page-list="[10, 20, 50, 100]"
-                        data-show-columns="true">
-                        <thead>
-                            <tr>
-                                <th data-field="taskInfo.jobName" data-sortable="true"><span data-lang="job-name"></span></th>
-                                <th data-field="originalTaskId"><span data-lang="original-task-id"></span></th>
-                                <th data-field="taskInfo.shardingItems"><span data-lang="job-sharding-item"></span></th>
-                            </tr>
-                        </thead>
-                    </table>
-                </div>
-            </div>
-        </section>
-    </div>
-</div>
-<script src="lib/bootstrap-table/bootstrap-table.min.js"></script>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/jobs_overview.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/jobs_overview.html
deleted file mode 100755
index ac393dc..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/jobs_overview.html
+++ /dev/null
@@ -1,126 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="content-wrapper">
-    <div class="page-height-min">
-        <section class="content-header">
-            <h1 data-lang="sidebar-config"></h1>
-            <ol class="breadcrumb">
-                <li class="active"><i class="fa fa-tasks" data-lang="sidebar-job"></i></li>
-                <li class="active" data-lang="sidebar-config"></li>
-            </ol>
-        </section>
-        <section class="content">
-            <table id="job-table" data-pagination="true" data-page-list="[10, 20, 50, 100]" data-search="true" data-show-refresh="true" data-show-toggle="true" data-striped="true" data-show-columns="true">
-                <thead>
-                <tr>
-                    <th data-field="jobName" data-sortable="true"><span data-lang="job-name"></span></th>
-                    <th data-field="appName" data-sortable="true"><span data-lang="app-name"></span></th>
-                    <th data-field="shardingTotalCount" data-sortable="true"><span data-lang="job-sharding-total-count"></span></th>
-                    <th data-field="cron" data-sortable="true"><span data-lang="job-cron"></span></th>
-                    <th data-field="operation" data-formatter="operationJob"><span data-lang="operation"></span></th>
-                </tr>
-                </thead>
-            </table>
-            <button type="button" class="btn-xs btn-success" data-toggle="modal" id="add-job" data-lang="operation-add"></button>
-        </section>
-    </div>
-</div>
-<div class="modal" id="data-detail-job" tabindex="-1" role="dialog" aria-labelledby="detail-modal-label" aria-hidden="true">
-    <div class="modal-dialog">
-        <div class="update-model-size">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
-                    <h2 class="modal-title" data-lang="job-detail"></h2>
-                </div>
-                <div class="modal-body" id="detail-job-body">
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-<div class="modal" id="delete-data" tabindex="-1" role="dialog" aria-labelledby="delete-modal-label" aria-hidden="true">
-    <div class="modal-dialog">
-        <div class="modal-content">
-            <div class="modal-body">
-                <h3 class="size-font" data-lang="confirm-to-delete-job"></h3>
-            </div>
-            <div class="modal-footer">
-                <button type="button" class="btn-xs btn-danger" id="delete-job-confirm" data-dismiss="modal" data-lang="operation-confirm"></button>
-                <button type="button" class="btn-xs btn-success" id="delete-job-remove" data-dismiss="modal" data-lang="operation-cancel"></button>
-            </div>
-        </div>
-    </div>
-</div>
-<div class="modal" id="data-update-job" tabindex="-1" role="dialog" aria-labelledby="modify-modal-label" aria-hidden="true">
-    <div class="modal-dialog">
-        <div class="update-model-size">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
-                    <h2 class="modal-title" data-lang="update-job"></h2>
-                </div>
-                <div class="modal-body" id="update-job-body">
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-<div class="modal" id="data-add-job" tabindex="-1" role="dialog" aria-labelledby="add-modal-label" aria-hidden="true">
-    <div class="modal-dialog">
-        <div class="update-model-size">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
-                    <h2 class="modal-title" data-lang="add-job"></h2>
-                </div>
-                <div class="modal-body" id="add-job-body">
-                </div>
-            </div>
-        </div>
-    </div>
-</div>
-<div class="modal" id="delete-data—bean-name" tabindex="-1" role="dialog" aria-labelledby="bean-name-modal-label" aria-hidden="true">
-    <div class="modal-dialog">
-        <div class="modal-content">
-            <div class="modal-header">
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
-                <h3 data-lang="job-spring-type-settings"></h3>
-            </div>
-            <div class="modal-body">
-                <h3 class="size-font" data-lang="job-bean-name-info"></h3>
-            </div>
-        </div>
-    </div>
-</div>
-<div class="modal" id="delete-data-application-context" tabindex="-1" role="dialog" aria-labelledby="application-context-modal-label" aria-hidden="true">
-    <div class="modal-dialog">
-        <div class="modal-content">
-            <div class="modal-header">
-                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
-                <h3 data-lang="job-spring-type-settings"></h3>
-            </div>
-            <div class="modal-body">
-                <h3 class="size-font" data-lang="job-application-context-info"></h3>
-            </div>
-        </div>
-    </div>
-</div>
-<script src="lib/bootstrap-table/bootstrap-table.js"></script>
-<script src="js/common/common.js"></script>
-<script src="js/job/jobs_overview.js"></script>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/modify_job.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/modify_job.html
deleted file mode 100755
index d78c307..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/html/job/modify_job.html
+++ /dev/null
@@ -1,171 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<div class="box-body">
-    <div role="tabpanel" class="tab-pane active" onsubmit="return false;">
-        <form id="job-form" class="form-horizontal">
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="job-name" class="col-sm-6 control-label" data-lang="job-name"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" disabled="disabled" placeholder="yourJob" id="job-name" name="jobName" class="form-control" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="job-app-name" class="col-sm-6 control-label" data-lang="app-name"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" disabled="disabled" placeholder="yourappName" id="job-app-name" name="jobAppName" class="form-control" data-toggle="tooltip" data-placement="bottom" title="作业所在的应用名称,必须是在应用中已注册。"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-3">
-                    <div class="form-group">
-                        <label for="job-execution-type" class="col-sm-6 control-label" data-lang="job-execution-type"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <select id="job-execution-type" name="jobExecutionType" class="form-control" >
-                                <option value="DAEMON">DAEMON</option>
-                                <option value="TRANSIENT">TRANSIENT</option>
-                            </select> 
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="cron" class="col-sm-6 control-label" data-lang="job-cron"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="text" placeholder="0/5 * * * * ?" id="cron" name="cron" class="form-control" data-toggle="tooltip" data-placement="bottom"  title="作业启动时间的cron表达式。如:0/5 * * * * ?"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="sharding-total-count" class="col-sm-6 control-label" data-lang="job-sharding-total-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" min=1 value=1 id="sharding-total-count" name="shardingTotalCount" class="form-control" data-toggle="tooltip" data-placement="bottom" title="作业分片总数"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-3">
-                    <div class="form-group">
-                        <label for="job-parameter" class="col-sm-6 control-label" data-lang="job-parameter"></label>
-                        <div class="col-sm-6">
-                            <input type="text" id="job-parameter" name="jobParameter" class="form-control" data-toggle="tooltip" data-placement="bottom" title="作业自定义参数,可通过传递该参数为作业调度的业务方法传参,用于实现带参数的作业例:每次获取的数据量、作业实例从数据库读取的主键。" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="cpu-count" class="col-sm-6 control-label" data-lang="job-cpu-count"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" value="0.001" min="0.001" step="0.001" id="cpu-count" name="cpuCount" class="form-control" data-toggle="tooltip"  data-placement="bottom" title="单片作业所需要的CPU数量,最小值为0.001"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="job-memory" class="col-sm-6 control-label" data-lang="job-memory"><i>*</i></label>
-                        <div class="col-sm-6">
-                            <input type="number" value="1" min="1" id="job-memory" name="jobMemory" class="form-control" data-toggle="tooltip" data-placement="bottom" title="单片作业所需要的内存MB,最小值为1"/>
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-3">
-                    <div class="form-group">
-                        <label for="bean-name" class="col-sm-6 control-label" data-lang="job-bean-name"></label>
-                        <div class="col-sm-6">
-                            <input type="text" placeholder="yourBeanName" id="bean-name" name="beanName" class="form-control" data-toggle="tooltip" data-placement="bottom" title="Spring容器中配置的bean名称" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="failover" class="col-sm-6 control-label" data-lang="job-failover"></label>
-                        <div class="col-sm-6">
-                            <input type="checkbox" id="failover" name="failover" data-toggle="tooltip" data-placement="bottom" title="只有开启监控作业执行时状态的情况下才可以开启失效转移" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="misfire" class="col-sm-6 control-label" data-lang="job-misfire"></label>
-                        <div class="col-sm-6">
-                            <input type="checkbox" id="misfire" name="misfire" data-toggle="tooltip" data-placement="bottom" title="是否开启任务错过重新执行" />
-                        </div>
-                    </div>
-                </div>
-                <div class="col-sm-4">
-                    <div class="form-group">
-                        <label for="streaming-process" hidden="hidden" id="streaming-process-box" class="col-sm-6 control-label" data-lang="job-streaming-process"></label>
-                        <div class="col-sm-6" >
-                            <input hidden="hidden" type="checkbox" id="streaming-process" name="streamingProcess" data-toggle="tooltip" data-placement="bottom" title="DATAFLOW类型作业,是否流式处理数据如果流式处理数据, 则fetchData不返回空结果将持续执行作业,如果非流式处理数据, 则处理数据完成后作业结束。" />
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group">
-                    <label for="application-context" class="col-sm-2 control-label" data-lang="job-application-context"></label>
-                    <div class="col-sm-9">
-                        <input type="text" placeholder="META-INF\applicationContext.xml" id="application-context" name="applicationContext" class="form-control" data-toggle="tooltip" data-placement="bottom" title="Spring方式配置Spring配置文件相对路径以及名称,如:META-INF\applicationContext.xml" />
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group">
-                    <label for="sharding-item-parameters" class="col-sm-2 control-label" data-lang="job-sharding-item-parameters"></label>
-                    <div class="col-sm-9">
-                        <textarea id="sharding-item-parameters" placeholder="0=a,1=b,2=c" name="shardingItemParameters" class="form-control" data-toggle="tooltip" data-placement="bottom" title="分片序列号和参数用等号分隔,多个键值对用逗号分隔,类似map。分片序列号从0开始,不可大于或等于作业分片总数。如:0=a,1=b,2=c"></textarea>
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group" id="bootstrap-script-div" hidden="hidden">
-                    <label for="script-command-line" class="col-sm-2 control-label" data-lang="job-script-command-line"><i>*</i></label>
-                    <div class="col-sm-9">
-                        <input type="text" id="script-command-line" name="scriptCommandLine" class="form-control" data-toggle="tooltip" data-placement="bottom" title="SCRIPT类型作业命令行执行脚本" />
-                    </div>
-                </div>
-            </div>
-            <div class="row">
-                <div class="form-group">
-                    <label for="description" class="col-sm-2 control-label" data-lang="job-description"></label>
-                    <div class="col-sm-9">
-                        <textarea id="description" name="description" class="form-control"></textarea>
-                    </div>
-                </div>
-            </div> 
-            <div class="form-group">
-                <div class="center-font">
-                    <button id="save-button" class="btn-xs btn-primary" type="submit" data-lang="operation-submit"></button>
-                </div>
-            </div>
-        </form>
-    </div>
-</div>
-<script src="lib/BootstrapValidator/js/bootstrapValidator.js"></script>
-<script src="lib/BootstrapValidator/js/bootstrapValidator_zh_CN.js"></script>
-<script src="js/job/job_common.js"></script>
-<script src="js/job/modify_job.js"></script>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/i18n/message.properties b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/i18n/message.properties
deleted file mode 100755
index b1312a0..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/i18n/message.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/i18n/message_en.properties b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/i18n/message_en.properties
deleted file mode 100755
index ef8cbd0..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/i18n/message_en.properties
+++ /dev/null
@@ -1,185 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-sidebar-app=App
-sidebar-config=Config
-sidebar-job=Job
-sidebar-status=Status
-sidebar-job-history=Job history
-sidebar-job-dashboard=History dashboard
-sidebar-job-trace=Job trace
-sidebar-history-status=History status
-
-switch-language=Switch language
-language-zh=中文
-language-en=English
-
-dangdang=dangdang.com
-
-switch-theme-title=Switch theme
-switch-theme-blue=Blue
-switch-theme-white=White
-switch-theme-purple=Purple
-switch-theme-green=Green
-switch-theme-yellow=Yellow
-switch-theme-red=Red
-switch-theme-blue-light=Blue Light
-switch-theme-white-light=White Light
-switch-theme-purple-light=Purple Light
-switch-theme-green-light=Green Light
-switch-theme-yellow-light=Yellow Light
-switch-theme-red-light=Red Light
-
-app-name=App name
-app-bootstrap-script=Bootstrap script
-app-cpu-count=CPU count
-app-memory=Memory(MB)
-app-event-trace-sampling-count=Event trace sampling count
-app-cache-enable=App cache enable
-app-url=App URL
-app-detail=App detail
-update-app=Update app
-add-app=Add app
-app-name-not-null=App name cannot be null
-app-name-length-limit=App name length should less than 100 characters
-app-name-exists=App name has already existed
-app-bootstrap-script-not-null=App bootstrap script cannot be null
-app-cpu-count-not-null=App CPU count cannot be null
-app-cpu-count-regexp-limit=CPU count should be a positive number
-app-memory-not-null=Memory cannot be null
-event-trace-sampling-count-not-null=Event trace sampling count cannot be null
-app-url-not-null=App URL cannot be null
-app-name-unregistered=App name is unregistered
-app-disabled=The application for the job has failed and the operation failed
-
-add-job=Add job
-job-detail=Job detail
-update-job=Update job
-job-name=Job name
-job-execution-type=Job execution type
-job-cron=Crontab
-job-sharding-total-count=Sharding total count
-job-parameter=Job parameter
-job-cpu-count=CPU count
-job-memory=Memory
-job-bean-name=Bean name
-job-failover=Failover
-job-misfire=Misfire
-job-streaming-process=Streaming process
-job-application-context=Application context
-job-sharding-item-parameters=Sharding item parameters
-job-script-command-line=Script command line
-job-description=Description
-job-status=Job status
-job-sharding-item=Sharding item
-job-spring-type-settings=Job spring type settings
-job-application-context-info=Job application context info
-job-bean-name-info=Job bean name info
-job-name-not-null=Job name cannot be null
-job-name-length-limit=Job name length should less than 100 characters
-job-name-exists=Job name has already existed
-job-cron-length-limit=Job crontab should less than 40 characters
-job-cron-not-null=Job crontab cannot be null
-job-cpu-count-not-null=CPU count cannot be null
-job-cpu-count-regexp-limit=CPU count should be a positive number
-job-memory-not-null=Memory cannot be null
-job-sharding-count-not-null=Sharding count cannot be null
-job-script-command-line-not-null=Script command line cannot be null
-job-sharding-item-parameters-regexp-limit=The sharding item split item format is incorrect, format: 0 = xx, 1 = yy
-
-tab-running-tasks=Running tasks
-tab-ready-jobs=Ready jobs
-tab-failover-tasks=Failover tasks
-
-task-id=Task ID
-task-name=Task name
-server-ip=Server IP
-remaining-execution-times=Remaining execution times
-original-task-id=Original task ID
-
-dashboard-succ-and-fail-count=Success and failure count
-dashboard-job-type=Job type
-dashboard-job-task-running-count=Job and task running count
-dashboard-current-jobs-count=Current jobs count
-job-info-for-one-minute=Job info for one minute
-job-info-for-one-hour=Job info for one hour
-job-info-for-one-week=Job info for one week
-job-success-count=Job success count
-job-failure-count=Job failure count
-task-running-count=Task running count
-job-running-count=Job running count
-highchart-tooltip-info1=Mouse drag can be scaled
-highchart-tooltip-info2=Gesture operations are scaled
-
-placeholder-bootstrap-script=bootstrap-script, eg: bin//start.sh
-placeholder-app-url=Path should be accessed through the network, eg: http://file_host:8080/your-job.tar.gz
-placeholder-job-app-name=The application name of the job must be registered in the application
-placeholder-cron=The cron expression for the job start time. eg: 0/5 * * *?
-placeholder-sharding-total-count=Job sharding total count
-placeholder-job-parameter=Job customization parameters, can by passing this parameter for job scheduling the business method of ginseng, eg: take parameters job every time for the amount of data read from the database and operation instance of the primary key.
-placeholder-cpu-count=The minimum number of CPUs required for a single operation is 0.001
-placeholder-job-memory=The memory MB required for a single piece of work is a minimum of 1
-placeholder-bean-name=The bean name configured in the Spring container
-placeholder-failover=The failure transfer can be turned on only if the monitoring job is executed
-placeholder-misfire=Whether the task is open misses the re-execution
-placeholder-streaming-process=DATAFLOW type operation, whether if flow processing data flow processing data, the fetchData returns an empty result will not perform the operation, if the flow processing data, processing data after the completion of the work end.
-placeholder-application-context=Spring configure the Spring configuration file relative path and name, eg: META-INF\\applicationContext.xml
-placeholder-sharding-item-parameters=Separate serial Numbers and parameters are separated by equals, and multiple key values are separated by commas, similar to map. The serial serial Numbers start from 0, not greater than or equal to the total number of assignments. eg: 0 = a, 1 = b, 2 = c
-placeholder-script-command-line=SCRIPT type job command line
-
-operation=Operation
-operation-add=Add
-operation-submit=Submit
-operation-confirm=Confirm
-operation-cancel=Cancel
-operation-delete=Delete
-operation-reset=Reset
-operation-reset-scaling=Reset scaling
-operation-enable=Enable
-operation-disable=Disable
-operation-detail=Detail
-operation-update=Update
-
-status=Status
-status-running=Running
-status-staging=Staging
-status-task-failed=Failed
-status-task-finished=Finished
-status-task-error=Error
-status-task-killed=Killed
-
-creation-start-time=Creation start time
-creation-end-time=Creation end time
-creation-time=Creation time
-start-time=Start time
-complete-time=Complete time
-failure-reason=Failure reason
-comments=Comments
-
-execute-result=Execute result
-execute-result-all=All
-execute-result-success=Success
-execute-result-failure=Failure
-execute-result-null=Null
-execute-source=Execute source
-execute-type=Execute type
-remaining-execute-times=Remaining execute times
-
-confirm-to-close=Are you sure to close it?
-confirm-to-delete=Do you want to delete the application and related jobs?
-operation-succeed=Operation complete successfully
-confirm-to-delete-job=Do you want to delete the job?
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/i18n/message_zh.properties b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/i18n/message_zh.properties
deleted file mode 100755
index b682de2..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/i18n/message_zh.properties
+++ /dev/null
@@ -1,185 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-sidebar-app=应用
-sidebar-config=配置
-sidebar-job=作业
-sidebar-status=状态
-sidebar-job-history=作业历史
-sidebar-job-dashboard=历史dashboard
-sidebar-job-trace=作业运行轨迹
-sidebar-history-status=作业运行状态
-
-switch-language=选择语言
-language-zh=中文
-language-en=English
-
-dangdang=当当网
-
-switch-theme-title=更改主题
-switch-theme-blue=蓝色
-switch-theme-white=白色
-switch-theme-purple=紫色
-switch-theme-green=绿色
-switch-theme-yellow=黄色
-switch-theme-red=红色
-switch-theme-blue-light=蓝色高亮
-switch-theme-white-light=白色高亮
-switch-theme-purple-light=紫色高亮
-switch-theme-green-light=绿色高亮
-switch-theme-yellow-light=黄色高亮
-switch-theme-red-light=红色高亮
-
-app-name=应用名称
-app-bootstrap-script=启动脚本
-app-cpu-count=CPU核数
-app-memory=占用内存(MB)
-app-event-trace-sampling-count=作业事件采样次数(仅Daemon)
-app-cache-enable=是否在本地缓存应用
-app-url=应用所在路径
-app-detail=应用详情
-update-app=修改应用
-add-app=添加应用
-app-name-not-null=应用名称不能为空
-app-name-length-limit=应用名称长度不能超过100字符大小
-app-name-exists=应用已经注册
-app-bootstrap-script-not-null=启动脚本不能为空
-app-cpu-count-not-null=CPU核数不能为空
-app-cpu-count-regexp-limit=CPU核数应为正数
-app-memory-not-null=单片内存不能为空
-event-trace-sampling-count-not-null=作业事件采样次数(Daemon)不能为空
-app-url-not-null=应用所在路径不能为空
-app-name-unregistered=应用未注册
-app-disabled=作业对应的应用已失效,操作失败
-
-add-job=添加作业
-job-detail=作业详情
-update-job=修改作业
-job-name=作业名称
-job-execution-type=执行类型
-job-cron=Cron表达式
-job-sharding-total-count=作业分片总数
-job-parameter=自定义参数
-job-cpu-count=CPU核数
-job-memory=单片作业内存(MB)
-job-bean-name=实体名称
-job-failover=支持自动失效转移
-job-misfire=支持错过重执行
-job-streaming-process=是否流式处理数据
-job-application-context=Spring配置文件相对路径及名称
-job-sharding-item-parameters=分片序列号/参数对照表
-job-script-command-line=脚本作业全路径
-job-description=作业描述信息
-job-status=作业状态
-job-sharding-item=分片项
-job-spring-type-settings=Spring方式配置
-job-application-context-info=请填写Spring配置文件相对路径及名称
-job-bean-name-info=请填写beanName名称
-job-name-not-null=作业名称不能为空
-job-name-length-limit=作业名称长度不能超过100字符大小
-job-name-exists=作业名称已经注册
-job-cron-length-limit=cron表达式不能超过40字符大小
-job-cron-not-null=cron表达式不能为空
-job-cpu-count-not-null=CPU核数不能为空
-job-cpu-count-regexp-limit=CPU核数只能包含数字和小数点
-job-memory-not-null=单片作业内存不能为空
-job-sharding-count-not-null=分片数量不能为空
-job-script-command-line-not-null=SCRIPT类型作业命令行执行脚本不能为空
-job-sharding-item-parameters-regexp-limit=作业分片项格式不正确, 格式: 0=xx,1=yy
-
-tab-running-tasks=运行任务
-tab-ready-jobs=待运行作业
-tab-failover-tasks=待失效转移任务
-
-task-id=任务主键
-task-name=任务名称
-server-ip=服务器IP
-remaining-execution-times=剩余执行次数
-original-task-id=原任务主键
-
-dashboard-succ-and-fail-count=作业成功/失败数
-dashboard-job-type=作业分类
-dashboard-job-task-running-count=作业/任务运行数
-dashboard-current-jobs-count=接入平台作业数
-job-info-for-one-minute=一分钟作业情况
-job-info-for-one-hour=一小时作业情况
-job-info-for-one-week=一周作业情况
-job-success-count=作业成功数
-job-failure-count=作业失败数
-task-running-count=任务运行数
-job-running-count=作业运行数
-highchart-tooltip-info1=鼠标拖动可以进行缩放
-highchart-tooltip-info2=手势操作进行缩放
-
-placeholder-bootstrap-script=启动脚本,如:bin\\start.sh。
-placeholder-app-url=必须是可以通过网络访问到的路径。如:http://file_host:8080/your-job.tar.gz
-placeholder-job-app-name=作业所在的应用名称,必须是在应用中已注册。
-placeholder-cron=作业启动时间的cron表达式。如:0/5 * * * * ?
-placeholder-sharding-total-count=作业分片总数
-placeholder-job-parameter=作业自定义参数,可通过传递该参数为作业调度的业务方法传参,用于实现带参数的作业例:每次获取的数据量、作业实例从数据库读取的主键。
-placeholder-cpu-count=单片作业所需要的CPU核数,最小值为0.001
-placeholder-job-memory=单片作业所需要的内存MB,最小值为1
-placeholder-bean-name=Spring容器中配置的bean名称
-placeholder-failover=只有开启监控作业执行时状态的情况下才可以开启失效转移
-placeholder-misfire=是否开启任务错过重新执行
-placeholder-streaming-process=DATAFLOW类型作业,是否流式处理数据如果流式处理数据, 则fetchData不返回空结果将持续执行作业,如果非流式处理数据, 则处理数据完成后作业结束。
-placeholder-application-context=Spring方式配置Spring配置文件相对路径以及名称,如:META-INF\\applicationContext.xml
-placeholder-sharding-item-parameters=分片序列号和参数用等号分隔,多个键值对用逗号分隔,类似map。分片序列号从0开始,不可大于或等于作业分片总数。如:0=a,1=b,2=c
-placeholder-script-command-line=SCRIPT类型作业命令行执行脚本
-
-operation=操作
-operation-add=添加
-operation-submit=提交
-operation-confirm=确认
-operation-cancel=关闭
-operation-delete=删除
-operation-reset=重置
-operation-reset-scaling=重置缩放比例
-operation-enable=生效
-operation-disable=失效
-operation-detail=详情
-operation-update=修改
-
-status=状态
-status-running=运行中
-status-staging=等待运行
-status-task-failed=运行失败
-status-task-finished=已完成
-status-task-error=启动失败
-status-task-killed=主动终止
-
-creation-start-time=创建开始时间
-creation-end-time=创建结束时间
-creation-time=创建时间
-start-time=开始时间
-complete-time=完成时间
-failure-reason=失败原因
-comments=备注
-
-execute-result=执行结果
-execute-result-all=全部
-execute-result-success=成功
-execute-result-failure=失败
-execute-result-null=空
-execute-source=执行来源
-execute-type=执行类型
-remaining-execute-times=剩余执行次数
-
-confirm-to-close=确认要关闭吗?
-confirm-to-delete=确认要删除该应用及其相关联的作业吗?
-operation-succeed=操作已成功完成
-confirm-to-delete-job=确认要删除该作业吗?
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/index.html b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/index.html
deleted file mode 100755
index be21d55..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/index.html
+++ /dev/null
@@ -1,301 +0,0 @@
-<!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-
-<!DOCTYPE html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <meta http-equiv="X-UA-Compatible" content="IE=edge">
-        <title>Elastic Job Cloud Console</title>
-        <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
-        <link rel="stylesheet" href="lib/bootstrap/css/bootstrap.min.css">
-        <link rel="stylesheet" href="lib/font-awesome-4.5.0/css/font-awesome.min.css">
-        <link rel="stylesheet" href="lib/AdminLTE/css/AdminLTE.min.css">
-        <link rel="stylesheet" href="lib/AdminLTE/css/skins/_all-skins.min.css">
-        <link rel="stylesheet" href="css/common.css">
-        <link rel="stylesheet" href="lib/bootstrap-table/bootstrap-table.min.css">
-        <link rel="stylesheet" href="lib/daterangepicker/daterangepicker.css">
-        <script src="lib/jQuery/jQuery-2.1.4.min.js"></script>
-        <script src="lib/jQuery/jquery.i18n.properties-min.js"></script>
-        <script src="lib/bootstrap/js/bootstrap.min.js"></script>
-        <script src="lib/AdminLTE/js/app.min.js"></script>
-        <script src="lib/highcharts/js/highcharts.js"></script>
-        <script src="js/common/common.js"></script>
-        <script src="js/index.js"></script>
-    </head>
-    <body class="hold-transition skin-blue-light sidebar-mini">
-        <div class="wrapper">
-            <header class="main-header">
-                <a class="logo">
-                    <span class="logo-lg"><span id="logo-font-size">Elastic Job Cloud v2.1.6</span></span>
-                </a>
-                <nav class="navbar navbar-static-top" role="navigation">
-                    <div id="navbar" class="navbar-custom-menu">
-                        <ul class="nav navbar-nav">
-                            <li class="dropdown">
-                                <a href="#" class="dropdown-toggle">
-                                    <i class="fa fa-user"></i>
-                                    <span id="authority"></span>
-                                </a>
-                            </li>
-                            <li><a href="#" data-toggle="control-sidebar"><i class="fa fa-flag"></i></a></li>
-                            <li class="dropdown">
-                                <a href="#" class="dropdown-toggle" data-toggle="dropdown" data-lang="switch-language"></a>
-                                <ul class="dropdown-menu">
-                                    <li><a href="#" id="lang-zh" data-lang="language-zh"></a></li>
-                                    <li><a href="#" id="lang-en" data-lang="language-en"></a></li>
-                                </ul>
-                            </li>
-                        </ul>
-                    </div>
-                </nav>
-            </header>
-            <aside class="main-sidebar">
-                <section class="sidebar">
-                    <ul class="sidebar-menu">
-                        <li class="treeview" id="app">
-                            <a href="#">
-                                <i class="fa fa-laptop" data-lang="sidebar-app"></i><i class="pull-right fa fa-angle-left "></i>
-                                <div class="pull-right">
-                                    <span id="app-nav-tag" class="label label-primary"></span>
-                                </div>
-                            </a>
-                            <ul class="treeview-menu">
-                                <li><a href="#" id="register-app" class="sub-menu"><i class="fa fa-circle-o" data-lang="sidebar-config"></i></a></li>
-                            </ul>
-                        </li>
-                        <li class="treeview" id="job">
-                            <a href="#">
-                                <i class="fa fa-tasks" data-lang="sidebar-job"></i><i class="pull-right fa fa-angle-left"></i>
-                                <div class="pull-right">
-                                    <span id="job-nav-tag" class="label label-primary"></span>
-                                </div>
-                            </a>
-                            <ul class="treeview-menu">
-                                <li><a href="#" id="register-job" class="sub-menu"><i class="fa fa-circle-o" data-lang="sidebar-config"></i></a></li>
-                                <li><a href="#" id="status" class="sub-menu"><i class="fa fa-circle-o" data-lang="sidebar-status"></i></a></li>
-                            </ul>
-                        </li>
-                        <li class="treeview" id="history">
-                            <a href="#">
-                                <i class="fa fa-history" data-lang="sidebar-job-history"></i><i class="pull-right fa fa-angle-left "></i>
-                            </a>
-                            <ul class="treeview-menu">
-                                <li><a href="#" id="dashboard" class ="sub-menu"><i class="fa fa-circle-o" data-lang="sidebar-job-dashboard"></i></a></li>
-                                <li><a href="#" id="exec-details" class ="sub-menu"><i class="fa fa-circle-o" data-lang="sidebar-job-trace"></i></a></li>
-                                <li><a href="#" id="exec-status" class ="sub-menu"><i class="fa fa-circle-o" data-lang="sidebar-history-status"></i></a></li>
-                           </ul>
-                        </li>
-                    </ul>
-            </section>
-            </aside>
-            <div id="content-right" class="lang-en"></div>
-            <footer class="main-footer">
-                    <strong>Copyright &copy; 2004-2017 <a href="http://www.dangdang.com" data-lang="dangdang"></a>.</strong> All rights reserved.
-            </footer>
-            <aside class="control-sidebar control-sidebar-dark">
-                <div class="tab-content">
-                    <div id="control-sidebar-theme-demo-options-tab" class="tab-pane active">
-                        <h4 class="control-sidebar-heading" data-lang="switch-theme-title"></h4>
-                        <ul class="list-unstyled clearfix">
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-blue" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="bg-blue top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-blue"></p>
-                            </li>
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-black" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-white"></p>
-                            </li>
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-purple" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="bg-purple top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-purple"></p>
-                            </li>
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-green" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="bg-green top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-green"></p>
-                            </li>
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-yellow" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="bg-yellow top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-yellow"></p>
-                            </li>
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-red" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="bg-red top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-red"></p>
-                            </li>
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-blue-light" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="bg-light-blue top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-blue-light"></p>
-                            </li>
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-black-light" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-white-light"></p>
-                            </li>
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-purple-light" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="bg-purple top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-purple-light"></p>
-                            </li>
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-green-light" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="bg-green top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-green-light"></p>
-                            </li>
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-yellow-light" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="bg-yellow top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-yellow-light"></p>
-                            </li>
-                            <li>
-                                <a href="javascript:void(0);" data-skin="skin-red-light" class="clearfix full-opacity-hover">
-                                <div>
-                                    <span class="bg-red top-span"></span>
-                                </div>
-                                <div>
-                                    <span class="down-span-left"></span>
-                                    <span class="down-span-right"></span>
-                                </div>
-                                </a>
-                                <p class="text-center no-margin" data-lang="switch-theme-red-light"></p>
-                            </li>
-                        </ul>
-                    </div>
-                </div>
-            </aside>
-            <div id="success-dialog" class="modal">
-                <div class="modal-dialog">
-                    <div class="modal-content">
-                        <div class="modal-body">
-                            <p class="size-font" data-lang="operation-succeed"></p>
-                        </div>
-                        <div class="modal-footer">
-                            <button type="button" class="btn-xs btn-success" data-dismiss="modal" data-lang="operation-cancel"></button>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div id="history-message-modal" class="modal">
-                <div class="modal-dialog" id="modal-dialog-width">
-                    <div class="modal-content">
-                        <div class="modal-body">
-                            <h5 id="history-message"></h5>
-                        </div>
-                        <div class="modal-footer">
-                            <button type="button" class="btn-xs btn-danger" data-dismiss="modal" data-lang="operation-cancel"></button>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div id="fail-dialog" class="modal">
-                <div class="modal-dialog">
-                    <div class="modal-content">
-                        <div class="modal-body">
-                            <p class="size-font" data-lang="app-disabled"></p>
-                        </div>
-                        <div class="modal-footer">
-                            <button type="button" class="btn-xs btn-success" data-dismiss="modal" data-lang="operation-cancel"></button>
-                        </div>
-                    </div>
-                </div>
-            </div>
-        </div>
-    </body>
-</html>
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/add_app.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/add_app.js
deleted file mode 100755
index cfab18c..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/add_app.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    validate();
-    submitConfirm("post", $("#data-add-app"));
-});
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/app_common.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/app_common.js
deleted file mode 100755
index 6c75f02..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/app_common.js
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-function validate() {
-    $("#app-form").bootstrapValidator({
-        message: "This value is not valid",
-        feedbackIcons: {
-            valid: "glyphicon glyphicon-ok",
-            invalid: "glyphicon glyphicon-remove",
-            validating: "glyphicon glyphicon-refresh"
-        },
-        fields: {
-            appName: {
-                validators: {
-                    notEmpty: {
-                        message: $.i18n.prop("app-name-not-null")
-                    },
-                    stringLength: {
-                        max: 100,
-                        message: $.i18n.prop("app-name-length-limit")
-                    },
-                    callback: {
-                        message: $.i18n.prop("app-name-exists"),
-                        callback: function() {
-                            var appName = $("#app-name").val();
-                            var result = true;
-                                $.ajax({
-                                    url: "/api/app/" + appName,
-                                    contentType: "application/json",
-                                    async: false,
-                                    success: function(data) {
-                                        if (null !== data && undefined !== data && "" !== data) {
-                                            result = false;
-                                        }
-                                    }
-                                });
-                            return result;
-                        }
-                    }
-                }
-            },
-            bootstrapScript: {
-                validators: {
-                    notEmpty: {
-                        message: $.i18n.prop("app-bootstrap-script-not-null")
-                    }
-                }
-            },
-            cpuCount: {
-                validators: {
-                    notEmpty: {
-                        message: $.i18n.prop("app-cpu-count-not-null")
-                    },
-                    regexp: {
-                        regexp: /^(-?\d+)(\.\d+)?$/,
-                        message: $.i18n.prop("app-cpu-count-regexp-limit")
-                    }
-                }
-            },
-            appMemory: {
-                validators: {
-                    notEmpty: {
-                        message: $.i18n.prop("app-memory-not-null")
-                    }
-                }
-            },
-            eventTraceSamplingCount: {
-                validators: {
-                    notEmpty: {
-                        message: $.i18n.prop("event-trace-sampling-count-not-null")
-                    }
-                }
-            },
-            appURL: {
-                validators: {
-                    notEmpty: {
-                        message: $.i18n.prop("app-url-not-null")
-                    }
-                }
-            }
-        }
-    });
-}
-
-function submitConfirm(type, modal) {
-    $("#save-button").on("click", function() {
-        var bootstrapValidator = $("#app-form").data("bootstrapValidator");
-        bootstrapValidator.validate();
-        if(bootstrapValidator.isValid()) {
-            $.ajax({
-                type: type,
-                dataType: "json",
-                data: JSON.stringify(getApp()),
-                url: "/api/app",
-                contentType: "application/json",
-                success: function(data) {
-                    modal.modal("hide");
-                    $("#app-table").bootstrapTable("refresh");
-                    $(".modal-backdrop").remove();
-                    $("body").removeClass("modal-open");
-                    refreshAppNavTag();
-                }
-            });
-        }
-    });
-}
-
-function getApp() {
-    return {
-        appName: $("#app-name").val(),
-        cpuCount: $("#cpu-count").val(),
-        memoryMB: $("#app-memory").val(),
-        bootstrapScript: $("#bootstrap-script").val(),
-        appCacheEnable: $("#app-cache-enable").prop("checked"),
-        appURL: $("#app-url").val(),
-        eventTraceSamplingCount: $("#event-trace-sampling-count").val()
-    };
-}
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/apps_overview.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/apps_overview.js
deleted file mode 100755
index 814434f..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/apps_overview.js
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    authorityControl();
-    renderAppOverview();
-    $("#add-app").click(function() {
-        $(".box-body").remove();
-        $("#add-app-body").load("html/app/add_app.html", null, function() {
-            doLocale();
-            tooltipLocale();
-        });
-        $("#data-add-app").modal({backdrop: "static", keyboard: true});
-    });
-    bindDetailAppButton();
-    bindModifyAppButton();
-    bindEnableAppButton();
-    bindDisableAppButton();
-    bindDeleteAppButton();
-});
-
-function renderAppOverview() {
-    var jsonData = {
-        url: "/api/app/list",
-        cache: false
-    };
-    $("#app-table").bootstrapTable({
-        columns: jsonData.columns,
-        url: jsonData.url,
-        cache: jsonData.cache
-    }).on("all.bs.table", function() {
-        doLocale();
-    });
-}
-
-function operationApp(val, row) {
-    var detailButton = "<button operation='detailApp' class='btn-xs btn-info' appName='" + row.appName + "' data-lang='operation-detail'></button>";
-    var modifyButton = "<button operation='modifyApp' class='btn-xs btn-warning' appName='" + row.appName + "' data-lang='operation-update'></button>";
-    var deleteButton = "<button operation='deleteApp' class='btn-xs btn-danger' appName='" + row.appName + "' data-lang='operation-delete'></button>";
-    var enableButton = "<button operation='enableApp' class='btn-xs btn-success' appName='" + row.appName + "' data-lang='operation-enable'></button>";
-    var disableButton = "<button operation='disableApp' class='btn-xs btn-warning' appName='" + row.appName + "' data-lang='operation-disable'></button>";
-    var operationId = detailButton + "&nbsp;" + modifyButton  +"&nbsp;" + deleteButton;
-    if(selectAppStatus(row.appName)) {
-        operationId = operationId + "&nbsp;" + enableButton;
-    } else {
-        operationId = operationId + "&nbsp;" + disableButton;
-    }
-    return operationId;
-}
-
-function bindDetailAppButton() {
-    $(document).off("click", "button[operation='detailApp'][data-toggle!='modal']");
-    $(document).on("click", "button[operation='detailApp'][data-toggle!='modal']", function(event) {
-        var appName = $(event.currentTarget).attr("appName");
-        $.ajax({
-            url: "/api/app/" + appName,
-            contentType: "application/json",
-            success: function(result) {
-                if (null !== result) {
-                    $(".box-body").remove();
-                    $("#detail-app-body").load("html/app/detail_app.html", null, function() {
-                        doLocale();
-                        tooltipLocale();
-                        renderApp(result);
-                        $("#data-detail-app").modal({backdrop : "static", keyboard : true});
-                        $("#close-button").on("click", function() {
-                            $("#data-detail-app").modal("hide");
-                        });
-                    });
-                }
-            }
-        });
-    });
-}
-
-function bindModifyAppButton() {
-    $(document).off("click", "button[operation='modifyApp'][data-toggle!='modal']");
-    $(document).on("click", "button[operation='modifyApp'][data-toggle!='modal']", function(event) {
-        var appName = $(event.currentTarget).attr("appName");
-        $.ajax({
-            url: "/api/app/" + appName,
-            contentType: "application/json",
-            success: function(result) {
-                if(null !== result) {
-                    $(".box-body").remove();
-                    $("#update-app-body").load("html/app/modify_app.html", null, function() {
-                        doLocale();
-                        tooltipLocale();
-                        renderApp(result);
-                        $("#data-update-app").modal({backdrop : "static", keyboard : true});
-                    });
-                }
-            }
-        });
-    });
-}
-
-function bindEnableAppButton() {
-    $(document).off("click", "button[operation='enableApp'][data-toggle!='modal']");
-    $(document).on("click", "button[operation='enableApp'][data-toggle!='modal']", function(event) {
-        var appName = $(event.currentTarget).attr("appName");
-        $.ajax({
-            url: "/api/app/" + appName + "/enable",
-            type: "POST",
-            contentType: "application/json",
-            success: function(result) {
-                showSuccessDialog();
-                $("#app-table").bootstrapTable("refresh");
-            }
-        });
-    });
-}
-
-function bindDisableAppButton() {
-    $(document).off("click", "button[operation='disableApp'][data-toggle!='modal']");
-    $(document).on("click", "button[operation='disableApp'][data-toggle!='modal']", function(event) {
-        var appName = $(event.currentTarget).attr("appName");
-        $.ajax({
-            url: "/api/app/" + appName + "/disable",
-            type: "POST",
-            contentType: "application/json",
-            success: function(result) {
-                showSuccessDialog();
-                $("#app-table").bootstrapTable("refresh");
-            }
-        });
-    });
-}
-
-function bindDeleteAppButton() {
-    $(document).off("click", "button[operation='deleteApp'][data-toggle!='modal']");
-    $(document).on("click", "button[operation='deleteApp'][data-toggle!='modal']", function(event) {
-        var appName = $(event.currentTarget).attr("appName");
-        $("#delete-data-app").modal({backdrop : "static", keyboard : true});
-        var flag = true;
-        $("#delete-app-remove").on("click", function() {
-            flag = false;
-        });
-        $("#delete-app-confirm").on("click", function() {
-            if(flag) {
-                $.ajax({
-                    url: "/api/app/" + appName,
-                    type: "DELETE",
-                    contentType: "application/json",
-                    success: function(result) {
-                        $("#app-table").bootstrapTable("refresh");
-                        $("#delete-data-app").hide();
-                        refreshAppNavTag();
-                        refreshJobNavTag();
-                    }
-                });
-            }
-        });
-    });
-}
-
-function renderApp(app) {
-    $("#app-name").attr("value", app.appName);
-    $("#cpu-count").attr("value", app.cpuCount);
-    $("#app-memory").attr("value", app.memoryMB);
-    $("#bootstrap-script").attr("value", app.bootstrapScript);
-    $("#app-url").attr("value", app.appURL);
-    $("#event-trace-sampling-count").val(app.eventTraceSamplingCount);
-    $("#app-cache-enable").prop("checked", app.appCacheEnable);
-}
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/modify_app.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/modify_app.js
deleted file mode 100755
index cdcc294..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/app/modify_app.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    validate();
-    submitConfirm("put", $("#data-update-app"));
-});
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/common/common.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/common/common.js
deleted file mode 100755
index 28b1bc3..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/common/common.js
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    renderSkin();
-    controlSubMenuStyle();
-});
-
-function showSuccessDialog() {
-    $("#success-dialog").modal("show");
-    setTimeout('$("#success-dialog").modal("hide")', 2000);
-}
-
-function showFailDialog() {
-    $("#fail-dialog").modal("show");
-    setTimeout('$("#fail-dialog").modal("hide")', 2000);
-}
-
-function refreshJobNavTag() {
-    $.ajax({
-        url: "/api/job/jobs",
-        cache: false,
-        success: function(data) {
-            $("#job-nav-tag").text(data.length);
-        }
-    });
-}
-
-function refreshAppNavTag() {
-    $.ajax({
-        url: "/api/app/list",
-        cache: false,
-        success: function(data) {
-            $("#app-nav-tag").text(data.length);
-        }
-    });
-}
-
-var my_skins = [
-    "skin-blue",
-    "skin-black",
-    "skin-red",
-    "skin-yellow",
-    "skin-purple",
-    "skin-green",
-    "skin-blue-light",
-    "skin-black-light",
-    "skin-red-light",
-    "skin-yellow-light",
-    "skin-purple-light",
-    "skin-green-light"
-];
-
-function renderSkin() {
-    $("[data-skin]").on("click", function(event) {
-        event.preventDefault();
-        changeSkin($(this).data("skin"));
-    });
-}
-
-function changeSkin(skinClass) {
-    $.each(my_skins, function(index) {
-        $("body").removeClass(my_skins[index]);
-    });
-    $("body").addClass(skinClass);
-}
-
-function controlSubMenuStyle() {
-    $(".sub-menu").click(function() {
-        $(this).parent().parent().children().removeClass("active");
-        $(this).parent().addClass("active");
-    });
-}
-
-function selectAppStatus(appName) {
-    var resultValue = null;
-    $.ajax({
-        type: "GET",
-        async: false,
-        url: "/api/app/" + appName + "/disable",
-        contentType: "application/json",
-        success: function(result) {
-            resultValue = result;
-        }
-    });
-    return resultValue;
-}
-
-function authorityControl() {
-    $.ajax({
-        type: "HEAD",
-        url : "/",
-        complete: function(xhr, data) {
-            if ("guest" === xhr.getResponseHeader("identify")) {
-                $("table").on("all.bs.table", function() {
-                    $(".content-wrapper .btn-xs").not(".btn-info").attr("disabled", true);
-                    $(".content-wrapper .btn-xs").not(".btn-info").removeClass().addClass("btn-xs");
-                });
-            }
-            if ("" === $("#authority").text()) {
-                $("#authority").text(xhr.getResponseHeader("identify"));
-            }
-        }
-    });
-}
-
-function i18n(lang) {
-    jQuery.i18n.properties({
-        name : 'message',
-        path : '/i18n/',
-        mode : 'map',
-        language : lang,
-        cache: true,
-        encoding: 'UTF-8',
-        callback : function() {
-            for (var i in $.i18n.map) {
-                $('[data-lang="'+i+'"]').html($.i18n.prop(i));
-            }
-        }
-    });
-}
-
-function doLocale() {
-    if ($("#content-right").hasClass("lang-en")) {
-        i18n("en");
-    } else {
-        i18n("zh");
-    }
-}
-
-function switchLanguage() {
-    $("#lang-zh").click(function() {
-        $("#content-right").removeClass("lang-en").addClass("lang-zh");
-        doLocale();
-    });
-    $("#lang-en").click(function() {
-        $("#content-right").removeClass("lang-zh").addClass("lang-en");
-        doLocale();
-    });
-}
-
-function tooltipLocale(){
-    for (var i = 0; i < $("[data-toggle='tooltip']").length; i++) {
-        var object = $("[data-toggle='tooltip']")[i];
-        $(object).attr('title',$.i18n.prop("placeholder-" + object.getAttribute("id"))).tooltip('fixTitle');
-    }
-}
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/history_common.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/history_common.js
deleted file mode 100755
index fedc526..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/history_common.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    $customDatepicker = $(".custom-datepicker");
-    $customDatepicker.daterangepicker({singleDatePicker : true, timePicker : true, timePicker24Hour : true, timePickerSeconds : true, autoUpdateInput : false});
-    $customDatepicker.on("apply.daterangepicker", function(event, picker) {
-        $(this).val(picker.startDate.format("YYYY-MM-DD HH:mm:ss"));
-    });
-    $customDatepicker.on("cancel.daterangepicker", function(event, picker) {
-        $(this).val("");
-    });
-});
-
-Date.prototype.format = function(fmt) {
-    var date = {
-    "M+" : this.getMonth() + 1,
-    "d+" : this.getDate(),
-    "h+" : this.getHours() % 12 == 0 ? 12 : this.getHours() % 12,
-    "H+" : this.getHours(),
-    "m+" : this.getMinutes(),
-    "s+" : this.getSeconds()
-    };
-    if(/(y+)/.test(fmt)) {
-        fmt=fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
-    }
-    for(var each in date) {
-        if(new RegExp("(" + each + ")").test(fmt)) {
-            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (date[each]) : (("00" + date[each]).substr(("" + date[each]).length)));
-        }
-    }
-    return fmt;
-};
-
-function dateTimeFormatter(value) {
-    if(null == value){
-        return "";
-    }
-    return new Date(value).format("yyyy-MM-dd HH:mm:ss");
-}
-
-function showHistoryMessage(value) {
-    $("#history-message").html(value);
-    $("#history-message-modal").modal("show");
-}
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/job_dashboard.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/job_dashboard.js
deleted file mode 100755
index 1f2e9ba..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/job_dashboard.js
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    doLocale();
-    renderPieChartSinceLastMinuteData();
-    renderPieChartSinceLastHourData();
-    renderPieChartSinceLastWeekData();
-    renderJobExecutionTypePieChart();
-    renderStaticsJobsLineChart();
-    renderRunningJobsAndTasksLineChart();
-    renderRegisteredJobs();
-});
-
-function doLocale() {
-    if ($("#content-right").hasClass("lang-en")) {
-        i18n("en");
-    } else {
-        i18n("zh");
-    }
-    renderPieChartSinceLastMinuteData();
-    renderPieChartSinceLastHourData();
-    renderPieChartSinceLastWeekData();
-    renderJobExecutionTypePieChart();
-    renderStaticsJobsLineChart();
-    renderRunningJobsAndTasksLineChart();
-    renderRegisteredJobs();
-}
-
-function renderPieChartSinceLastMinuteData() {
-    $.ajax({
-        url: "/api/job/statistics/tasks/results/lastMinute",
-        dataType: "json",
-        success: function(jobData) {
-            if(null !== jobData) {
-                var chartName = "#total-jobs-lastMinute";
-                var color = ["rgb(144,237,125)","red"];
-                var jobResult = [[$.i18n.prop("execute-result-success"), jobData.successCount], [$.i18n.prop("execute-result-failure"), jobData.failedCount]];
-                renderPieChart(chartName, $.i18n.prop("job-info-for-one-minute"), color, jobResult);
-            }
-        }
-    });
-}
-
-function renderPieChartSinceLastHourData() {
-    $.ajax({
-        url: "/api/job/statistics/tasks/results/lastHour",
-        dataType: "json",
-        success: function(jobData) {
-            if(null !== jobData) {
-                var chartName = "#total-jobs-lastHour";
-                var color = ["rgb(144,237,125)", "red"];
-                var jobResult = [[$.i18n.prop("execute-result-success"), jobData.successCount], [$.i18n.prop("execute-result-failure"), jobData.failedCount]];
-                renderPieChart(chartName, $.i18n.prop("job-info-for-one-hour"), color, jobResult);
-            }
-        }
-    });
-}
-
-function renderPieChartSinceLastWeekData() {
-    $.ajax({
-        url: "/api/job/statistics/tasks/results/lastWeek",
-        dataType: "json",
-        success: function(jobData) {
-            if(null !== jobData) {
-                var chartName = "#total-jobs-weekly";
-                var color = ["rgb(144,237,125)", "red"];
-                var jobResult = [[$.i18n.prop("execute-result-success"), jobData.successCount], [$.i18n.prop("execute-result-failure"), jobData.failedCount]];
-                renderPieChart(chartName, $.i18n.prop("job-info-for-one-week"), color, jobResult);
-            }
-        }
-    });
-}
-
-function renderJobExecutionTypePieChart() {
-    $.ajax({
-        url: "/api/job/statistics/jobs/executionType",
-        dataType: "json",
-        success: function(jobData) {
-            if(null !== jobData) {
-                var chartName = "#job-execution-type";
-                var color = ["rgb(144, 237, 125)", "rgb(124, 181, 236)"];
-                var jobResult = [["TRANSIENT", jobData.transientJobCount], ["DAEMON", jobData.daemonJobCount]];
-                renderPieChart(chartName, $.i18n.prop("job-execution-type"), color, jobResult);
-            }
-        }
-    });
-}
-
-function renderStaticsJobsLineChart() {
-    $.ajax({
-        url: "/api/job/statistics/tasks/results?since=last24hours",
-        dataType: "json",
-        success: function(jobData) {
-            if(null !== jobData) {
-                var chartName = "#statictis_jobs";
-                var successData = [];
-                var failData = [];
-                for(var i = 0; i < jobData.length; i++) {
-                    var dateTime = new Date(jobData[i].statisticsTime).getTime() + 1000*60*60*8;
-                    successData.push([dateTime, jobData[i].successCount]);
-                    failData.push([dateTime, jobData[i].failedCount]);
-                }
-                var resultData = [{type: "spline", name: $.i18n.prop("job-success-count"), data: successData}, {type: "spline", name: $.i18n.prop("job-failure-count"), data: failData}];
-                renderLineChart(chartName, $.i18n.prop("dashboard-succ-and-fail-count"), resultData);
-            }
-        }
-    });
-}
-
-function renderRunningJobsAndTasksLineChart() {
-    $.ajax({
-        url: "/api/job/statistics/jobs/running?since=lastWeek",
-        dataType: "json",
-        success: function(jobData) {
-            $.ajax({
-                url: "/api/job/statistics/tasks/running?since=lastWeek",
-                dataType: "json",
-                success: function(taskData) {
-                    if(null !== taskData) {
-                        var chartName = "#run-jobs";
-                        var jobRunningData = [];
-                        var taskRunningData = [];
-                        for(var i = 0; i < jobData.length; i++) {
-                            var dateTime = new Date(jobData[i].statisticsTime).getTime() + 1000 * 60 * 60 * 8;
-                            jobRunningData.push([dateTime, jobData[i].runningCount]);
-                        }
-                        for(var i = 0; i < taskData.length; i++) {
-                            var dateTime = new Date(taskData[i].statisticsTime).getTime() + 1000 * 60 * 60 * 8;
-                            taskRunningData.push([dateTime, taskData[i].runningCount]);
-                        }
-                        var resultData = [{type: "spline", name: $.i18n.prop("task-running-count"), data: taskRunningData}, {type: "spline", name: $.i18n.prop("task-running-count"), data: jobRunningData}];
-                        renderLineChart(chartName, $.i18n.prop("dashboard-job-task-running-count"), resultData);
-                    }
-                }
-            });
-        }
-    });
-}
-
-function renderRegisteredJobs() {
-    $.ajax({
-        url: "/api/job/statistics/jobs/register",
-        dataType: "json",
-        success: function(jobData) {
-            if(null !== jobData) {
-                var chartName = "#regist-jobs";
-                var registerData = [];
-                for(var i = 0; i < jobData.length; i++) {
-                    var dateTime = new Date(jobData[i].statisticsTime).getTime() + 1000 * 60 * 60 * 8;
-                    registerData.push([dateTime, jobData[i].registeredCount]);
-                }
-                var resultData = [{ type: "spline", name: $.i18n.prop("dashboard-current-jobs-count"), data: registerData}];
-                renderLineChart(chartName, $.i18n.prop("dashboard-current-jobs-count"), resultData);
-            }
-        }
-    });
-}
-
-function renderPieChart(chartName, title, color, jobData) {
-    $(chartName).highcharts({
-        chart: {
-            backgroundColor: "rgba(255, 255, 255, 0)"
-        },
-        title: {
-            text: title
-        },
-        plotOptions: {
-            pie: {
-                size: "60%",
-                allowPointSelect: true,
-                cursor: "pointer",
-                dataLabels: {
-                    enabled: true,
-                    format: "<b>{point.name}</b>:<br> {point.percentage:.1f} % ",
-                    distance: 5
-                }
-            }
-        },
-        colors: color,
-        series: [{
-            type: "pie",
-            name: $.i18n.prop("sidebar-job"),
-            data: jobData
-        }],
-        credits: {
-            enabled: false
-        }
-    });
-}
-
-function renderLineChart(chartName, title, jobData) {
-    Highcharts.setOptions({
-        lang: {
-            resetZoom: $.i18n.prop("operation-reset"),
-            resetZoomTitle: $.i18n.prop("operation-reset-scaling")
-        }
-    });
-    $(chartName).highcharts({
-        chart: {
-            zoomType: "x",
-            resetZoomButton: {
-                position: {
-                    align: "right",
-                    verticalAlign: "top",
-                    x: 0,
-                    y: -50
-                }
-            },
-            backgroundColor: "rgba(255, 255, 255, 0)"
-        },
-        credits: {
-            enabled: false
-        },
-        title: {
-            text: title
-        },
-        subtitle: {
-            text: document.ontouchstart === undefined ? $.i18n.prop("highchart-tooltip-info1") : $.i18n.prop("highchart-tooltip-info2")
-        },
-        tooltip: {
-            shared: true,
-            crosshairs: true,
-            dateTimeLabelFormats: {
-                millisecond: "%H:%M:%S.%L",
-                second: "%Y-%m-%d %H:%M:%S",
-                minute: "%Y-%m-%d %H:%M",
-                hour: "%Y-%m-%d %H:%M",
-                day: "%Y-%m-%d",
-                week: "%m-%d",
-                month: "%Y-%m",
-                year: "%Y"
-            }
-        },
-        xAxis: {
-            type: "datetime",
-            dateTimeLabelFormats: {
-                millisecond: "%H:%M:%S.%L",
-                second: "%H:%M:%S",
-                minute: "%H:%M",
-                hour: "%H:%M",
-                day: "%m-%d",
-                week: "%m-%d",
-                month: "%Y-%m",
-                year: "%Y"
-            } 
-        },
-        yAxis: {
-            title: {
-                text: ""
-            },
-            labels: {
-                align: "left",
-                x: -10,
-                y: 0
-            }
-        },
-        series: jobData
-    });
-}
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/job_exec_details.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/job_exec_details.js
deleted file mode 100755
index c3cc9bf..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/job_exec_details.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    $("[data-mask]").inputmask();
-    $(".toolbar input").bind("keypress", function(event) {
-        if("13" == event.keyCode) {
-            $("#job-exec-details-table").bootstrapTable("refresh", {silent: true});
-        }
-    });
-    $("#job-exec-details-table").bootstrapTable().on("all.bs.table", function() {
-        doLocale();
-    });
-});
-
-function queryParams(params) {
-    var sortName = "success" === params.sortName ? "isSuccess" : params.sortName;
-    return {
-        per_page: params.pageSize, 
-        page: params.pageNumber,
-        q: params.searchText,
-        sort: sortName,
-        order: params.sortOrder,
-        jobName: $("#job-name").val(),
-        taskId: $("#task-id").val(),
-        startTime: $("#start-time").val(),
-        endTime: $("#end-time").val(),
-        ip: $("#ip").val(),
-        isSuccess: $('input[name = "isSuccess"]:checked ').val()
-    };
-}
-
-function successFormatter(value) {
-    switch(value)
-    {
-    case true:
-      return "<span class='label label-success' data-lang='execute-result-success'></span>";
-    case false:
-        return "<span class='label label-danger' data-lang='execute-result-failure'></span>";
-    default:
-      return "<span class='label label-danger' data-lang='execute-result-null'></span>";
-    }
-}
-
-function splitFormatter(value) {
-    var maxLength = 50;
-    var replacement = "...";
-    if(null != value && value.length > maxLength) {
-        var vauleDetail = value.substring(0 , maxLength - replacement.length) + replacement;
-        value = value.replace(/\r\n/g,"<br/>").replace(/\n/g,"<br/>").replace(/\'/g, "\\'");
-        return '<a href="javascript: void(0);" style="color:#FF0000;" onClick="showHistoryMessage(\'' + value + '\')">' + vauleDetail + '</a>';
-    }
-    return value;
-}
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/job_exec_status.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/job_exec_status.js
deleted file mode 100755
index 05aafa7..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/history/job_exec_status.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    $(".toolbar input").bind("keypress", function(event) {
-        if("13" == event.keyCode) {
-            $("#job-exec-status-table").bootstrapTable("refresh", {silent: true});
-        }
-    });
-    $("#job-exec-status-table").bootstrapTable().on("all.bs.table", function() {
-        doLocale();
-    });
-});
-
-function queryParams(params) {
-    return {
-        per_page: params.pageSize, 
-        page: params.pageNumber,
-        q: params.searchText,
-        sort: params.sortName,
-        order: params.sortOrder,
-        jobName: $("#job-name").val(),
-        taskId: $("#task-id").val(),
-        slaveId: $("#slave-id").val(),
-        source: $("#source").val(),
-        executionType: $("#execution-type").val(),
-        state: $("#state").val(),
-        startTime: $("#start-time").val(),
-        endTime: $("#end-time").val()
-    };
-}
-
-function splitRemarkFormatter(value, row) {
-    var maxLength = 50;
-    var replacement = "...";
-    if(null != value && value.length > maxLength) {
-        var valueDetail = value.substring(0 , maxLength - replacement.length) + replacement;
-        value = value.replace(/\r\n/g,"<br/>").replace(/\n/g,"<br/>").replace(/\'/g, "\\'");
-        var remarkHtml;
-        if ("TASK_FAILED" === row.state || "TASK_ERROR" === row.state) {
-            remarkHtml = '<a href="javascript: void(0);" style="color:#FF0000;" onClick="showHistoryMessage(\'' + value + '\')">' + valueDetail + '</a>';
-        } else {
-            remarkHtml = '<a href="javascript: void(0);" style="color:black;" onClick="showHistoryMessage(\'' + value + '\')">' + valueDetail + '</a>';
-        }
-        return remarkHtml;
-    }
-    return value;
-}
-
-function stateFormatter(value) {
-    switch(value)
-    {
-        case "TASK_STAGING":
-            return "<span class='label label-default' data-lang='status-staging'></span>";
-        case "TASK_FAILED":
-            return "<span class='label label-danger' data-lang='status-task-failed'></span>";
-        case "TASK_FINISHED":
-            return "<span class='label label-success' data-lang='status-task-finished'></span>";
-        case "TASK_RUNNING":
-            return "<span class='label label-primary' data-lang='status-running'></span>";
-        case "TASK_ERROR":
-            return "<span class='label label-danger' data-lang='status-task-error'></span>";
-        case "TASK_KILLED":
-            return "<span class='label label-warning' data-lang='status-task-killed'></span>";
-        default:
-            return "-";
-    }
-}
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/index.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/index.js
deleted file mode 100755
index 4a5731e..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/index.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    $("#content-right").load("/html/app/apps_overview.html");
-    refreshJobNavTag();
-    refreshAppNavTag();
-    $("#register-app").click(function() {
-        $("#content-right").load("/html/app/apps_overview.html");
-    });
-    $("#register-job").click(function() {
-        $("#content-right").load("/html/job/jobs_overview.html");
-    });
-    $("#status").click(function() {
-        $("#content-right").load("/html/job/job_status.html", null, function(){
-            $("table").bootstrapTable().on("all.bs.table", function() {
-                doLocale();
-            });
-        });
-    });
-    $("#dashboard").click(function() {
-        $("#content-right").load("/html/history/job_dashboard.html");
-    });
-    $("#exec-details").click(function() {
-        $("#content-right").load("/html/history/job_exec_details.html");
-    });
-    $("#exec-status").click(function() {
-        $("#content-right").load("/html/history/job_exec_status.html");
-    });
-    switchLanguage();
-});
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/add_job.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/add_job.js
deleted file mode 100755
index 996af82..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/add_job.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    validate();
-    submitConfirm("post", "/api/job/register", $("#data-add-job"));
-});
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/job_common.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/job_common.js
deleted file mode 100755
index 8f85f3f..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/job_common.js
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-function validate() {
-    $("#job-form").bootstrapValidator({
-        message: "This value is not valid",
-        feedbackIcons: {
-            valid: "glyphicon glyphicon-ok",
-            invalid: "glyphicon glyphicon-remove",
-            validating: "glyphicon glyphicon-refresh"
-        },
-        fields: {
-            jobName: {
-                jobNameCheck: true,
-                validators: {
-                    notEmpty: {
-                        message: $.i18n.prop("job-name-not-null")
-                    },
-                    stringLength: {
-                        max: 100,
-                        message: $.i18n.prop("job-name-length-limit")
-                    },
-                    callback: {
-                        message: $.i18n.prop("job-name-exists"),
-                        callback: function () {
-                            var jobName = $("#job-name").val();
-                            var result = true;
-                            if ("" !== jobName) {
-                                $.ajax({
-                                    url: "/api/job/jobs/" + jobName,
-                                    contentType: "application/json",
-                                    async: false,
-                                    success: function(data) {
-                                        if (null !== data && undefined !== data && "" !== data) {
-                                            result = false;
-                                        }
-                                    }
-                                });
-                            }
-                            return result;
-                        }
-                    }
-                }
-            },
-            jobAppName: {
-                validators: {
-                    callback: {
-                        message: $.i18n.prop("app-name-unregistered"),
-                        callback: function (validator) {
-                            var appName = $("#job-app-name").val();
-                            var result = false;
-                                $.ajax({
-                                    url: "/api/app/" + appName,
-                                    contentType: "application/json",
-                                    async: false,
-                                    success: function(data) {
-                                        if (null !== data && undefined !== data && "" !== data) {
-                                            result = true;
-                                        }
-                                    }
-                                });
-                            return result;
-                        }
-                    }
-                }
-            },
-            cron: {
-                validators: {
-                    stringLength: {
-                        max: 40,
-                        message: $.i18n.prop("job-cron-length-limit")
-                    },
-                    notEmpty: {
-                        message: $.i18n.prop("job-cron-not-null")
-                    }
-                }
-            },
-            cpuCount: {
-                validators: {
-                    notEmpty: {
-                        message: $.i18n.prop("job-cpu-count-not-null")
-                    },
-                    regexp: {
-                        regexp: /^(-?\d+)(\.\d+)?$/,
-                        message: $.i18n.prop("job-cpu-count-regexp-limit")
-                    }
-                }
-            },
-            jobMemory: {
-                validators: {
-                    notEmpty: {
-                        message: $.i18n.prop("job-memory-not-null")
-                    }
-                }
-            },
-            shardingTotalCount: {
-                validators: {
-                    notEmpty: {
-                        message: $.i18n.prop("job-sharding-count-not-null")
-                    }
-                }
-            },
-            beanName: {
-                validators: {
-                }
-            },
-            applicationContext: {
-                validators: {
-                }
-            },
-            scriptCommandLine: {
-                validators: {
-                    notEmpty: {
-                        message: $.i18n.prop("job-script-command-line-not-null")
-                    }
-                }
-            },
-            shardingItemParameters: {
-                validators: {
-                    regexp: {
-                        regexp: /^(\d+)=(\w+)(,(\d+)=(\w+))*$/,
-                        message: $.i18n.prop("job-sharding-item-parameters-regexp-limit")
-                    }
-                }
-            }
-        }
-    });
-}
-
-$("#sharding-item-parameters").blur(function() {
-    if($("" == "#sharding-item-parameters").val()) {
-        $("#job-form").data("bootstrapValidator").enableFieldValidators("shardingItemParameters", false);
-    } else {
-        $("#job-form").data("bootstrapValidator").enableFieldValidators("shardingItemParameters", true);
-    }
-});
-
-$("#sharding-item-parameters").focus(function() {
-    $("#job-form").data('bootstrapValidator').enableFieldValidators("shardingItemParameters", true);
-});
-
-function submitConfirm(type, url, modal) {
-    $("#save-button").on("click", function() {
-        if($("" == "#sharding-item-parameters").val() || null === $("#sharding-item-parameters").val()) {
-            $("#job-form").data("bootstrapValidator").enableFieldValidators("shardingItemParameters", false);
-        }
-        var bootstrapValidator = $("#job-form").data("bootstrapValidator");
-        bootstrapValidator.validate();
-        if(bootstrapValidator.isValid()) {
-            var beanName = $("#bean-name").val();
-            var applicationContext = $("#application-context").val();
-            if(0 === beanName.length && 0 === applicationContext.length) {
-                submitJobForm(type, url, modal);
-            } else if(null !== applicationContext && 0 === beanName.length) {
-                $("#delete-data—bean-name").modal();
-                setTimeout(function() {
-                    $("#delete-data—bean-name").modal("hide");
-                }, 3000); 
-            } else if(null !== beanName && 0 === applicationContext.length) {
-                $("#delete-data-application-context").modal();
-                setTimeout(function() {
-                    $("#delete-data-application-context").modal("hide");
-                }, 3000);
-            } else {
-                submitJobForm(type, url, modal);
-            }
-        }
-    });
-}
-
-function submitJobForm(type, url, modal) {
-    $.ajax({
-        type: type,
-        dataType: "json",
-        data: JSON.stringify(getJob()),
-        url: url,
-        contentType: "application/json",
-        success: function(data) {
-            modal.modal("hide");
-            $(".modal-backdrop").remove();
-            $("body").removeClass("modal-open");
-            $("#content-right").load("/html/job/jobs_overview.html");
-            refreshJobNavTag();
-        }
-    });
-}
-
-function getJob() {
-    return {
-        jobName: $("#job-name").val(),
-        appName: $("#job-app-name").val(),
-        cron: $("#cron").val(),
-        cpuCount: $("#cpu-count").val(),
-        jobExecutionType: $("#job-execution-type").val(),
-        memoryMB: $("#job-memory").val(),
-        bootstrapScript: $("#bootstrap-script").val(),
-        beanName: $("#bean-name").val(),
-        shardingTotalCount: $("#sharding-total-count").val(),
-        jobParameter: $("#job-parameter").val(),
-        failover: $("#failover").prop("checked"),
-        misfire: $("#misfire").prop("checked"),
-        streamingProcess: $("#streaming-process").prop("checked"),
-        applicationContext: $("#application-context").val(),
-        shardingItemParameters: $("#sharding-item-parameters").val(),
-        scriptCommandLine: $("#script-command-line").val(),
-        description: $("#description").val()
-    };
-}
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/jobs_overview.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/jobs_overview.js
deleted file mode 100755
index a99321a..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/jobs_overview.js
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    authorityControl();
-    renderJobOverview();
-    $("#add-job").click(function() {
-        $(".box-body").remove();
-        $("#add-job-body").load("html/job/add_job.html", null, function() {
-            doLocale();
-            tooltipLocale();
-        });
-        $("#data-add-job").modal({backdrop : "static", keyboard : true});
-    });
-    bindDetailJobButton();
-    bindDeleteJobButton();
-    bindModifyJobButton();
-    bindEnableJobButton();
-    bindDisableJobButton();
-});
-
-function renderJobOverview() {
-    var jsonData = {
-        url: "/api/job/jobs",
-        cache: false
-    };
-    $("#job-table").bootstrapTable({
-        columns: jsonData.columns,
-        url: jsonData.url,
-        cache: jsonData.cache
-    }).on("all.bs.table", function() {
-        doLocale();
-    });
-}
-
-function operationJob(val, row) {
-    var detailButton = "<button operation='detailJob' class='btn-xs btn-info' jobName='" + row.jobName + "' data-lang='operation-detail'></button>";
-    var modifyButton = "<button operation='modifyJob' class='btn-xs btn-warning' jobName='" + row.jobName + "' data-lang='operation-update'></button>";
-    var deleteButton = "<button operation='deleteJob' class='btn-xs btn-danger' jobName='" + row.jobName + "' data-lang='operation-delete'></button>";
-    var enableButton = "<button operation='enableJob' class='btn-xs btn-success' jobName='" + row.jobName + "' appName='" + row.appName + "' data-lang='operation-enable'></button>";
-    var disableButton = "<button operation='disableJob' class='btn-xs btn-warning' jobName='" + row.jobName + "' data-lang='operation-disable'></button>";
-    var operationId = detailButton + "&nbsp;" + modifyButton  +"&nbsp;" + deleteButton;
-    if(selectJobStatus(row.jobName)) {
-        operationId = operationId + "&nbsp;" + enableButton;
-    }else{
-        operationId = operationId + "&nbsp;" + disableButton;
-    }
-    return operationId;
-}
-
-function selectJobStatus(jobName) {
-    var resultValue = null;
-    $.ajax({
-        type:"GET",
-        async: false,
-        url: "/api/job/" + jobName + "/disable",
-        contentType: "application/json",
-        success: function(result) {
-            resultValue = result;
-        }
-    });
-    return resultValue;
-}
-
-function bindDetailJobButton() {
-    $(document).off("click", "button[operation='detailJob'][data-toggle!='modal']");
-    $(document).on("click", "button[operation='detailJob'][data-toggle!='modal']", function(event) {
-        var jobName = $(event.currentTarget).attr("jobName");
-        $.ajax({
-            url: "/api/job/jobs/" + jobName,
-            contentType: "application/json",
-            success: function(result) {
-                $(".box-body").remove();
-                $("#detail-job-body").load("html/job/detail_job.html", null, function() {
-                    renderJob(result);
-                    doLocale();
-                    tooltipLocale();
-                    $("#data-detail-job").modal({backdrop : "static", keyboard : true});
-                    $("#close-button").on("click", function(){
-                        $("#data-detail-job").modal("hide");
-                    });
-                });
-            }
-        });
-    });
-}
-
-function bindDeleteJobButton() {
-    $(document).off("click", "button[operation='deleteJob'][data-toggle!='modal']");
-    $(document).on("click", "button[operation='deleteJob'][data-toggle!='modal']", function(event) {
-        var jobName = $(event.currentTarget).attr("jobName");
-        $("#delete-data").modal({backdrop : "static", keyboard : true});
-        var flag = true;
-        $("#delete-job-remove").on("click", function() {
-            flag = false;
-        });
-        $("#delete-job-confirm").on("click", function() {
-            if(flag) {
-                $.ajax({
-                    url: "/api/job/" + jobName + "/deregister",
-                    type: "DELETE",
-                    contentType: "application/json",
-                    success: function() {
-                        $("#job-table").bootstrapTable("refresh");
-                        $("#delete-data").hide();
-                        refreshJobNavTag();
-                    }
-                });
-            }
-        });
-    });
-}
-
-function bindModifyJobButton() {
-    $(document).off("click", "button[operation='modifyJob'][data-toggle!='modal']");
-    $(document).on("click", "button[operation='modifyJob'][data-toggle!='modal']", function(event) {
-        var jobName = $(event.currentTarget).attr("jobName");
-        $.ajax({
-            url: "/api/job/jobs/" + jobName,
-            success: function(result) {
-                if (null !== result) {
-                    $(".box-body").remove();
-                    $("#update-job-body").load("html/job/modify_job.html", null, function() {
-                        doLocale();
-                        tooltipLocale();
-                        $('#data-update-job').modal({backdrop : "static", keyboard : true});
-                        renderJob(result);
-                    });
-                }
-            }
-        });
-    });
-}
-
-function bindEnableJobButton() {
-    $(document).off("click", "button[operation='enableJob'][data-toggle!='modal']");
-    $(document).on("click", "button[operation='enableJob'][data-toggle!='modal']", function(event) {
-        var jobName = $(event.currentTarget).attr("jobName");
-        var appName = $(event.currentTarget).attr("appName");
-        if(selectAppStatus(appName)){
-            showFailDialog();
-        } else {
-            $.ajax({
-                url: "/api/job/" + jobName + "/enable",
-                type: "POST",
-                contentType: "application/json",
-                success: function(result) {
-                    $("#job-table").bootstrapTable("refresh");
-                    showSuccessDialog();
-                }
-            });
-        }
-    });
-}
-
-function bindDisableJobButton() {
-    $(document).off("click", "button[operation='disableJob'][data-toggle!='modal']");
-    $(document).on("click", "button[operation='disableJob'][data-toggle!='modal']", function(event) {
-        var jobName = $(event.currentTarget).attr("jobName");
-        $.ajax({
-            url: "/api/job/" + jobName + "/disable",
-            type: "POST",
-            contentType: "application/json",
-            success: function(result) {
-                $("#job-table").bootstrapTable("refresh");
-                showSuccessDialog();
-            }
-        });
-    });
-}
-
-function renderJob(job) {
-    $("#job-name").attr("value", job.jobName);
-    $("#job-app-name").attr("value", job.appName);
-    $("#cron").attr("value", job.cron);
-    $("#job-execution-type").val(job.jobExecutionType);
-    $("#sharding-total-count").attr("value", job.shardingTotalCount);
-    $("#job-parameter").attr("value", job.jobParameter);
-    $("#cpu-count").attr("value", job.cpuCount);
-    $("#job-memory").attr("value", job.memoryMB);
-    $("#bean-name").attr("value", job.beanName);
-    $("#application-context").attr("value", job.applicationContext);
-    $("#description").val(job.description);
-    $("#sharding-item-parameters").val(job.shardingItemParameters);
-    $("#failover").prop("checked", job.failover);
-    $("#misfire").prop("checked", job.misfire);
-    $("#streaming-process").prop("checked", job.streamingProcess);
-    $("#script-command-line").val(job.scriptCommandLine);
-}
-
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/modify_job.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/modify_job.js
deleted file mode 100755
index 598cb8f..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/js/job/modify_job.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-$(function() {
-    validate();
-    submitConfirm("put", "/api/job/update", $("#data-update-job"));
-});
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/AdminLTE/css/AdminLTE.min.css b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/AdminLTE/css/AdminLTE.min.css
deleted file mode 100755
index c562d61..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/AdminLTE/css/AdminLTE.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- *   AdminLTE v2.3.0
- *   Author: Almsaeed Studio
- *	 Website: Almsaeed Studio <http://almsaeedstudio.com>
- *   License: Open source - MIT
- *           Please visit http://opensource.org/licenses/MIT for more information
-!*/html,body{min-height:100%}.layout-boxed html,.layout-boxed body{height:100%}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:'Source Sans Pro','Helvetica Neue',Helvetica,Arial,sans-serif;font-weight:400;overflow-x:hidden;overflow-y:auto}.wrapper{min-height:100%;position:static;overflow:hidden}.wrapper:before,.wrapper:after{content:" ";display:table}.wrapper:after{clear:both}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-s [...]
\ No newline at end of file
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/AdminLTE/css/skins/_all-skins.min.css b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/AdminLTE/css/skins/_all-skins.min.css
deleted file mode 100755
index 1710db5..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/AdminLTE/css/skins/_all-skins.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.s [...]
\ No newline at end of file
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/AdminLTE/js/app.min.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/AdminLTE/js/app.min.js
deleted file mode 100755
index 679f18f..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/AdminLTE/js/app.min.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*! AdminLTE app.js
- * ================
- * Main JS application file for AdminLTE v2. This file
- * should be included in all pages. It controls some layout
- * options and implements exclusive AdminLTE plugins.
- *
- * @Author  Almsaeed Studio
- * @Support <http://www.almsaeedstudio.com>
- * @Email   <su...@almsaeedstudio.com>
- * @version 2.3.0
- * @license MIT <http://opensource.org/licenses/MIT>
- */
-function _init(){"use strict";$.AdminLTE.layout={activate:function(){var a=this;a.fix(),a.fixSidebar(),$(window,".wrapper").resize(function(){a.fix(),a.fixSidebar()})},fix:function(){var a=$(".main-header").outerHeight()+$(".main-footer").outerHeight(),b=$(window).height(),c=$(".sidebar").height();if($("body").hasClass("fixed"))$(".content-wrapper, .right-side").css("min-height",b-$(".main-footer").outerHeight());else{var d;b>=c?($(".content-wrapper, .right-side").css("min-height",b-a),d [...]
\ No newline at end of file
diff --git a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/BootstrapValidator/js/bootstrapValidator.js b/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/BootstrapValidator/js/bootstrapValidator.js
deleted file mode 100755
index 717cb47..0000000
--- a/elasticjob-cloud/elasticjob-cloud-scheduler/src/main/resources/console/lib/BootstrapValidator/js/bootstrapValidator.js
+++ /dev/null
@@ -1,7823 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-if (typeof jQuery === 'undefined') {
-    throw new Error('BootstrapValidator\'s JavaScript requires jQuery');
-}
-
-(function($) {
-    var BootstrapValidator = function(form, options) {
-        this.$form   = $(form);
-        this.options = $.extend({}, $.fn.bootstrapValidator.DEFAULT_OPTIONS, options);
-
-        this.$invalidFields = $([]);    // Array of invalid fields
-        this.$submitButton  = null;     // The submit button which is clicked to submit form
-        this.$hiddenButton  = null;
-
-        // Validating status
-        this.STATUS_NOT_VALIDATED = 'NOT_VALIDATED';
-        this.STATUS_VALIDATING    = 'VALIDATING';
-        this.STATUS_INVALID       = 'INVALID';
-        this.STATUS_VALID         = 'VALID';
-
-        // Determine the event that is fired when user change the field value
-        // Most modern browsers supports input event except IE 7, 8.
-        // IE 9 supports input event but the event is still not fired if I press the backspace key.
-        // Get IE version
-        // https://gist.github.com/padolsey/527683/#comment-7595
-        var ieVersion = (function() {
-            var v = 3, div = document.createElement('div'), a = div.all || [];
-            while (div.innerHTML = '<!--[if gt IE '+(++v)+']><br><![endif]-->', a[0]) {}
-            return v > 4 ? v : !v;
-        }());
-
-        var el = document.createElement('div');
-        this._changeEvent = (ieVersion === 9 || !('oninput' in el)) ? 'keyup' : 'input';
-
-        // The flag to indicate that the form is ready to submit when a remote/callback validator returns
-        this._submitIfValid = null;
-
-        // Field elements
-        this._cacheFields = {};
-
-        this._init();
-    };
-
-    BootstrapValidator.prototype = {
-        constructor: BootstrapValidator,
-
-        /**
-         * Init form
-         */
-        _init: function() {
-            var that    = this,
-                options = {
-                    container:      this.$form.attr('data-bv-container'),
-                    events: {
-                        formInit:         this.$form.attr('data-bv-events-form-init'),
-                        formError:        this.$form.attr('data-bv-events-form-error'),
-                        formSuccess:      this.$form.attr('data-bv-events-form-success'),
-                        fieldAdded:       this.$form.attr('data-bv-events-field-added'),
-                        fieldRemoved:     this.$form.attr('data-bv-events-field-removed'),
-                        fieldInit:        this.$form.attr('data-bv-events-field-init'),
-                        fieldError:       this.$form.attr('data-bv-events-field-error'),
-                        fieldSuccess:     this.$form.attr('data-bv-events-field-success'),
-                        fieldStatus:      this.$form.attr('data-bv-events-field-status'),
-                        validatorError:   this.$form.attr('data-bv-events-validator-error'),
-                        validatorSuccess: this.$form.attr('data-bv-events-validator-success')
-                    },
-                    excluded:       this.$form.attr('data-bv-excluded'),
-                    feedbackIcons: {
-                        valid:      this.$form.attr('data-bv-feedbackicons-valid'),
-                        invalid:    this.$form.attr('data-bv-feedbackicons-invalid'),
-                        validating: this.$form.attr('data-bv-feedbackicons-validating')
-                    },
-                    group:          this.$form.attr('data-bv-group'),
-                    live:           this.$form.attr('data-bv-live'),
-                    message:        this.$form.attr('data-bv-message'),
-                    onError:        this.$form.attr('data-bv-onerror'),
-                    onSuccess:      this.$form.attr('data-bv-onsuccess'),
-                    submitButtons:  this.$form.attr('data-bv-submitbuttons'),
-                    threshold:      this.$form.attr('data-bv-threshold'),
-                    trigger:        this.$form.attr('data-bv-trigger'),
-                    verbose:        this.$form.attr('data-bv-verbose'),
-                    fields:         {}
-                };
-
-            this.$form
-                // Disable client side validation in HTML 5
-                .attr('novalidate', 'novalidate')
-                .addClass(this.options.elementClass)
-                // Disable the default submission first
-                .on('submit.bv', function(e) {
-                    e.preventDefault();
-                    that.validate();
-                })
-                .on('click.bv', this.options.submitButtons, function() {
-                    that.$submitButton  = $(this);
-					// The user just click the submit button
-					that._submitIfValid = true;
-                })
-                // Find all fields which have either "name" or "data-bv-field" attribute
-                .find('[name], [data-bv-field]')
-                    .each(function() {
-                        var $field = $(this),
-                            field  = $field.attr('name') || $field.attr('data-bv-field'),
-                            opts   = that._parseOptions($field);
-                        if (opts) {
-                            $field.attr('data-bv-field', field);
-                            options.fields[field] = $.extend({}, opts, options.fields[field]);
-                        }
-                    });
-
-            this.options = $.extend(true, this.options, options);
-
-            // When pressing Enter on any field in the form, the first submit button will do its job.
-            // The form then will be submitted.
-            // I create a first hidden submit button
-            this.$hiddenButton = $('<button/>')
-                                    .attr('type', 'submit')
-                                    .prependTo(this.$form)
-                                    .addClass('bv-hidden-submit')
-                                    .css({ display: 'none', width: 0, height: 0 });
-
-            this.$form
-                .on('click.bv', '[type="submit"]', function(e) {
-                    // #746: Check if the button click handler returns false
-                    if (!e.isDefaultPrevented()) {
-                        var $target = $(e.target),
-                            // The button might contain HTML tag
-                            $button = $target.is('[type="submit"]') ? $target.eq(0) : $target.parent('[type="submit"]').eq(0);
-
-                        // Don't perform validation when clicking on the submit button/input
-                        // which aren't defined by the 'submitButtons' option
-                        if (that.options.submitButtons && !$button.is(that.options.submitButtons) && !$button.is(that.$hiddenButton)) {
-                            that.$form.off('submit.bv').submit();
-                        }
-                    }
-                });
-
-            for (var field in this.options.fields) {
-                this._initField(field);
-            }
-
-            this.$form.trigger($.Event(this.options.events.formInit), {
-                bv: this,
-                options: this.options
-            });
-
-            // Prepare the events
-            if (this.options.onSuccess) {
-                this.$form.on(this.options.events.formSuccess, function(e) {
-                    $.fn.bootstrapValidator.helpers.call(that.options.onSuccess, [e]);
-                });
-            }
-            if (this.options.onError) {
-                this.$form.on(this.options.events.formError, function(e) {
-                    $.fn.bootstrapValidator.helpers.call(that.options.onError, [e]);
-                });
-            }
-        },
-
-        /**
-         * Parse the validator options from HTML attributes
-         *
-         * @param {jQuery} $field The field element
-         * @returns {Object}
-         */
-        _parseOptions: function($field) {
-            var field      = $field.attr('name') || $field.attr('data-bv-field'),
-                validators = {},
-                validator,
-                v,          // Validator name
-                enabled,
-                optionName,
-                optionValue,
-                html5AttrName,
-                html5AttrMap;
-
-            for (v in $.fn.bootstrapValidator.validators) {
-                validator    = $.fn.bootstrapValidator.validators[v];
-                enabled      = $field.attr('data-bv-' + v.toLowerCase()) + '';
-                html5AttrMap = ('function' === typeof validator.enableByHtml5) ? validator.enableByHtml5($field) : null;
-
-                if ((html5AttrMap && enabled !== 'false')
-                    || (html5AttrMap !== true && ('' === enabled || 'true' === enabled)))
-                {
-                    // Try to parse the options via attributes
-                    validator.html5Attributes = $.extend({}, { message: 'message', onerror: 'onError', onsuccess: 'onSuccess' }, validator.html5Attributes);
-                    validators[v] = $.extend({}, html5AttrMap === true ? {} : html5AttrMap, validators[v]);
-
-                    for (html5AttrName in validator.html5Attributes) {
-                        optionName  = validator.html5Attributes[html5AttrName];
-                        optionValue = $field.attr('data-bv-' + v.toLowerCase() + '-' + html5AttrName);
-                        if (optionValue) {
-                            if ('true' === optionValue) {
-                                optionValue = true;
-                            } else if ('false' === optionValue) {
-                                optionValue = false;
-                            }
-                            validators[v][optionName] = optionValue;
-                        }
-                    }
-                }
-            }
-
-            var opts = {
-                    container:     $field.attr('data-bv-container'),
-                    excluded:      $field.attr('data-bv-excluded'),
-                    feedbackIcons: $field.attr('data-bv-feedbackicons'),
-                    group:         $field.attr('data-bv-group'),
-                    message:       $field.attr('data-bv-message'),
-                    onError:       $field.attr('data-bv-onerror'),
-                    onStatus:      $field.attr('data-bv-onstatus'),
-                    onSuccess:     $field.attr('data-bv-onsuccess'),
-                    selector:      $field.attr('data-bv-selector'),
-                    threshold:     $field.attr('data-bv-threshold'),
-                    trigger:       $field.attr('data-bv-trigger'),
-                    verbose:       $field.attr('data-bv-verbose'),
-                    validators:    validators
-                },
-                emptyOptions    = $.isEmptyObject(opts),        // Check if the field options are set using HTML attributes
-                emptyValidators = $.isEmptyObject(validators);  // Check if the field validators are set using HTML attributes
-
-            if (!emptyValidators || (!emptyOptions && this.options.fields && this.options.fields[field])) {
-                opts.validators = validators;
-                return opts;
-            } else {
-                return null;
-            }
-        },
-
-        /**
-         * Init field
-         *
-         * @param {String|jQuery} field The field name or field element
-         */
-        _initField: function(field) {
-            var fields = $([]);
-            switch (typeof field) {
-                case 'object':
-                    fields = field;
-                    field  = field.attr('data-bv-field');
-                    break;
-                case 'string':
-                    fields = this.getFieldElements(field);
-                    fields.attr('data-bv-field', field);
-                    break;
-                default:
-                    break;
-            }
-
-            // We don't need to validate non-existing fields
-            if (fields.length === 0) {
-                return;
-            }
-
-            if (this.options.fields[field] === null || this.options.fields[field].validators === null) {
-                return;
-            }
-
-            var validatorName;
-            for (validatorName in this.options.fields[field].validators) {
-                if (!$.fn.bootstrapValidator.validators[validatorName]) {
-                    delete this.options.fields[field].validators[validatorName];
-                }
-            }
-            if (this.options.fields[field].enabled === null) {
-                this.options.fields[field].enabled = true;
-            }
-
-            var that      = this,
-                total     = fields.length,
-                type      = fields.attr('type'),
-                updateAll = (total === 1) || ('radio' === type) || ('checkbox' === type),
-                event     = ('radio' === type || 'checkbox' === type || 'file' === type || 'SELECT' === fields.eq(0).get(0).tagName) ? 'change' : this._changeEvent,
-                trigger   = (this.options.fields[field].trigger || this.options.trigger || event).split(' '),
-                events    = $.map(trigger, function(item) {
-                    return item + '.update.bv';
-                }).join(' ');
-
-            for (var i = 0; i < total; i++) {
-                var $field    = fields.eq(i),
-                    group     = this.options.fields[field].group || this.options.group,
-                    $parent   = $field.parents(group),
-                    // Allow user to indicate where the error messages are shown
-                    container = ('function' === typeof (this.options.fields[field].container || this.options.container)) ? (this.options.fields[field].container || this.options.container).call(this, $field, this) : (this.options.fields[field].container || this.options.container),
-                    $message  = (container && container !== 'tooltip' && container !== 'popover') ? $(container) : this._getMessageContainer($field, group);
-
-                if (container && container !== 'tooltip' && container !== 'popover') {
-                    $message.addClass('has-error');
-                }
-
-                // Remove all error messages and feedback icons
-                $message.find('.help-block[data-bv-validator][data-bv-for="' + field + '"]').remove();
-                $parent.find('i[data-bv-icon-for="' + field + '"]').remove();
-
-                // Whenever the user change the field value, mark it as not validated yet
-                $field.off(events).on(events, function() {
-                    that.updateStatus($(this), that.STATUS_NOT_VALIDATED);
-                });
-                
-                // Create help block elements for showing the error messages
-                $field.data('bv.messages', $message);
-                for (validatorName in this.options.fields[field].validators) {
-                    $field.data('bv.result.' + validatorName, this.STATUS_NOT_VALIDATED);
-
-                    if (!updateAll || i === total - 1) {
-                        $('<small/>')
-                            .css('display', 'none')
-                            .addClass('help-block')
-                            .attr('data-bv-validator', validatorName)
-                            .attr('data-bv-for', field)
-                            .attr('data-bv-result', this.STATUS_NOT_VALIDATED)
-                            .html(this._getMessage(field, validatorName))
-                            .appendTo($message);
-                    }
-
-                    // Init the validator
-                    if ('function' === typeof $.fn.bootstrapValidator.validators[validatorName].init) {
-                        $.fn.bootstrapValidator.validators[validatorName].init(this, $field, this.options.fields[field].validators[validatorName]);
-                    }
-                }
-
-                // Prepare the feedback icons
-                // Available from Bootstrap 3.1 (http://getbootstrap.com/css/#forms-control-validation)
-                if (this.options.fields[field].feedbackIcons !== false && this.options.fields[field].feedbackIcons !== 'false'
-                    && this.options.feedbackIcons
-                    && this.options.feedbackIcons.validating && this.options.feedbackIcons.invalid && this.options.feedbackIcons.valid
-                    && (!updateAll || i === total - 1))
-                {
-                    // $parent.removeClass('has-success').removeClass('has-error').addClass('has-feedback');
-                    // Keep error messages which are populated from back-end
-                    $parent.addClass('has-feedback');
-                    var $icon = $('<i/>')
-                                    .css('display', 'none')
-                                    .addClass('form-control-feedback')
-                                    .attr('data-bv-icon-for', field)
-                                    .insertAfter($field);
-
-                    // Place it after the container of checkbox/radio
-                    // so when clicking the icon, it doesn't effect to the checkbox/radio element
-                    if ('checkbox' === type || 'radio' === type) {
-                        var $fieldParent = $field.parent();
-                        if ($fieldParent.hasClass(type)) {
-                            $icon.insertAfter($fieldParent);
-                        } else if ($fieldParent.parent().hasClass(type)) {
-                            $icon.insertAfter($fieldParent.parent());
-                        }
-                    }
-
-                    // The feedback icon does not render correctly if there is no label
-                    // https://github.com/twbs/bootstrap/issues/12873
-                    if ($parent.find('label').length === 0) {
-                        $icon.addClass('bv-no-label');
-                    }
-                    // Fix feedback icons in input-group
-                    if ($parent.find('.input-group').length !== 0) {
-                        $icon.addClass('bv-icon-input-group')
-                             .insertAfter($parent.find('.input-group').eq(0));
-                    }
-                    
-                    if (container) {
-                        $field
-                            // Show tooltip/popover message when field gets focus
-                            .off('focus.bv')
-                            .on('focus.bv', function() {
-                                switch (container) {
-                                    case 'tooltip':
-                                        $icon.tooltip('show');
-                                        break;
-                                    case 'popover':
-                                        $icon.popover('show');
-                                        break;
-                                    default:
-                                        break;
-                                }
-                            })
-                            // and hide them when losing focus
-                            .off('blur.bv')
-                            .on('blur.bv', function() {
-                                switch (container) {
-                                    case 'tooltip':
-                                        $icon.tooltip('hide');
-                                        break;
-                                    case 'popover':
-                                        $icon.popover('hide');
-                                        break;
-                                    default:
-                                        break;
-                                }
-                            });
-                    }
-                }
-            }
-
-            // Prepare the events
-            fields
-                .on(this.options.events.fieldSuccess, function(e, data) {
-                    var onSuccess = that.getOptions(data.field, null, 'onSuccess');
-                    if (onSuccess) {
-                        $.fn.bootstrapValidator.helpers.call(onSuccess, [e, data]);
-                    }
-                })
-                .on(this.options.events.fieldError, function(e, data) {
-                    var onError = that.getOptions(data.field, null, 'onError');
-                    if (onError) {
-                        $.fn.bootstrapValidator.helpers.call(onError, [e, data]);
-                    }
-                })
-                .on(this.options.events.fieldStatus, function(e, data) {
-                    var onStatus = that.getOptions(data.field, null, 'onStatus');
-                    if (onStatus) {
-                        $.fn.bootstrapValidator.helpers.call(onStatus, [e, data]);
-                    }
-                })
-                .on(this.options.events.validatorError, function(e, data) {
-                    var onError = that.getOptions(data.field, data.validator, 'onError');
-                    if (onError) {
-                        $.fn.bootstrapValidator.helpers.call(onError, [e, data]);
-                    }
-                })
-                .on(this.options.events.validatorSuccess, function(e, data) {
-                    var onSuccess = that.getOptions(data.field, data.validator, 'onSuccess');
-                    if (onSuccess) {
-                        $.fn.bootstrapValidator.helpers.call(onSuccess, [e, data]);
-                    }
-                });
-
-            // Set live mode
-            events = $.map(trigger, function(item) {
-                return item + '.live.bv';
-            }).join(' ');
-            switch (this.options.live) {
-                case 'submitted':
-                    break;
-                case 'disabled':
-                    fields.off(events);
-                    break;
-                case 'enabled':
-                /* falls through */
-                default:
-                    fields.off(events).on(events, function() {
-                        if (that._exceedThreshold($(this))) {
-                            that.validateField($(this));
-                        }
-                    });
-                    break;
-            }
-
-            fields.trigger($.Event(this.options.events.fieldInit), {
-                bv: this,
-                field: field,
-                element: fields
-            });
-        },
-
-        /**
-         * Get the error message for given field and validator
-         *
-         * @param {String} field The field name
-         * @param {String} validatorName The validator name
-         * @returns {String}
-         */
-        _getMessage: function(field, validatorName) {
-            if (!this.options.fields[field] || !$.fn.bootstrapValidator.validators[validatorName]
-                || !this.options.fields[field].validators || !this.options.fields[field].validators[validatorName])
-            {
-                return '';
-            }
-
-            var options = this.options.fields[field].validators[validatorName];
-            switch (true) {
-                case (!!options.message):
-                    return options.message;
-                case (!!this.options.fields[field].message):
-                    return this.options.fields[field].message;
-                case (!!$.fn.bootstrapValidator.i18n[validatorName]):
-                    return $.fn.bootstrapValidator.i18n[validatorName]['default'];
-                default:
-                    return this.options.message;
-            }
-        },
-
-        /**
-         * Get the element to place the error messages
-         *
-         * @param {jQuery} $field The field element
-         * @param {String} group
-         * @returns {jQuery}
-         */
-        _getMessageContainer: function($field, group) {
-            var $parent = $field.parent();
-            if ($parent.is(group)) {
-                return $parent;
-            }
-
-            var cssClasses = $parent.attr('class');
-            if (!cssClasses) {
-                return this._getMessageContainer($parent, group);
-            }
-
-            cssClasses = cssClasses.split(' ');
-            var n = cssClasses.length;
-            for (var i = 0; i < n; i++) {
-                if (/^col-(xs|sm|md|lg)-\d+$/.test(cssClasses[i]) || /^col-(xs|sm|md|lg)-offset-\d+$/.test(cssClasses[i])) {
-                    return $parent;
-                }
-            }
-
-            return this._getMessageContainer($parent, group);
-        },
-
-        /**
-         * Called when all validations are completed
-         */
-        _submit: function() {
-            var isValid   = this.isValid(),
-                eventType = isValid ? this.options.events.formSuccess : this.options.events.formError,
-                e         = $.Event(eventType);
-
-            this.$form.trigger(e);
-
-            // Call default handler
-            // Check if whether the submit button is clicked
-            if (this.$submitButton) {
-                isValid ? this._onSuccess(e) : this._onError(e);
-            }
-        },
-
-        /**
-         * Check if the field is excluded.
-         * Returning true means that the field will not be validated
-         *
-         * @param {jQuery} $field The field element
-         * @returns {Boolean}
-         */
-        _isExcluded: function($field) {
-            var excludedAttr = $field.attr('data-bv-excluded'),
-                // I still need to check the 'name' attribute while initializing the field
-                field        = $field.attr('data-bv-field') || $field.attr('name');
-
-            switch (true) {
-                case (!!field && this.options.fields && this.options.fields[field] && (this.options.fields[field].excluded === 'true' || this.options.fields[field].excluded === true)):
-                case (excludedAttr === 'true'):
-                case (excludedAttr === ''):
-                    return true;
-
-                case (!!field && this.options.fields && this.options.fields[field] && (this.options.fields[field].excluded === 'false' || this.options.fields[field].excluded === false)):
-                case (excludedAttr === 'false'):
-                    return false;
-
-                default:
-                    if (this.options.excluded) {
-                        // Convert to array first
-                        if ('string' === typeof this.options.excluded) {
-                            this.options.excluded = $.map(this.options.excluded.split(','), function(item) {
-                                // Trim the spaces
-                                return $.trim(item);
-                            });
-                        }
-
-                        var length = this.options.excluded.length;
-                        for (var i = 0; i < length; i++) {
-                            if (('string' === typeof this.options.excluded[i] && $field.is(this.options.excluded[i]))
-                                || ('function' === typeof this.options.excluded[i] && this.options.excluded[i].call(this, $field, this) === true))
-                            {
-                                return true;
-                            }
-                        }
-                    }
-                    return false;
-            }
-        },
-
-        /**
-         * Check if the number of characters of field value exceed the threshold or not
-         *
-         * @param {jQuery} $field The field element
-         * @returns {Boolean}
-         */
-        _exceedThreshold: function($field) {
-            var field     = $field.attr('data-bv-field'),
-                threshold = this.options.fields[field].threshold || this.options.threshold;
-            if (!threshold) {
-                return true;
-            }
-            var cannotType = $.inArray($field.attr('type'), ['button', 'checkbox', 'file', 'hidden', 'image', 'radio', 'reset', 'submit']) !== -1;
-            return (cannotType || $field.val().length >= threshold);
-        },
-        
-        // ---
-        // Events
-        // ---
-
-        /**
-         * The default handler of error.form.bv event.
-         * It will be called when there is a invalid field
-         *
-         * @param {jQuery.Event} e The jQuery event object
-         */
-        _onError: function(e) {
-            if (e.isDefaultPrevented()) {
-                return;
-            }
-
-            if ('submitted' === this.options.live) {
-                // Enable live mode
-                this.options.live = 'enabled';
-                var that = this;
-                for (var field in this.options.fields) {
-                    (function(f) {
-                        var fields  = that.getFieldElements(f);
-                        if (fields.length) {
-                            var type    = $(fields[0]).attr('type'),
-                                event   = ('radio' === type || 'checkbox' === type || 'file' === type || 'SELECT' === $(fields[0]).get(0).tagName) ? 'change' : that._changeEvent,
-                                trigger = that.options.fields[field].trigger || that.options.trigger || event,
-                                events  = $.map(trigger.split(' '), function(item) {
-                                    return item + '.live.bv';
-                                }).join(' ');
-
-                            fields.off(events).on(events, function() {
-                                if (that._exceedThreshold($(this))) {
-                                    that.validateField($(this));
-                                }
-                            });
-                        }
-                    })(field);
-                }
-            }
-
-            var $invalidField = this.$invalidFields.eq(0);
-            if ($invalidField) {
-                // Activate the tab containing the invalid field if exists
-                var $tabPane = $invalidField.parents('.tab-pane'), tabId;
-                if ($tabPane && (tabId = $tabPane.attr('id'))) {
-                    $('a[href="#' + tabId + '"][data-toggle="tab"]').tab('show');
-                }
-
-                // Focus to the first invalid field
-                $invalidField.focus();
-            }
-        },
-
-        /**
-         * The default handler of success.form.bv event.
-         * It will be called when all the fields are valid
-         *
-         * @param {jQuery.Event} e The jQuery event object
-         */
-        _onSuccess: function(e) {
-            if (e.isDefaultPrevented()) {
-                return;
-            }
-
-            // Submit the form
-            this.disableSubmitButtons(true).defaultSubmit();
-        },
-
-        /**
-         * Called after validating a field element
-         *
-         * @param {jQuery} $field The field element
-         * @param {String} [validatorName] The validator name
-         */
-        _onFieldValidated: function($field, validatorName) {
-            var field         = $field.attr('data-bv-field'),
-                validators    = this.options.fields[field].validators,
-                counter       = {},
-                numValidators = 0,
-                data          = {
-                    bv: this,
-                    field: field,
-                    element: $field,
-                    validator: validatorName,
-                    result: $field.data('bv.response.' + validatorName)
-                };
-
-            // Trigger an event after given validator completes
-            if (validatorName) {
-                switch ($field.data('bv.result.' + validatorName)) {
-                    case this.STATUS_INVALID:
-                        $field.trigger($.Event(this.options.events.validatorError), data);
-                        break;
-                    case this.STATUS_VALID:
-                        $field.trigger($.Event(this.options.events.validatorSuccess), data);
-                        break;
-                    default:
-                        break;
-                }
-            }
-
-            counter[this.STATUS_NOT_VALIDATED] = 0;
-            counter[this.STATUS_VALIDATING]    = 0;
-            counter[this.STATUS_INVALID]       = 0;
-            counter[this.STATUS_VALID]         = 0;
-
-            for (var v in validators) {
-                if (validators[v].enabled === false) {
-                    continue;
-                }
-
-                numValidators++;
-                var result = $field.data('bv.result.' + v);
-                if (result) {
-                    counter[result]++;
-                }
-            }
-
-            if (counter[this.STATUS_VALID] === numValidators) {
-                // Remove from the list of invalid fields
-                this.$invalidFields = this.$invalidFields.not($field);
-
-                $field.trigger($.Event(this.options.events.fieldSuccess), data);
-            }
-            // If all validators are completed and there is at least one validator which doesn't pass
-            else if (counter[this.STATUS_NOT_VALIDATED] === 0 && counter[this.STATUS_VALIDATING] === 0 && counter[this.STATUS_INVALID] > 0) {
-                // Add to the list of invalid fields
-                this.$invalidFields = this.$invalidFields.add($field);
-
-                $field.trigger($.Event(this.options.events.fieldError), data);
-            }
-        },
-
-        // ---
-        // Public methods
-        // ---
-
-        /**
-         * Retrieve the field elements by given name
-         *
-         * @param {String} field The field name
-         * @returns {null|jQuery[]}
-         */
-        getFieldElements: function(field) {
-            if (!this._cacheFields[field]) {
-                this._cacheFields[field] = (this.options.fields[field] && this.options.fields[field].selector)
-                                         ? $(this.options.fields[field].selector)
-                                         : this.$form.find('[name="' + field + '"]');
-            }
-
-            return this._cacheFields[field];
-        },
-
-        /**
-         * Get the field options
-         *
-         * @param {String|jQuery} [field] The field name or field element. If it is not set, the method returns the form options
-         * @param {String} [validator] The name of validator. It null, the method returns form options
-         * @param {String} [option] The option name
-         * @return {String|Object}
-         */
-        getOptions: function(field, validator, option) {
-            if (!field) {
-                return this.options;
-            }
-            if ('object' === typeof field) {
-                field = field.attr('data-bv-field');
-            }
-            if (!this.options.fields[field]) {
-                return null;
-            }
-
-            var options = this.options.fields[field];
-            if (!validator) {
-                return option ? options[option] : options;
-            }
-            if (!options.validators || !options.validators[validator]) {
-                return null;
-            }
-
-            return option ? options.validators[validator][option] : options.validators[validator];
-        },
-
-
-        /**
-         * Disable/enable submit buttons
-         *
-         * @param {Boolean} disabled Can be true or false
-         * @returns {BootstrapValidator}
-         */
-        disableSubmitButtons: function(disabled) {
-            if (!disabled) {
-                this.$form.find(this.options.submitButtons).removeAttr('disabled');
-            } else if (this.options.live !== 'disabled') {
-                // Don't disable if the live validating mode is disabled
-                this.$form.find(this.options.submitButtons).attr('disabled', 'disabled');
-            }
-
-            return this;
-        },
-
-        /**
-         * Validate the form
-         *
-         * @returns {BootstrapValidator}
-         */
-        validate: function() {
-            if (!this.options.fields) {
-                return this;
-            }
-            this.disableSubmitButtons(true);
-
-            for (var field in this.options.fields) {
-                this.validateField(field);
-            }
-
-            this._submit();
-
-            return this;
-        },
-
-        /**
-         * Validate given field
-         *
-         * @param {String|jQuery} field The field name or field element
-         * @returns {BootstrapValidator}
-         */
-        validateField: function(field) {
-            var fields = $([]);
-            switch (typeof field) {
-                case 'object':
-                    fields = field;
-                    field  = field.attr('data-bv-field');
-                    break;
-                case 'string':
-                    fields = this.getFieldElements(field);
-                    break;
-                default:
-                    break;
-            }
-
-            if (fields.length === 0 || (this.options.fields[field] && this.options.fields[field].enabled === false)) {
-                return this;
-            }
-
-            var that       = this,
-                type       = fields.attr('type'),
-                total      = ('radio' === type || 'checkbox' === type) ? 1 : fields.length,
-                updateAll  = ('radio' === type || 'checkbox' === type),
-                validators = this.options.fields[field].validators,
-                verbose    = this.options.fields[field].verbose === 'true' || this.options.fields[field].verbose === true || this.options.verbose === 'true' || this.options.verbose === true,
-                validatorName,
-                validateResult;
-
-            for (var i = 0; i < total; i++) {
-                var $field = fields.eq(i);
-                if (this._isExcluded($field)) {
-                    continue;
-                }
-
-                var stop = false;
-                for (validatorName in validators) {
-                    if ($field.data('bv.dfs.' + validatorName)) {
-                        $field.data('bv.dfs.' + validatorName).reject();
-                    }
-                    if (stop) {
-                        break;
-                    }
-
-                    // Don't validate field if it is already done
-                    var result = $field.data('bv.result.' + validatorName);
-                    if (result === this.STATUS_VALID || result === this.STATUS_INVALID) {
-                        this._onFieldValidated($field, validatorName);
-                        continue;
-                    } else if (validators[validatorName].enabled === false) {
-                        this.updateStatus(updateAll ? field : $field, this.STATUS_VALID, validatorName);
-                        continue;
-                    }
-
-                    $field.data('bv.result.' + validatorName, this.STATUS_VALIDATING);
-                    validateResult = $.fn.bootstrapValidator.validators[validatorName].validate(this, $field, validators[validatorName]);
-
-                    // validateResult can be a $.Deferred object ...
-                    if ('object' === typeof validateResult && validateResult.resolve) {
-                        this.updateStatus(updateAll ? field : $field, this.STATUS_VALIDATING, validatorName);
-                        $field.data('bv.dfs.' + validatorName, validateResult);
-
-                        validateResult.done(function($f, v, response) {
-                            // v is validator name
-                            $f.removeData('bv.dfs.' + v).data('bv.response.' + v, response);
-                            if (response.message) {
-                                that.updateMessage($f, v, response.message);
-                            }
-
-                            that.updateStatus(updateAll ? $f.attr('data-bv-field') : $f, response.valid ? that.STATUS_VALID : that.STATUS_INVALID, v);
-
-                            if (response.valid && that._submitIfValid === true) {
-                                // If a remote validator returns true and the form is ready to submit, then do it
-                                that._submit();
-                            } else if (!response.valid && !verbose) {
-                                stop = true;
-                            }
-                        });
-                    }
-                    // ... or object { valid: true/false, message: 'dynamic message' }
-                    else if ('object' === typeof validateResult && validateResult.valid !== undefined && validateResult.message !== undefined) {
-                        $field.data('bv.response.' + validatorName, validateResult);
-                        this.updateMessage(updateAll ? field : $field, validatorName, validateResult.message);
-                        this.updateStatus(updateAll ? field : $field, validateResult.valid ? this.STATUS_VALID : this.STATUS_INVALID, validatorName);
-                        if (!validateResult.valid && !verbose) {
-                            break;
-                        }
-                    }
-                    // ... or a boolean value
-                    else if ('boolean' === typeof validateResult) {
-                        $field.data('bv.response.' + validatorName, validateResult);
-                        this.updateStatus(updateAll ? field : $field, validateResult ? this.STATUS_VALID : this.STATUS_INVALID, validatorName);
-                        if (!validateResult && !verbose) {
-                            break;
-                        }
-                    }
-                }
-            }
-
-            return this;
-        },
-
-        /**
-         * Update the error message
-         *
-         * @param {String|jQuery} field The field name or field element
-         * @param {String} validator The validator name
-         * @param {String} message The message
-         * @returns {BootstrapValidator}
-         */
-        updateMessage: function(field, validator, message) {
-            var $fields = $([]);
-            switch (typeof field) {
-                case 'object':
-                    $fields = field;
-                    field   = field.attr('data-bv-field');
-                    break;
-                case 'string':
-                    $fields = this.getFieldElements(field);
-                    break;
-                default:
-                    break;
-            }
-
-            $fields.each(function() {
-                $(this).data('bv.messages').find('.help-block[data-bv-validator="' + validator + '"][data-bv-for="' + field + '"]').html(message);
-            });
-        },
-        
-        /**
-         * Update all validating results of field
-         *
-         * @param {String|jQuery} field The field name or field element
-         * @param {String} status The status. Can be 'NOT_VALIDATED', 'VALIDATING', 'INVALID' or 'VALID'
-         * @param {String} [validatorName] The validator name. If null, the method updates validity result for all validators
-         * @returns {BootstrapValidator}
-         */
-        updateStatus: function(field, status, validatorName) {
-            var fields = $([]);
-            switch (typeof field) {
-                case 'object':
-                    fields = field;
-                    field  = field.attr('data-bv-field');
-                    break;
-                case 'string':
-                    fields = this.getFieldElements(field);
-                    break;
-                default:
-                    break;
-            }
-
-            if (status === this.STATUS_NOT_VALIDATED) {
-                // Reset the flag
-                this._submitIfValid = false;
-            }
-
-            var that  = this,
-                type  = fields.attr('type'),
-                group = this.options.fields[field].group || this.options.group,
-                total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length;
-
-            for (var i = 0; i < total; i++) {
-                var $field       = fields.eq(i);
-                if (this._isExcluded($field)) {
-                    continue;
-                }
-
-                var $parent      = $field.parents(group),
-                    $message     = $field.data('bv.messages'),
-                    $allErrors   = $message.find('.help-block[data-bv-validator][data-bv-for="' + field + '"]'),
-                    $errors      = validatorName ? $allErrors.filter('[data-bv-validator="' + validatorName + '"]') : $allErrors,
-                    $icon        = $parent.find('.form-control-feedback[data-bv-icon-for="' + field + '"]'),
-                    container    = ('function' === typeof (this.options.fields[field].container || this.options.container)) ? (this.options.fields[field].container || this.options.container).call(this, $field, this) : (this.options.fields[field].container || this.options.container),
-                    isValidField = null;
-
-                // Update status
-                if (validatorName) {
-                    $field.data('bv.result.' + validatorName, status);
-                } else {
-                    for (var v in this.options.fields[field].validators) {
-                        $field.data('bv.result.' + v, status);
-                    }
-                }
-
-                // Show/hide error elements and feedback icons
-                $errors.attr('data-bv-result', status);
-
-                // Determine the tab containing the element
-                var $tabPane = $field.parents('.tab-pane'),
-                    tabId, $tab;
-                if ($tabPane && (tabId = $tabPane.attr('id'))) {
-                    $tab = $('a[href="#' + tabId + '"][data-toggle="tab"]').parent();
-                }
-
-                switch (status) {
-                    case this.STATUS_VALIDATING:
-                        isValidField = null;
-                        this.disableSubmitButtons(true);
-                        $parent.removeClass('has-success').removeClass('has-error');
-                        if ($icon) {
-                            $icon.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).addClass(this.options.feedbackIcons.validating).show();
-                        }
-                        if ($tab) {
-                            $tab.removeClass('bv-tab-success').removeClass('bv-tab-error');
-                        }
-                        break;
-
-                    case this.STATUS_INVALID:
-                        isValidField = false;
-                        this.disableSubmitButtons(true);
-                        $parent.removeClass('has-success').addClass('has-error');
-                        if ($icon) {
-                            $icon.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.validating).addClass(this.options.feedbackIcons.invalid).show();
-                        }
-                        if ($tab) {
-                            $tab.removeClass('bv-tab-success').addClass('bv-tab-error');
-                        }
-                        break;
-
-                    case this.STATUS_VALID:
-                        // If the field is valid (passes all validators)
-                        isValidField = ($allErrors.filter('[data-bv-result="' + this.STATUS_NOT_VALIDATED +'"]').length === 0)
-                                     ? ($allErrors.filter('[data-bv-result="' + this.STATUS_VALID +'"]').length === $allErrors.length)  // All validators are completed
-                                     : null;                                                                                            // There are some validators that have not done
-                        if (isValidField !== null) {
-                            this.disableSubmitButtons(this.$submitButton ? !this.isValid() : !isValidField);
-                            if ($icon) {
-                                $icon
-                                    .removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).removeClass(this.options.feedbackIcons.valid)
-                                    .addClass(isValidField ? this.options.feedbackIcons.valid : this.options.feedbackIcons.invalid)
-                                    .show();
-                            }
-                        }
-
-                        $parent.removeClass('has-error has-success').addClass(this.isValidContainer($parent) ? 'has-success' : 'has-error');
-                        if ($tab) {
-                            $tab.removeClass('bv-tab-success').removeClass('bv-tab-error').addClass(this.isValidContainer($tabPane) ? 'bv-tab-success' : 'bv-tab-error');
-                        }
-                        break;
-
-                    case this.STATUS_NOT_VALIDATED:
-                    /* falls through */
-                    default:
-                        isValidField = null;
-                        this.disableSubmitButtons(false);
-                        $parent.removeClass('has-success').removeClass('has-error');
-                        if ($icon) {
-                            $icon.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).hide();
-                        }
-                        if ($tab) {
-                            $tab.removeClass('bv-tab-success').removeClass('bv-tab-error');
-                        }
-                        break;
-                }
-
-                switch (true) {
-                    // Only show the first error message if it is placed inside a tooltip ...
-                    case ($icon && 'tooltip' === container):
-                        (isValidField === false)
-                                ? $icon.css('cursor', 'pointer').tooltip('destroy').tooltip({
-                                    container: 'body',
-                                    html: true,
-                                    placement: 'top',
-                                    title: $allErrors.filter('[data-bv-result="' + that.STATUS_INVALID + '"]').eq(0).html()
-                                })
-                                : $icon.tooltip('hide');
-                        break;
-                    // ... or popover
-                    case ($icon && 'popover' === container):
-                        (isValidField === false)
-                                ? $icon.css('cursor', 'pointer').popover('destroy').popover({
-                                    container: 'body',
-                                    content: $allErrors.filter('[data-bv-result="' + that.STATUS_INVALID + '"]').eq(0).html(),
-                                    html: true,
-                                    placement: 'top',
-                                    trigger: 'hover click'
-                                })
-                                : $icon.popover('hide');
-                        break;
-                    default:
-                        (status === this.STATUS_INVALID) ? $errors.show() : $errors.hide();
-                        break;
-                }
-
-                // Trigger an event
-                $field.trigger($.Event(this.options.events.fieldStatus), {
-                    bv: this,
-                    field: field,
-                    element: $field,
-                    status: status
-                });
-                this._onFieldValidated($field, validatorName);
-            }
-
-            return this;
-        },
-
-        /**
-         * Check the form validity
-         *
-         * @returns {Boolean}
-         */
-        isValid: function() {
-            for (var field in this.options.fields) {
-                if (!this.isValidField(field)) {
-                    return false;
-                }
-            }
-
-            return true;
-        },
-
-        /**
-         * Check if the field is valid or not
-         *
-         * @param {String|jQuery} field The field name or field element
-         * @returns {Boolean}
-         */
-        isValidField: function(field) {
-            var fields = $([]);
-            switch (typeof field) {
-                case 'object':
-                    fields = field;
-                    field  = field.attr('data-bv-field');
-                    break;
-                case 'string':
-                    fields = this.getFieldElements(field);
-                    break;
-                default:
-                    break;
-            }
-            if (fields.length === 0 || this.options.fields[field] === null || this.options.fields[field].enabled === false) {
-                return true;
-            }
-
-            var type  = fields.attr('type'),
-                total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length,
-                $field, validatorName, status;
-            for (var i = 0; i < total; i++) {
-                $field = fields.eq(i);
-                if (this._isExcluded($field)) {
-                    continue;
-                }
-
-                for (validatorName in this.options.fields[field].validators) {
-                    if (this.options.fields[field].validators[validatorName].enabled === false) {
-                        continue;
-                    }
-
-                    status = $field.data('bv.result.' + validatorName);
-                    if (status !== this.STATUS_VALID) {
-                        return false;
-                    }
-                }
-            }
-
-            return true;
-        },
-
-        /**
-         * Check if all fields inside a given container are valid.
-         * It's useful when working with a wizard-like such as tab, collapse
-         *
-         * @param {String|jQuery} container The container selector or element
-         * @returns {Boolean}
-         */
-        isValidContainer: function(container) {
-            var that       = this,
-                map        = {},
-                $container = ('string' === typeof container) ? $(container) : container;
-            if ($container.length === 0) {
-                return true;
-            }
-
-            $container.find('[data-bv-field]').each(function() {
-                var $field = $(this),
-                    field  = $field.attr('data-bv-field');
-                if (!that._isExcluded($field) && !map[field]) {
-                    map[field] = $field;
-                }
-            });
-
-            for (var field in map) {
-                var $f = map[field];
-                if ($f.data('bv.messages')
-                      .find('.help-block[data-bv-validator][data-bv-for="' + field + '"]')
-                      .filter('[data-bv-result="' + this.STATUS_INVALID +'"]')
-                      .length > 0)
-                {
-                    return false;
-                }
-            }
-
-            return true;
-        },
-
-        /**
-         * Submit the form using default submission.
-         * It also does not perform any validations when submitting the form
-         */
-        defaultSubmit: function() {
-            if (this.$submitButton) {
-                // Create hidden input to send the submit buttons
-                $('<input/>')
-                    .attr('type', 'hidden')
-                    .attr('data-bv-submit-hidden', '')
-                    .attr('name', this.$submitButton.attr('name'))
-                    .val(this.$submitButton.val())
-                    .appendTo(this.$form);
-            }
-
-            // Submit form
-            this.$form.off('submit.bv').submit();
-        },
-
-        // ---
-        // Useful APIs which aren't used internally
-        // ---
-
-        /**
-         * Get the list of invalid fields
-         *
-         * @returns {jQuery[]}
-         */
-        getInvalidFields: function() {
-            return this.$invalidFields;
-        },
-
-        /**
-         * Returns the clicked submit button
-         *
-         * @returns {jQuery}
-         */
-        getSubmitButton: function() {
-            return this.$submitButton;
-        },
-
-        /**
-         * Get the error messages
-         *
-         * @param {String|jQuery} [field] The field name or field element
-         * If the field is not defined, the method returns all error messages of all fields
-         * @param {String} [validator] The name of validator
-         * If the validator is not defined, the method returns error messages of all validators
-         * @returns {String[]}
-         */
-        getMessages: function(field, validator) {
-            var that     = this,
-                messages = [],
-                $fields  = $([]);
-
-            switch (true) {
-                case (field && 'object' === typeof field):
-                    $fields = field;
-                    break;
-                case (field && 'string' === typeof field):
-                    var f = this.getFieldElements(field);
-                    if (f.length > 0) {
-                        var type = f.attr('type');
-                        $fields = ('radio' === type || 'checkbox' === type) ? f.eq(0) : f;
-                    }
-                    break;
-                default:
-                    $fields = this.$invalidFields;
-                    break;
-            }
-
-            var filter = validator ? '[data-bv-validator="' + validator + '"]' : '';
-            $fields.each(function() {
-                messages = messages.concat(
-                    $(this)
-                        .data('bv.messages')
-                        .find('.help-block[data-bv-for="' + $(this).attr('data-bv-field') + '"][data-bv-result="' + that.STATUS_INVALID + '"]' + filter)
-                        .map(function() {
-                            var v = $(this).attr('data-bv-validator'),
-                                f = $(this).attr('data-bv-for');
-                            return (that.options.fields[f].validators[v].enabled === false) ? '' : $(this).html();
-                        })
-                        .get()
-                );
-            });
-
-            return messages;
-        },
-
-        /**
-         * Update the option of a specific validator
-         *
-         * @param {String|jQuery} field The field name or field element
-         * @param {String} validator The validator name
-         * @param {String} option The option name
-         * @param {String} value The value to set
-         * @returns {BootstrapValidator}
-         */
-        updateOption: function(field, validator, option, value) {
-            if ('object' === typeof field) {
-                field = field.attr('data-bv-field');
-            }
-            if (this.options.fields[field] && this.options.fields[field].validators[validator]) {
-                this.options.fields[field].validators[validator][option] = value;
-                this.updateStatus(field, this.STATUS_NOT_VALIDATED, validator);
-            }
-
-            return this;
-        },
-
-        /**
-         * Add a new field
-         *
-         * @param {String|jQuery} field The field name or field element
-         * @param {Object} [options] The validator rules
-         * @returns {BootstrapValidator}
-         */
-        addField: function(field, options) {
-            var fields = $([]);
-            switch (typeof field) {
-                case 'object':
-                    fields = field;
-                    field  = field.attr('data-bv-field') || field.attr('name');
-                    break;
-                case 'string':
-                    delete this._cacheFields[field];
-                    fields = this.getFieldElements(field);
-                    break;
-                default:
-                    break;
-            }
-
-            fields.attr('data-bv-field', field);
-
-            var type  = fields.attr('type'),
-                total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length;
-
-            for (var i = 0; i < total; i++) {
-                var $field = fields.eq(i);
-
-                // Try to parse the options from HTML attributes
-                var opts = this._parseOptions($field);
-                opts = (opts === null) ? options : $.extend(true, options, opts);
-
-                this.options.fields[field] = $.extend(true, this.options.fields[field], opts);
-
-                // Update the cache
-                this._cacheFields[field] = this._cacheFields[field] ? this._cacheFields[field].add($field) : $field;
-
-                // Init the element
-                this._initField(('checkbox' === type || 'radio' === type) ? field : $field);
-            }
-
-            this.disableSubmitButtons(false);
-            // Trigger an event
-            this.$form.trigger($.Event(this.options.events.fieldAdded), {
-                field: field,
-                element: fields,
-                options: this.options.fields[field]
-            });
-
-            return this;
-        },
-
-        /**
-         * Remove a given field
-         *
-         * @param {String|jQuery} field The field name or field element
-         * @returns {BootstrapValidator}
-         */
-        removeField: function(field) {
-            var fields = $([]);
-            switch (typeof field) {
-                case 'object':
-                    fields = field;
-                    field  = field.attr('data-bv-field') || field.attr('name');
-                    fields.attr('data-bv-field', field);
-                    break;
-                case 'string':
-                    fields = this.getFieldElements(field);
-                    break;
-                default:
-                    break;
-            }
-
-            if (fields.length === 0) {
-                return this;
-            }
-
-            var type  = fields.attr('type'),
-                total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length;
-
-            for (var i = 0; i < total; i++) {
-                var $field = fields.eq(i);
-
-                // Remove from the list of invalid fields
-                this.$invalidFields = this.$invalidFields.not($field);
-
-                // Update the cache
-                this._cacheFields[field] = this._cacheFields[field].not($field);
-            }
-
-            if (!this._cacheFields[field] || this._cacheFields[field].length === 0) {
-                delete this.options.fields[field];
-            }
-            if ('checkbox' === type || 'radio' === type) {
-                this._initField(field);
-            }
-
-            this.disableSubmitButtons(false);
-            // Trigger an event
-            this.$form.trigger($.Event(this.options.events.fieldRemoved), {
-                field: field,
-                element: fields
-            });
-
-            return this;
-        },
-
-        /**
-         * Reset given field
-         *
-         * @param {String|jQuery} field The field name or field element
-         * @param {Boolean} [resetValue] If true, the method resets field value to empty or remove checked/selected attribute (for radio/checkbox)
-         * @returns {BootstrapValidator}
-         */
-        resetField: function(field, resetValue) {
-            var $fields = $([]);
-            switch (typeof field) {
-                case 'object':
-                    $fields = field;
-                    field   = field.attr('data-bv-field');
-                    break;
-                case 'string':
-                    $fields = this.getFieldElements(field);
-                    break;
-                default:
-                    break;
-            }
-
-            var total = $fields.length;
-            if (this.options.fields[field]) {
-                for (var i = 0; i < total; i++) {
-                    for (var validator in this.options.fields[field].validators) {
-                        $fields.eq(i).removeData('bv.dfs.' + validator);
-                    }
-                }
-            }
-
-            // Mark field as not validated yet
-            this.updateStatus(field, this.STATUS_NOT_VALIDATED);
-
-            if (resetValue) {
-                var type = $fields.attr('type');
-                ('radio' === type || 'checkbox' === type) ? $fields.removeAttr('checked').removeAttr('selected') : $fields.val('');
-            }
-
-            return this;
-        },
-
-        /**
-         * Reset the form
-         *
-         * @param {Boolean} [resetValue] If true, the method resets field value to empty or remove checked/selected attribute (for radio/checkbox)
-         * @returns {BootstrapValidator}
-         */
-        resetForm: function(resetValue) {
-            for (var field in this.options.fields) {
-                this.resetField(field, resetValue);
-            }
-
-            this.$invalidFields = $([]);
-            this.$submitButton  = null;
-
-            // Enable submit buttons
-            this.disableSubmitButtons(false);
-
-            return this;
-        },
-
-        /**
-         * Revalidate given field
-         * It's used when you need to revalidate the field which its value is updated by other plugin
-         *
-         * @param {String|jQuery} field The field name of field element
-         * @returns {BootstrapValidator}
-         */
-        revalidateField: function(field) {
-            this.updateStatus(field, this.STATUS_NOT_VALIDATED)
-                .validateField(field);
-
-            return this;
-        },
-
-        /**
-         * Enable/Disable all validators to given field
-         *
-         * @param {String} field The field name
-         * @param {Boolean} enabled Enable/Disable field validators
-         * @param {String} [validatorName] The validator name. If null, all validators will be enabled/disabled
-         * @returns {BootstrapValidator}
-         */
-        enableFieldValidators: function(field, enabled, validatorName) {
-            var validators = this.options.fields[field].validators;
-
-            // Enable/disable particular validator
-            if (validatorName
-                && validators
-                && validators[validatorName] && validators[validatorName].enabled !== enabled)
-            {
-                this.options.fields[field].validators[validatorName].enabled = enabled;
-                this.updateStatus(field, this.STATUS_NOT_VALIDATED, validatorName);
-            }
-            // Enable/disable all validators
-            else if (!validatorName && this.options.fields[field].enabled !== enabled) {
-                this.options.fields[field].enabled = enabled;
-                for (var v in validators) {
-                    this.enableFieldValidators(field, enabled, v);
-                }
-            }
-
-            return this;
-        },
-
-        /**
-         * Some validators have option which its value is dynamic.
-         * For example, the zipCode validator has the country option which might be changed dynamically by a select element.
-         *
-         * @param {jQuery|String} field The field name or element
-         * @param {String|Function} option The option which can be determined by:
-         * - a string
-         * - name of field which defines the value
-         * - name of function which returns the value
-         * - a function returns the value
-         *
-         * The callback function has the format of
-         *      callback: function(value, validator, $field) {
-         *          // value is the value of field
-         *          // validator is the BootstrapValidator instance
-         *          // $field is the field element
-         *      }
-         *
-         * @returns {String}
-         */
-        getDynamicOption: function(field, option) {
-            var $field = ('string' === typeof field) ? this.getFieldElements(field) : field,
-                value  = $field.val();
-
-            // Option can be determined by
-            // ... a function
-            if ('function' === typeof option) {
-                return $.fn.bootstrapValidator.helpers.call(option, [value, this, $field]);
-            }
-            // ... value of other field
-            else if ('string' === typeof option) {
-                var $f = this.getFieldElements(option);
-                if ($f.length) {
-                    return $f.val();
-                }
-                // ... return value of callback
-                else {
-                    return $.fn.bootstrapValidator.helpers.call(option, [value, this, $field]) || option;
-                }
-            }
-
-            return null;
-        },
-
-        /**
-         * Destroy the plugin
-         * It will remove all error messages, feedback icons and turn off the events
-         */
-        destroy: function() {
-            var field, fields, $field, validator, $icon, group;
-            for (field in this.options.fields) {
-                fields    = this.getFieldElements(field);
-                group     = this.options.fields[field].group || this.options.group;
-                for (var i = 0; i < fields.length; i++) {
-                    $field = fields.eq(i);
-                    $field
-                        // Remove all error messages
-                        .data('bv.messages')
-                            .find('.help-block[data-bv-validator][data-bv-for="' + field + '"]').remove().end()
-                            .end()
-                        .removeData('bv.messages')
-                        // Remove feedback classes
-                        .parents(group)
-                            .removeClass('has-feedback has-error has-success')
-                            .end()
-                        // Turn off events
-                        .off('.bv')
-                        .removeAttr('data-bv-field');
-
-                    // Remove feedback icons, tooltip/popover container
-                    $icon = $field.parents(group).find('i[data-bv-icon-for="' + field + '"]');
-                    if ($icon) {
-                        var container = ('function' === typeof (this.options.fields[field].container || this.options.container)) ? (this.options.fields[field].container || this.options.container).call(this, $field, this) : (this.options.fields[field].container || this.options.container);
-                        switch (container) {
-                            case 'tooltip':
-                                $icon.tooltip('destroy').remove();
-                                break;
-                            case 'popover':
-                                $icon.popover('destroy').remove();
-                                break;
-                            default:
-                                $icon.remove();
-                                break;
-                        }
-                    }
-
-                    for (validator in this.options.fields[field].validators) {
-                        if ($field.data('bv.dfs.' + validator)) {
-                            $field.data('bv.dfs.' + validator).reject();
-                        }
-                        $field.removeData('bv.result.' + validator)
-                              .removeData('bv.response.' + validator)
-                              .removeData('bv.dfs.' + validator);
-
-                        // Destroy the validator
-                        if ('function' === typeof $.fn.bootstrapValidator.validators[validator].destroy) {
-                            $.fn.bootstrapValidator.validators[validator].destroy(this, $field, this.options.fields[field].validators[validator]);
-                        }
-                    }
-                }
-            }
-
-            this.disableSubmitButtons(false);   // Enable submit buttons
-            this.$hiddenButton.remove();        // Remove the hidden button
-
-            this.$form
-                .removeClass(this.options.elementClass)
-                .off('.bv')
-                .removeData('bootstrapValidator')
-                // Remove generated hidden elements
-                .find('[data-bv-submit-hidden]').remove().end()
-                .find('[type="submit"]').off('click.bv');
-        }
-    };
-
-    // Plugin definition
-    $.fn.bootstrapValidator = function(option) {
-        var params = arguments;
-        return this.each(function() {
-            var $this   = $(this),
-                data    = $this.data('bootstrapValidator'),
-                options = 'object' === typeof option && option;
-            if (!data) {
-                data = new BootstrapValidator(this, options);
-                $this.data('bootstrapValidator', data);
-            }
-
-            // Allow to call plugin method
-            if ('string' === typeof option) {
-                data[option].apply(data, Array.prototype.slice.call(params, 1));
-            }
-        });
-    };
-
-    // The default options
-    $.fn.bootstrapValidator.DEFAULT_OPTIONS = {
-        // The form CSS class
-        elementClass: 'bv-form',
-
-        // Default invalid message
-        message: 'This value is not valid',
-
-        // The CSS selector for indicating the element consists the field
-        // By default, each field is placed inside the <div class="form-group"></div>
-        // You should adjust this option if your form group consists of many fields which not all of them need to be validated
-        group: '.form-group',
-
-        //The error messages container. It can be:
-        // - 'tooltip' if you want to use Bootstrap tooltip to show error messages
-        // - 'popover' if you want to use Bootstrap popover to show error messages
-        // - a CSS selector indicating the container
-        // In the first two cases, since the tooltip/popover should be small enough, the plugin only shows only one error message
-        // You also can define the message container for particular field
-        container: null,
-
-        // The field will not be live validated if its length is less than this number of characters
-        threshold: null,
-
-        // Indicate fields which won't be validated
-        // By default, the plugin will not validate the following kind of fields:
-        // - disabled
-        // - hidden
-        // - invisible
-        //
-        // The setting consists of jQuery filters. Accept 3 formats:
-        // - A string. Use a comma to separate filter
-        // - An array. Each element is a filter
-        // - An array. Each element can be a callback function
-        //      function($field, validator) {
-        //          $field is jQuery object representing the field element
-        //          validator is the BootstrapValidator instance
-        //          return true or false;
-        //      }
-        //
-        // The 3 following settings are equivalent:
-        //
-        // 1) ':disabled, :hidden, :not(:visible)'
-        // 2) [':disabled', ':hidden', ':not(:visible)']
-        // 3) [':disabled', ':hidden', function($field) {
-        //        return !$field.is(':visible');
-        //    }]
-        excluded: [':disabled', ':hidden', ':not(:visible)'],
-
-        // Shows ok/error/loading icons based on the field validity.
-        // This feature requires Bootstrap v3.1.0 or later (http://getbootstrap.com/css/#forms-control-validation).
-        // Since Bootstrap doesn't provide any methods to know its version, this option cannot be on/off automatically.
-        // In other word, to use this feature you have to upgrade your Bootstrap to v3.1.0 or later.
-        //
-        // Examples:
-        // - Use Glyphicons icons:
-        //  feedbackIcons: {
-        //      valid: 'glyphicon glyphicon-ok',
-        //      invalid: 'glyphicon glyphicon-remove',
-        //      validating: 'glyphicon glyphicon-refresh'
-        //  }
-        // - Use FontAwesome icons:
-        //  feedbackIcons: {
-        //      valid: 'fa fa-check',
-        //      invalid: 'fa fa-times',
-        //      validating: 'fa fa-refresh'
-        //  }
-        feedbackIcons: {
-            valid:      null,
-            invalid:    null,
-            validating: null
-        },
-
-        // The submit buttons selector
-        // These buttons will be disabled to prevent the valid form from multiple submissions
-        submitButtons: '[type="submit"]',
-
-        // Live validating option
-        // Can be one of 3 values:
-        // - enabled: The plugin validates fields as soon as they are changed
-        // - disabled: Disable the live validating. The error messages are only shown after the form is submitted
-        // - submitted: The live validating is enabled after the form is submitted
-        live: 'enabled',
-
-        // Map the field name with validator rules
-        fields: null,
-
-        // Use custom event name to avoid window.onerror being invoked by jQuery
-        // See https://github.com/nghuuphuoc/bootstrapvalidator/issues/630
-        events: {
-            formInit: 'init.form.bv',
-            formError: 'error.form.bv',
-            formSuccess: 'success.form.bv',
-            fieldAdded: 'added.field.bv',
-            fieldRemoved: 'removed.field.bv',
-            fieldInit: 'init.field.bv',
-            fieldError: 'error.field.bv',
-            fieldSuccess: 'success.field.bv',
-            fieldStatus: 'status.field.bv',
-            validatorError: 'error.validator.bv',
-            validatorSuccess: 'success.validator.bv'
-        },
-        
-        // Whether to be verbose when validating a field or not.
-        // Possible values:
-        // - true:  when a field has multiple validators, all of them will be checked, and respectively - if errors occur in
-        //          multiple validators, all of them will be displayed to the user
-        // - false: when a field has multiple validators, validation for this field will be terminated upon the first encountered error.
-        //          Thus, only the very first error message related to this field will be displayed to the user
-        verbose: true
-    };
-
-    // Available validators
-    $.fn.bootstrapValidator.validators  = {};
-
-    // i18n
-    $.fn.bootstrapValidator.i18n        = {};
-
-    $.fn.bootstrapValidator.Constructor = BootstrapValidator;
-
-    // Helper methods, which can be used in validator class
-    $.fn.bootstrapValidator.helpers = {
-        /**
-         * Execute a callback function
-         *
-         * @param {String|Function} functionName Can be
-         * - name of global function
-         * - name of namespace function (such as A.B.C)
-         * - a function
-         * @param {Array} args The callback arguments
-         */
-        call: function(functionName, args) {
-            if ('function' === typeof functionName) {
-                return functionName.apply(this, args);
-            } else if ('string' === typeof functionName) {
-                if ('()' === functionName.substring(functionName.length - 2)) {
-                    functionName = functionName.substring(0, functionName.length - 2);
-                }
-                var ns      = functionName.split('.'),
-                    func    = ns.pop(),
-                    context = window;
-                for (var i = 0; i < ns.length; i++) {
-                    context = context[ns[i]];
-                }
-
-                return (typeof context[func] === 'undefined') ? null : context[func].apply(this, args);
-            }
-        },
-
-        /**
-         * Format a string
-         * It's used to format the error message
-         * format('The field must between %s and %s', [10, 20]) = 'The field must between 10 and 20'
-         *
-         * @param {String} message
-         * @param {Array} parameters
-         * @returns {String}
-         */
-        format: function(message, parameters) {
-            if (!$.isArray(parameters)) {
-                parameters = [parameters];
-            }
-
-            for (var i in parameters) {
-                message = message.replace('%s', parameters[i]);
-            }
-
-            return message;
-        },
-
-        /**
-         * Validate a date
-         *
-         * @param {Number} year The full year in 4 digits
-         * @param {Number} month The month number
-         * @param {Number} day The day number
-         * @param {Boolean} [notInFuture] If true, the date must not be in the future
-         * @returns {Boolean}
-         */
-        date: function(year, month, day, notInFuture) {
-            if (isNaN(year) || isNaN(month) || isNaN(day)) {
-                return false;
-            }
-            if (day.length > 2 || month.length > 2 || year.length > 4) {
-                return false;
-            }
-
-            day   = parseInt(day, 10);
-            month = parseInt(month, 10);
-            year  = parseInt(year, 10);
-
-            if (year < 1000 || year > 9999 || month <= 0 || month > 12) {
-                return false;
-            }
-            var numDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
-            // Update the number of days in Feb of leap year
-            if (year % 400 === 0 || (year % 100 !== 0 && year % 4 === 0)) {
-                numDays[1] = 29;
-            }
-
-            // Check the day
-            if (day <= 0 || day > numDays[month - 1]) {
-                return false;
-            }
-
-            if (notInFuture === true) {
-                var currentDate  = new Date(),
-                    currentYear  = currentDate.getFullYear(),
-                    currentMonth = currentDate.getMonth(),
-                    currentDay   = currentDate.getDate();
-                return (year < currentYear
-                        || (year === currentYear && month - 1 < currentMonth)
-                        || (year === currentYear && month - 1 === currentMonth && day < currentDay));
-            }
-
-            return true;
-        },
-
-        /**
-         * Implement Luhn validation algorithm
-         * Credit to https://gist.github.com/ShirtlessKirk/2134376
-         *
-         * @see http://en.wikipedia.org/wiki/Luhn
-         * @param {String} value
-         * @returns {Boolean}
-         */
-        luhn: function(value) {
-            var length  = value.length,
-                mul     = 0,
-                prodArr = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]],
-                sum     = 0;
-
-            while (length--) {
-                sum += prodArr[mul][parseInt(value.charAt(length), 10)];
-                mul ^= 1;
-            }
-
-            return (sum % 10 === 0 && sum > 0);
-        },
-
-        /**
-         * Implement modulus 11, 10 (ISO 7064) algorithm
-         *
-         * @param {String} value
-         * @returns {Boolean}
-         */
-        mod11And10: function(value) {
-            var check  = 5,
-                length = value.length;
-            for (var i = 0; i < length; i++) {
-                check = (((check || 10) * 2) % 11 + parseInt(value.charAt(i), 10)) % 10;
-            }
-            return (check === 1);
-        },
-
-        /**
-         * Implements Mod 37, 36 (ISO 7064) algorithm
-         * Usages:
-         * mod37And36('A12425GABC1234002M')
-         * mod37And36('002006673085', '0123456789')
-         *
-         * @param {String} value
-         * @param {String} [alphabet]
-         * @returns {Boolean}
-         */
-        mod37And36: function(value, alphabet) {
-            alphabet = alphabet || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
-            var modulus = alphabet.length,
-                length  = value.length,
-                check   = Math.floor(modulus / 2);
-            for (var i = 0; i < length; i++) {
-                check = (((check || modulus) * 2) % (modulus + 1) + alphabet.indexOf(value.charAt(i))) % modulus;
-            }
-            return (check === 1);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.base64 = $.extend($.fn.bootstrapValidator.i18n.base64 || {}, {
-        'default': 'Please enter a valid base 64 encoded'
-    });
-
-    $.fn.bootstrapValidator.validators.base64 = {
-        /**
-         * Return true if the input value is a base 64 encoded string.
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(value);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.between = $.extend($.fn.bootstrapValidator.i18n.between || {}, {
-        'default': 'Please enter a value between %s and %s',
-        notInclusive: 'Please enter a value between %s and %s strictly'
-    });
-
-    $.fn.bootstrapValidator.validators.between = {
-        html5Attributes: {
-            message: 'message',
-            min: 'min',
-            max: 'max',
-            inclusive: 'inclusive'
-        },
-
-        enableByHtml5: function($field) {
-            if ('range' === $field.attr('type')) {
-                return {
-                    min: $field.attr('min'),
-                    max: $field.attr('max')
-                };
-            }
-
-            return false;
-        },
-
-        /**
-         * Return true if the input value is between (strictly or not) two given numbers
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - min
-         * - max
-         *
-         * The min, max keys define the number which the field value compares to. min, max can be
-         *      - A number
-         *      - Name of field which its value defines the number
-         *      - Name of callback function that returns the number
-         *      - A callback function that returns the number
-         *
-         * - inclusive [optional]: Can be true or false. Default is true
-         * - message: The invalid message
-         * @returns {Boolean|Object}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-            if (!$.isNumeric(value)) {
-                return false;
-            }
-
-            var min = $.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min),
-                max = $.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max);
-            value = parseFloat(value);
-			return (options.inclusive === true || options.inclusive === undefined)
-                    ? {
-                        valid: value >= min && value <= max,
-                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.between['default'], [min, max])
-                    }
-                    : {
-                        valid: value > min  && value <  max,
-                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.between.notInclusive, [min, max])
-                    };
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.validators.blank = {
-        /**
-         * Placeholder validator that can be used to display a custom validation message
-         * returned from the server
-         * Example:
-         *
-         * (1) a "blank" validator is applied to an input field.
-         * (2) data is entered via the UI that is unable to be validated client-side.
-         * (3) server returns a 400 with JSON data that contains the field that failed
-         *     validation and an associated message.
-         * (4) ajax 400 call handler does the following:
-         *
-         *      bv.updateMessage(field, 'blank', errorMessage);
-         *      bv.updateStatus(field, 'INVALID');
-         *
-         * @see https://github.com/nghuuphuoc/bootstrapvalidator/issues/542
-         * @see https://github.com/nghuuphuoc/bootstrapvalidator/pull/666
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            return true;
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.callback = $.extend($.fn.bootstrapValidator.i18n.callback || {}, {
-        'default': 'Please enter a valid value'
-    });
-
-    $.fn.bootstrapValidator.validators.callback = {
-        html5Attributes: {
-            message: 'message',
-            callback: 'callback'
-        },
-
-        /**
-         * Return result from the callback method
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - callback: The callback method that passes 2 parameters:
-         *      callback: function(fieldValue, validator, $field) {
-         *          // fieldValue is the value of field
-         *          // validator is instance of BootstrapValidator
-         *          // $field is the field element
-         *      }
-         * - message: The invalid message
-         * @returns {Deferred}
-         */
-        validate: function(validator, $field, options) {
-            var value  = $field.val(),
-                dfd    = new $.Deferred(),
-                result = { valid: true };
-
-            if (options.callback) {
-                var response = $.fn.bootstrapValidator.helpers.call(options.callback, [value, validator, $field]);
-                result = ('boolean' === typeof response) ? { valid: response } :  response;
-            }
-
-            dfd.resolve($field, 'callback', result);
-            return dfd;
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.choice = $.extend($.fn.bootstrapValidator.i18n.choice || {}, {
-        'default': 'Please enter a valid value',
-        less: 'Please choose %s options at minimum',
-        more: 'Please choose %s options at maximum',
-        between: 'Please choose %s - %s options'
-    });
-
-    $.fn.bootstrapValidator.validators.choice = {
-        html5Attributes: {
-            message: 'message',
-            min: 'min',
-            max: 'max'
-        },
-
-        /**
-         * Check if the number of checked boxes are less or more than a given number
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Consists of following keys:
-         * - min
-         * - max
-         *
-         * At least one of two keys is required
-         * The min, max keys define the number which the field value compares to. min, max can be
-         *      - A number
-         *      - Name of field which its value defines the number
-         *      - Name of callback function that returns the number
-         *      - A callback function that returns the number
-         *
-         * - message: The invalid message
-         * @returns {Object}
-         */
-        validate: function(validator, $field, options) {
-            var numChoices = $field.is('select')
-                            ? validator.getFieldElements($field.attr('data-bv-field')).find('option').filter(':selected').length
-                            : validator.getFieldElements($field.attr('data-bv-field')).filter(':checked').length,
-                min        = options.min ? ($.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min)) : null,
-                max        = options.max ? ($.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max)) : null,
-                isValid    = true,
-                message    = options.message || $.fn.bootstrapValidator.i18n.choice['default'];
-
-            if ((min && numChoices < parseInt(min, 10)) || (max && numChoices > parseInt(max, 10))) {
-                isValid = false;
-            }
-
-            switch (true) {
-                case (!!min && !!max):
-                    message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.choice.between, [parseInt(min, 10), parseInt(max, 10)]);
-                    break;
-
-                case (!!min):
-                    message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.choice.less, parseInt(min, 10));
-                    break;
-
-                case (!!max):
-                    message = $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.choice.more, parseInt(max, 10));
-                    break;
-
-                default:
-                    break;
-            }
-
-            return { valid: isValid, message: message };
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.creditCard = $.extend($.fn.bootstrapValidator.i18n.creditCard || {}, {
-        'default': 'Please enter a valid credit card number'
-    });
-
-    $.fn.bootstrapValidator.validators.creditCard = {
-        /**
-         * Return true if the input value is valid credit card number
-         * Based on https://gist.github.com/DiegoSalazar/4075533
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} [options] Can consist of the following key:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            // Accept only digits, dashes or spaces
-            if (/[^0-9-\s]+/.test(value)) {
-                return false;
-            }
-            value = value.replace(/\D/g, '');
-
-            if (!$.fn.bootstrapValidator.helpers.luhn(value)) {
-                return false;
-            }
-
-            // Validate the card number based on prefix (IIN ranges) and length
-            var cards = {
-                AMERICAN_EXPRESS: {
-                    length: [15],
-                    prefix: ['34', '37']
-                },
-                DINERS_CLUB: {
-                    length: [14],
-                    prefix: ['300', '301', '302', '303', '304', '305', '36']
-                },
-                DINERS_CLUB_US: {
-                    length: [16],
-                    prefix: ['54', '55']
-                },
-                DISCOVER: {
-                    length: [16],
-                    prefix: ['6011', '622126', '622127', '622128', '622129', '62213',
-                             '62214', '62215', '62216', '62217', '62218', '62219',
-                             '6222', '6223', '6224', '6225', '6226', '6227', '6228',
-                             '62290', '62291', '622920', '622921', '622922', '622923',
-                             '622924', '622925', '644', '645', '646', '647', '648',
-                             '649', '65']
-                },
-                JCB: {
-                    length: [16],
-                    prefix: ['3528', '3529', '353', '354', '355', '356', '357', '358']
-                },
-                LASER: {
-                    length: [16, 17, 18, 19],
-                    prefix: ['6304', '6706', '6771', '6709']
-                },
-                MAESTRO: {
-                    length: [12, 13, 14, 15, 16, 17, 18, 19],
-                    prefix: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']
-                },
-                MASTERCARD: {
-                    length: [16],
-                    prefix: ['51', '52', '53', '54', '55']
-                },
-                SOLO: {
-                    length: [16, 18, 19],
-                    prefix: ['6334', '6767']
-                },
-                UNIONPAY: {
-                    length: [16, 17, 18, 19],
-                    prefix: ['622126', '622127', '622128', '622129', '62213', '62214',
-                             '62215', '62216', '62217', '62218', '62219', '6222', '6223',
-                             '6224', '6225', '6226', '6227', '6228', '62290', '62291',
-                             '622920', '622921', '622922', '622923', '622924', '622925']
-                },
-                VISA: {
-                    length: [16],
-                    prefix: ['4']
-                }
-            };
-
-            var type, i;
-            for (type in cards) {
-                for (i in cards[type].prefix) {
-                    if (value.substr(0, cards[type].prefix[i].length) === cards[type].prefix[i]     // Check the prefix
-                        && $.inArray(value.length, cards[type].length) !== -1)                      // and length
-                    {
-                        return true;
-                    }
-                }
-            }
-
-            return false;
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.cusip = $.extend($.fn.bootstrapValidator.i18n.cusip || {}, {
-        'default': 'Please enter a valid CUSIP number'
-    });
-
-    $.fn.bootstrapValidator.validators.cusip = {
-        /**
-         * Validate a CUSIP
-         * Examples:
-         * - Valid: 037833100, 931142103, 14149YAR8, 126650BG6
-         * - Invalid: 31430F200, 022615AC2
-         *
-         * @see http://en.wikipedia.org/wiki/CUSIP
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} [options] Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            value = value.toUpperCase();
-            if (!/^[0-9A-Z]{9}$/.test(value)) {
-                return false;
-            }
-
-            var converted = $.map(value.split(''), function(item) {
-                                var code = item.charCodeAt(0);
-                                return (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0))
-                                            // Replace A, B, C, ..., Z with 10, 11, ..., 35
-                                            ? (code - 'A'.charCodeAt(0) + 10)
-                                            : item;
-                            }),
-                length    = converted.length,
-                sum       = 0;
-            for (var i = 0; i < length - 1; i++) {
-                var num = parseInt(converted[i], 10);
-                if (i % 2 !== 0) {
-                    num *= 2;
-                }
-                if (num > 9) {
-                    num -= 9;
-                }
-                sum += num;
-            }
-
-            sum = (10 - (sum % 10)) % 10;
-            return sum === converted[length - 1];
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.cvv = $.extend($.fn.bootstrapValidator.i18n.cvv || {}, {
-        'default': 'Please enter a valid CVV number'
-    });
-
-    $.fn.bootstrapValidator.validators.cvv = {
-        html5Attributes: {
-            message: 'message',
-            ccfield: 'creditCardField'
-        },
-
-        /**
-         * Return true if the input value is a valid CVV number.
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - creditCardField: The credit card number field. It can be null
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            if (!/^[0-9]{3,4}$/.test(value)) {
-                return false;
-            }
-
-            if (!options.creditCardField) {
-                return true;
-            }
-
-            // Get the credit card number
-            var creditCard = validator.getFieldElements(options.creditCardField).val();
-            if (creditCard === '') {
-                return true;
-            }
-            
-            creditCard = creditCard.replace(/\D/g, '');
-
-            // Supported credit card types
-            var cards = {
-                AMERICAN_EXPRESS: {
-                    length: [15],
-                    prefix: ['34', '37']
-                },
-                DINERS_CLUB: {
-                    length: [14],
-                    prefix: ['300', '301', '302', '303', '304', '305', '36']
-                },
-                DINERS_CLUB_US: {
-                    length: [16],
-                    prefix: ['54', '55']
-                },
-                DISCOVER: {
-                    length: [16],
-                    prefix: ['6011', '622126', '622127', '622128', '622129', '62213',
-                             '62214', '62215', '62216', '62217', '62218', '62219',
-                             '6222', '6223', '6224', '6225', '6226', '6227', '6228',
-                             '62290', '62291', '622920', '622921', '622922', '622923',
-                             '622924', '622925', '644', '645', '646', '647', '648',
-                             '649', '65']
-                },
-                JCB: {
-                    length: [16],
-                    prefix: ['3528', '3529', '353', '354', '355', '356', '357', '358']
-                },
-                LASER: {
-                    length: [16, 17, 18, 19],
-                    prefix: ['6304', '6706', '6771', '6709']
-                },
-                MAESTRO: {
-                    length: [12, 13, 14, 15, 16, 17, 18, 19],
-                    prefix: ['5018', '5020', '5038', '6304', '6759', '6761', '6762', '6763', '6764', '6765', '6766']
-                },
-                MASTERCARD: {
-                    length: [16],
-                    prefix: ['51', '52', '53', '54', '55']
-                },
-                SOLO: {
-                    length: [16, 18, 19],
-                    prefix: ['6334', '6767']
-                },
-                UNIONPAY: {
-                    length: [16, 17, 18, 19],
-                    prefix: ['622126', '622127', '622128', '622129', '62213', '62214',
-                             '62215', '62216', '62217', '62218', '62219', '6222', '6223',
-                             '6224', '6225', '6226', '6227', '6228', '62290', '62291',
-                             '622920', '622921', '622922', '622923', '622924', '622925']
-                },
-                VISA: {
-                    length: [16],
-                    prefix: ['4']
-                }
-            };
-            var type, i, creditCardType = null;
-            for (type in cards) {
-                for (i in cards[type].prefix) {
-                    if (creditCard.substr(0, cards[type].prefix[i].length) === cards[type].prefix[i]    // Check the prefix
-                        && $.inArray(creditCard.length, cards[type].length) !== -1)                     // and length
-                    {
-                        creditCardType = type;
-                        break;
-                    }
-                }
-            }
-
-            return (creditCardType === null)
-                        ? false
-                        : (('AMERICAN_EXPRESS' === creditCardType) ? (value.length === 4) : (value.length === 3));
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.date = $.extend($.fn.bootstrapValidator.i18n.date || {}, {
-        'default': 'Please enter a valid date'
-    });
-
-    $.fn.bootstrapValidator.validators.date = {
-        html5Attributes: {
-            message: 'message',
-            format: 'format',
-            separator: 'separator'
-        },
-
-        /**
-         * Return true if the input value is valid date
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * - separator: Use to separate the date, month, and year.
-         * By default, it is /
-         * - format: The date format. Default is MM/DD/YYYY
-         * The format can be:
-         *
-         * i) date: Consist of DD, MM, YYYY parts which are separated by the separator option
-         * ii) date and time:
-         * The time can consist of h, m, s parts which are separated by :
-         * ii) date, time and A (indicating AM or PM)
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            options.format = options.format || 'MM/DD/YYYY';
-
-            // #683: Force the format to YYYY-MM-DD as the default browser behaviour when using type="date" attribute
-            if ($field.attr('type') === 'date') {
-                options.format = 'YYYY-MM-DD';
-            }
-
-            var formats    = options.format.split(' '),
-                dateFormat = formats[0],
-                timeFormat = (formats.length > 1) ? formats[1] : null,
-                amOrPm     = (formats.length > 2) ? formats[2] : null,
-                sections   = value.split(' '),
-                date       = sections[0],
-                time       = (sections.length > 1) ? sections[1] : null;
-
-            if (formats.length !== sections.length) {
-                return false;
-            }
-
-            // Determine the separator
-            var separator = options.separator;
-            if (!separator) {
-                separator = (date.indexOf('/') !== -1) ? '/' : ((date.indexOf('-') !== -1) ? '-' : null);
-            }
-            if (separator === null || date.indexOf(separator) === -1) {
-                return false;
-            }
-
-            // Determine the date
-            date       = date.split(separator);
-            dateFormat = dateFormat.split(separator);
-            if (date.length !== dateFormat.length) {
-                return false;
-            }
-
-            var year  = date[$.inArray('YYYY', dateFormat)],
-                month = date[$.inArray('MM', dateFormat)],
-                day   = date[$.inArray('DD', dateFormat)];
-
-            if (!year || !month || !day || year.length !== 4) {
-                return false;
-            }
-
-            // Determine the time
-            var minutes = null, hours = null, seconds = null;
-            if (timeFormat) {
-                timeFormat = timeFormat.split(':');
-                time       = time.split(':');
-
-                if (timeFormat.length !== time.length) {
-                    return false;
-                }
-
-                hours   = time.length > 0 ? time[0] : null;
-                minutes = time.length > 1 ? time[1] : null;
-                seconds = time.length > 2 ? time[2] : null;
-
-                // Validate seconds
-                if (seconds) {
-                    if (isNaN(seconds) || seconds.length > 2) {
-                        return false;
-                    }
-                    seconds = parseInt(seconds, 10);
-                    if (seconds < 0 || seconds > 60) {
-                        return false;
-                    }
-                }
-
-                // Validate hours
-                if (hours) {
-                    if (isNaN(hours) || hours.length > 2) {
-                        return false;
-                    }
-                    hours = parseInt(hours, 10);
-                    if (hours < 0 || hours >= 24 || (amOrPm && hours > 12)) {
-                        return false;
-                    }
-                }
-
-                // Validate minutes
-                if (minutes) {
-                    if (isNaN(minutes) || minutes.length > 2) {
-                        return false;
-                    }
-                    minutes = parseInt(minutes, 10);
-                    if (minutes < 0 || minutes > 59) {
-                        return false;
-                    }
-                }
-            }
-
-            // Validate day, month, and year
-            return $.fn.bootstrapValidator.helpers.date(year, month, day);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.different = $.extend($.fn.bootstrapValidator.i18n.different || {}, {
-        'default': 'Please enter a different value'
-    });
-
-    $.fn.bootstrapValidator.validators.different = {
-        html5Attributes: {
-            message: 'message',
-            field: 'field'
-        },
-
-        /**
-         * Return true if the input value is different with given field's value
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Consists of the following key:
-         * - field: The name of field that will be used to compare with current one
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            var fields  = options.field.split(','),
-                isValid = true;
-
-            for (var i = 0; i < fields.length; i++) {
-                var compareWith = validator.getFieldElements(fields[i]);
-                if (compareWith == null || compareWith.length === 0) {
-                    continue;
-                }
-
-                var compareValue = compareWith.val();
-                if (value === compareValue) {
-                    isValid = false;
-                } else if (compareValue !== '') {
-                    validator.updateStatus(compareWith, validator.STATUS_VALID, 'different');
-                }
-            }
-
-            return isValid;
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.digits = $.extend($.fn.bootstrapValidator.i18n.digits || {}, {
-        'default': 'Please enter only digits'
-    });
-
-    $.fn.bootstrapValidator.validators.digits = {
-        /**
-         * Return true if the input value contains digits only
-         *
-         * @param {BootstrapValidator} validator Validate plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} [options]
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            return /^\d+$/.test(value);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.ean = $.extend($.fn.bootstrapValidator.i18n.ean || {}, {
-        'default': 'Please enter a valid EAN number'
-    });
-
-    $.fn.bootstrapValidator.validators.ean = {
-        /**
-         * Validate EAN (International Article Number)
-         * Examples:
-         * - Valid: 73513537, 9780471117094, 4006381333931
-         * - Invalid: 73513536
-         *
-         * @see http://en.wikipedia.org/wiki/European_Article_Number
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            if (!/^(\d{8}|\d{12}|\d{13})$/.test(value)) {
-                return false;
-            }
-
-            var length = value.length,
-                sum    = 0,
-                weight = (length === 8) ? [3, 1] : [1, 3];
-            for (var i = 0; i < length - 1; i++) {
-                sum += parseInt(value.charAt(i), 10) * weight[i % 2];
-            }
-            sum = (10 - sum % 10) % 10;
-            return (sum + '' === value.charAt(length - 1));
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.emailAddress = $.extend($.fn.bootstrapValidator.i18n.emailAddress || {}, {
-        'default': 'Please enter a valid email address'
-    });
-
-    $.fn.bootstrapValidator.validators.emailAddress = {
-        html5Attributes: {
-            message: 'message',
-            multiple: 'multiple',
-            separator: 'separator'
-        },
-
-        enableByHtml5: function($field) {
-            return ('email' === $field.attr('type'));
-        },
-
-        /**
-         * Return true if and only if the input value is a valid email address
-         *
-         * @param {BootstrapValidator} validator Validate plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} [options]
-         * - multiple: Allow multiple email addresses, separated by a comma or semicolon; default is false.
-         * - separator: Regex for character or characters expected as separator between addresses; default is comma /[,;]/, i.e. comma or semicolon.
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            // Email address regular expression
-            // http://stackoverflow.com/questions/46155/validate-email-address-in-javascript
-            var emailRegExp   = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,
-                allowMultiple = options.multiple === true || options.multiple === 'true';
-
-            if (allowMultiple) {
-                var separator = options.separator || /[,;]/,
-                    addresses = this._splitEmailAddresses(value, separator);
-
-                for (var i = 0; i < addresses.length; i++) {
-                    if (!emailRegExp.test(addresses[i])) {
-                        return false;
-                    }
-                }
-
-                return true;
-            } else {
-                return emailRegExp.test(value);
-            }
-        },
-
-        _splitEmailAddresses: function(emailAddresses, separator) {
-            var quotedFragments     = emailAddresses.split(/"/),
-                quotedFragmentCount = quotedFragments.length,
-                emailAddressArray   = [],
-                nextEmailAddress    = '';
-
-            for (var i = 0; i < quotedFragmentCount; i++) {
-                if (i % 2 === 0) {
-                    var splitEmailAddressFragments     = quotedFragments[i].split(separator),
-                        splitEmailAddressFragmentCount = splitEmailAddressFragments.length;
-
-                    if (splitEmailAddressFragmentCount === 1) {
-                        nextEmailAddress += splitEmailAddressFragments[0];
-                    } else {
-                        emailAddressArray.push(nextEmailAddress + splitEmailAddressFragments[0]);
-
-                        for (var j = 1; j < splitEmailAddressFragmentCount - 1; j++) {
-                            emailAddressArray.push(splitEmailAddressFragments[j]);
-                        }
-                        nextEmailAddress = splitEmailAddressFragments[splitEmailAddressFragmentCount - 1];
-                    }
-                } else {
-                    nextEmailAddress += '"' + quotedFragments[i];
-                    if (i < quotedFragmentCount - 1) {
-                        nextEmailAddress += '"';
-                    }
-                }
-            }
-
-            emailAddressArray.push(nextEmailAddress);
-            return emailAddressArray;
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.file = $.extend($.fn.bootstrapValidator.i18n.file || {}, {
-        'default': 'Please choose a valid file'
-    });
-
-    $.fn.bootstrapValidator.validators.file = {
-        html5Attributes: {
-            extension: 'extension',
-            maxsize: 'maxSize',
-            minsize: 'minSize',
-            message: 'message',
-            type: 'type'
-        },
-
-        /**
-         * Validate upload file. Use HTML 5 API if the browser supports
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - extension: The allowed extensions, separated by a comma
-         * - maxSize: The maximum size in bytes
-         * - minSize: the minimum size in bytes
-         * - message: The invalid message
-         * - type: The allowed MIME type, separated by a comma
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            var ext,
-                extensions = options.extension ? options.extension.toLowerCase().split(',') : null,
-                types      = options.type      ? options.type.toLowerCase().split(',')      : null,
-                html5      = (window.File && window.FileList && window.FileReader);
-
-            if (html5) {
-                // Get FileList instance
-                var files = $field.get(0).files,
-                    total = files.length;
-                for (var i = 0; i < total; i++) {
-                    // Check the minSize
-                    if (options.minSize && files[i].size < parseInt(options.minSize, 10)) {
-                        return false;
-                    }
-                    
-                    // Check the maxSize
-                    if (options.maxSize && files[i].size > parseInt(options.maxSize, 10)) {
-                        return false;
-                    }
-
-                    // Check file extension
-                    ext = files[i].name.substr(files[i].name.lastIndexOf('.') + 1);
-                    if (extensions && $.inArray(ext.toLowerCase(), extensions) === -1) {
-                        return false;
-                    }
-
-                    // Check file type
-                    if (files[i].type && types && $.inArray(files[i].type.toLowerCase(), types) === -1) {
-                        return false;
-                    }
-                }
-            } else {
-                // Check file extension
-                ext = value.substr(value.lastIndexOf('.') + 1);
-                if (extensions && $.inArray(ext.toLowerCase(), extensions) === -1) {
-                    return false;
-                }
-            }
-
-            return true;
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.greaterThan = $.extend($.fn.bootstrapValidator.i18n.greaterThan || {}, {
-        'default': 'Please enter a value greater than or equal to %s',
-        notInclusive: 'Please enter a value greater than %s'
-    });
-
-    $.fn.bootstrapValidator.validators.greaterThan = {
-        html5Attributes: {
-            message: 'message',
-            value: 'value',
-            inclusive: 'inclusive'
-        },
-
-        enableByHtml5: function($field) {
-            var type = $field.attr('type'),
-                min  = $field.attr('min');
-            if (min && type !== 'date') {
-                return {
-                    value: min
-                };
-            }
-
-            return false;
-        },
-
-        /**
-         * Return true if the input value is greater than or equals to given number
-         *
-         * @param {BootstrapValidator} validator Validate plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - value: Define the number to compare with. It can be
-         *      - A number
-         *      - Name of field which its value defines the number
-         *      - Name of callback function that returns the number
-         *      - A callback function that returns the number
-         *
-         * - inclusive [optional]: Can be true or false. Default is true
-         * - message: The invalid message
-         * @returns {Boolean|Object}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-            if (!$.isNumeric(value)) {
-                return false;
-            }
-
-            var compareTo = $.isNumeric(options.value) ? options.value : validator.getDynamicOption($field, options.value);
-            value = parseFloat(value);
-			return (options.inclusive === true || options.inclusive === undefined)
-                    ? {
-                        valid: value >= compareTo,
-                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.greaterThan['default'], compareTo)
-                    }
-                    : {
-                        valid: value > compareTo,
-                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.greaterThan.notInclusive, compareTo)
-                    };
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.grid = $.extend($.fn.bootstrapValidator.i18n.grid || {}, {
-        'default': 'Please enter a valid GRId number'
-    });
-
-    $.fn.bootstrapValidator.validators.grid = {
-        /**
-         * Validate GRId (Global Release Identifier)
-         * Examples:
-         * - Valid: A12425GABC1234002M, A1-2425G-ABC1234002-M, A1 2425G ABC1234002 M, Grid:A1-2425G-ABC1234002-M
-         * - Invalid: A1-2425G-ABC1234002-Q
-         *
-         * @see http://en.wikipedia.org/wiki/Global_Release_Identifier
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            value = value.toUpperCase();
-            if (!/^[GRID:]*([0-9A-Z]{2})[-\s]*([0-9A-Z]{5})[-\s]*([0-9A-Z]{10})[-\s]*([0-9A-Z]{1})$/g.test(value)) {
-                return false;
-            }
-            value = value.replace(/\s/g, '').replace(/-/g, '');
-            if ('GRID:' === value.substr(0, 5)) {
-                value = value.substr(5);
-            }
-            return $.fn.bootstrapValidator.helpers.mod37And36(value);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.hex = $.extend($.fn.bootstrapValidator.i18n.hex || {}, {
-        'default': 'Please enter a valid hexadecimal number'
-    });
-
-    $.fn.bootstrapValidator.validators.hex = {
-        /**
-         * Return true if and only if the input value is a valid hexadecimal number
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Consist of key:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            return /^[0-9a-fA-F]+$/.test(value);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.hexColor = $.extend($.fn.bootstrapValidator.i18n.hexColor || {}, {
-        'default': 'Please enter a valid hex color'
-    });
-
-    $.fn.bootstrapValidator.validators.hexColor = {
-        enableByHtml5: function($field) {
-            return ('color' === $field.attr('type'));
-        },
-
-        /**
-         * Return true if the input value is a valid hex color
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-            return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(value);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.iban = $.extend($.fn.bootstrapValidator.i18n.iban || {}, {
-        'default': 'Please enter a valid IBAN number',
-        countryNotSupported: 'The country code %s is not supported',
-        country: 'Please enter a valid IBAN number in %s',
-        countries: {
-            AD: 'Andorra',
-            AE: 'United Arab Emirates',
-            AL: 'Albania',
-            AO: 'Angola',
-            AT: 'Austria',
-            AZ: 'Azerbaijan',
-            BA: 'Bosnia and Herzegovina',
-            BE: 'Belgium',
-            BF: 'Burkina Faso',
-            BG: 'Bulgaria',
-            BH: 'Bahrain',
-            BI: 'Burundi',
-            BJ: 'Benin',
-            BR: 'Brazil',
-            CH: 'Switzerland',
-            CI: 'Ivory Coast',
-            CM: 'Cameroon',
-            CR: 'Costa Rica',
-            CV: 'Cape Verde',
-            CY: 'Cyprus',
-            CZ: 'Czech Republic',
-            DE: 'Germany',
-            DK: 'Denmark',
-            DO: 'Dominica',
-            DZ: 'Algeria',
-            EE: 'Estonia',
-            ES: 'Spain',
-            FI: 'Finland',
-            FO: 'Faroe Islands',
-            FR: 'France',
-            GB: 'United Kingdom',
-            GE: 'Georgia',
-            GI: 'Gibraltar',
-            GL: 'Greenland',
-            GR: 'Greece',
-            GT: 'Guatemala',
-            HR: 'Croatia',
-            HU: 'Hungary',
-            IE: 'Ireland',
-            IL: 'Israel',
-            IR: 'Iran',
-            IS: 'Iceland',
-            IT: 'Italy',
-            JO: 'Jordan',
-            KW: 'Kuwait',
-            KZ: 'Kazakhstan',
-            LB: 'Lebanon',
-            LI: 'Liechtenstein',
-            LT: 'Lithuania',
-            LU: 'Luxembourg',
-            LV: 'Latvia',
-            MC: 'Monaco',
-            MD: 'Moldova',
-            ME: 'Montenegro',
-            MG: 'Madagascar',
-            MK: 'Macedonia',
-            ML: 'Mali',
-            MR: 'Mauritania',
-            MT: 'Malta',
-            MU: 'Mauritius',
-            MZ: 'Mozambique',
-            NL: 'Netherlands',
-            NO: 'Norway',
-            PK: 'Pakistan',
-            PL: 'Poland',
-            PS: 'Palestine',
-            PT: 'Portugal',
-            QA: 'Qatar',
-            RO: 'Romania',
-            RS: 'Serbia',
-            SA: 'Saudi Arabia',
-            SE: 'Sweden',
-            SI: 'Slovenia',
-            SK: 'Slovakia',
-            SM: 'San Marino',
-            SN: 'Senegal',
-            TN: 'Tunisia',
-            TR: 'Turkey',
-            VG: 'Virgin Islands, British'
-        }
-    });
-
-    $.fn.bootstrapValidator.validators.iban = {
-        html5Attributes: {
-            message: 'message',
-            country: 'country'
-        },
-
-        // http://www.swift.com/dsp/resources/documents/IBAN_Registry.pdf
-        // http://en.wikipedia.org/wiki/International_Bank_Account_Number#IBAN_formats_by_country
-        REGEX: {
-            AD: 'AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}',                       // Andorra
-            AE: 'AE[0-9]{2}[0-9]{3}[0-9]{16}',                                  // United Arab Emirates
-            AL: 'AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}',                               // Albania
-            AO: 'AO[0-9]{2}[0-9]{21}',                                          // Angola
-            AT: 'AT[0-9]{2}[0-9]{5}[0-9]{11}',                                  // Austria
-            AZ: 'AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}',                               // Azerbaijan
-            BA: 'BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}',                   // Bosnia and Herzegovina
-            BE: 'BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}',                           // Belgium
-            BF: 'BF[0-9]{2}[0-9]{23}',                                          // Burkina Faso
-            BG: 'BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}',                // Bulgaria
-            BH: 'BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}',                               // Bahrain
-            BI: 'BI[0-9]{2}[0-9]{12}',                                          // Burundi
-            BJ: 'BJ[0-9]{2}[A-Z]{1}[0-9]{23}',                                  // Benin
-            BR: 'BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]',             // Brazil
-            CH: 'CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}',                               // Switzerland
-            CI: 'CI[0-9]{2}[A-Z]{1}[0-9]{23}',                                  // Ivory Coast
-            CM: 'CM[0-9]{2}[0-9]{23}',                                          // Cameroon
-            CR: 'CR[0-9]{2}[0-9]{3}[0-9]{14}',                                  // Costa Rica
-            CV: 'CV[0-9]{2}[0-9]{21}',                                          // Cape Verde
-            CY: 'CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}',                       // Cyprus
-            CZ: 'CZ[0-9]{2}[0-9]{20}',                                          // Czech Republic
-            DE: 'DE[0-9]{2}[0-9]{8}[0-9]{10}',                                  // Germany
-            DK: 'DK[0-9]{2}[0-9]{14}',                                          // Denmark
-            DO: 'DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}',                               // Dominican Republic
-            DZ: 'DZ[0-9]{2}[0-9]{20}',                                          // Algeria
-            EE: 'EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}',                  // Estonia
-            ES: 'ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}',          // Spain
-            FI: 'FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}',                           // Finland
-            FO: 'FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}',                           // Faroe Islands
-            FR: 'FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}',               // France
-            GB: 'GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}',                           // United Kingdom
-            GE: 'GE[0-9]{2}[A-Z]{2}[0-9]{16}',                                  // Georgia
-            GI: 'GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}',                               // Gibraltar
-            GL: 'GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}',                           // Greenland
-            GR: 'GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}',                       // Greece
-            GT: 'GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}',                            // Guatemala
-            HR: 'HR[0-9]{2}[0-9]{7}[0-9]{10}',                                  // Croatia
-            HU: 'HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}',          // Hungary
-            IE: 'IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}',                           // Ireland
-            IL: 'IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}',                          // Israel
-            IR: 'IR[0-9]{2}[0-9]{22}',                                          // Iran
-            IS: 'IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}',                  // Iceland
-            IT: 'IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}',               // Italy
-            JO: 'JO[0-9]{2}[A-Z]{4}[0-9]{4}[0]{8}[A-Z0-9]{10}',                 // Jordan
-            KW: 'KW[0-9]{2}[A-Z]{4}[0-9]{22}',                                  // Kuwait
-            KZ: 'KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}',                               // Kazakhstan
-            LB: 'LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}',                               // Lebanon
-            LI: 'LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}',                               // Liechtenstein
-            LT: 'LT[0-9]{2}[0-9]{5}[0-9]{11}',                                  // Lithuania
-            LU: 'LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}',                               // Luxembourg
-            LV: 'LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}',                               // Latvia
-            MC: 'MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}',               // Monaco
-            MD: 'MD[0-9]{2}[A-Z0-9]{20}',                                       // Moldova
-            ME: 'ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}',                          // Montenegro
-            MG: 'MG[0-9]{2}[0-9]{23}',                                          // Madagascar
-            MK: 'MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}',                       // Macedonia
-            ML: 'ML[0-9]{2}[A-Z]{1}[0-9]{23}',                                  // Mali
-            MR: 'MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}',                        // Mauritania
-            MT: 'MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}',                       // Malta
-            MU: 'MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}',  // Mauritius
-            MZ: 'MZ[0-9]{2}[0-9]{21}',                                          // Mozambique
-            NL: 'NL[0-9]{2}[A-Z]{4}[0-9]{10}',                                  // Netherlands
-            NO: 'NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}',                           // Norway
-            PK: 'PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}',                               // Pakistan
-            PL: 'PL[0-9]{2}[0-9]{8}[0-9]{16}',                                  // Poland
-            PS: 'PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}',                               // Palestinian
-            PT: 'PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}',                  // Portugal
-            QA: 'QA[0-9]{2}[A-Z]{4}[A-Z0-9]{21}',                               // Qatar
-            RO: 'RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}',                               // Romania
-            RS: 'RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}',                          // Serbia
-            SA: 'SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}',                               // Saudi Arabia
-            SE: 'SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}',                          // Sweden
-            SI: 'SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}',                           // Slovenia
-            SK: 'SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}',                          // Slovakia
-            SM: 'SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}',               // San Marino
-            SN: 'SN[0-9]{2}[A-Z]{1}[0-9]{23}',                                  // Senegal
-            TN: 'TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}',                        // Tunisia
-            TR: 'TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}',                    // Turkey
-            VG: 'VG[0-9]{2}[A-Z]{4}[0-9]{16}'                                   // Virgin Islands, British
-        },
-
-        /**
-         * Validate an International Bank Account Number (IBAN)
-         * To test it, take the sample IBAN from
-         * http://www.nordea.com/Our+services/International+products+and+services/Cash+Management/IBAN+countries/908462.html
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * - country: The ISO 3166-1 country code. It can be
-         *      - A country code
-         *      - Name of field which its value defines the country code
-         *      - Name of callback function that returns the country code
-         *      - A callback function that returns the country code
-         * @returns {Boolean|Object}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            value = value.replace(/[^a-zA-Z0-9]/g, '').toUpperCase();
-            var country = options.country;
-            if (!country) {
-                country = value.substr(0, 2);
-            } else if (typeof country !== 'string' || !this.REGEX[country]) {
-                // Determine the country code
-                country = validator.getDynamicOption($field, country);
-            }
-
-            if (!this.REGEX[country]) {
-                return {
-                    valid: false,
-                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.iban.countryNotSupported, country)
-                };
-            }
-
-            if (!(new RegExp('^' + this.REGEX[country] + '$')).test(value)) {
-                return {
-                    valid: false,
-                    message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.iban.country, $.fn.bootstrapValidator.i18n.iban.countries[country])
-                };
-            }
-
-            value = value.substr(4) + value.substr(0, 4);
-            value = $.map(value.split(''), function(n) {
-                var code = n.charCodeAt(0);
-                return (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0))
-                        // Replace A, B, C, ..., Z with 10, 11, ..., 35
-                        ? (code - 'A'.charCodeAt(0) + 10)
-                        : n;
-            });
-            value = value.join('');
-
-            var temp   = parseInt(value.substr(0, 1), 10),
-                length = value.length;
-            for (var i = 1; i < length; ++i) {
-                temp = (temp * 10 + parseInt(value.substr(i, 1), 10)) % 97;
-            }
-
-            return {
-                valid: (temp === 1),
-                message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.iban.country, $.fn.bootstrapValidator.i18n.iban.countries[country])
-            };
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.id = $.extend($.fn.bootstrapValidator.i18n.id || {}, {
-        'default': 'Please enter a valid identification number',
-        countryNotSupported: 'The country code %s is not supported',
-        country: 'Please enter a valid identification number in %s',
-        countries: {
-            BA: 'Bosnia and Herzegovina',
-            BG: 'Bulgaria',
-            BR: 'Brazil',
-            CH: 'Switzerland',
-            CL: 'Chile',
-            CN: 'China',
-            CZ: 'Czech Republic',
-            DK: 'Denmark',
-            EE: 'Estonia',
-            ES: 'Spain',
-            FI: 'Finland',
-            HR: 'Croatia',
-            IE: 'Ireland',
-            IS: 'Iceland',
-            LT: 'Lithuania',
-            LV: 'Latvia',
-            ME: 'Montenegro',
-            MK: 'Macedonia',
-            NL: 'Netherlands',
-            RO: 'Romania',
-            RS: 'Serbia',
-            SE: 'Sweden',
-            SI: 'Slovenia',
-            SK: 'Slovakia',
-            SM: 'San Marino',
-            TH: 'Thailand',
-            ZA: 'South Africa'
-        }
-    });
-
-    $.fn.bootstrapValidator.validators.id = {
-        html5Attributes: {
-            message: 'message',
-            country: 'country'
-        },
-
-        // Supported country codes
-        COUNTRY_CODES: [
-            'BA', 'BG', 'BR', 'CH', 'CL', 'CN', 'CZ', 'DK', 'EE', 'ES', 'FI', 'HR', 'IE', 'IS', 'LT', 'LV', 'ME', 'MK', 'NL',
-            'RO', 'RS', 'SE', 'SI', 'SK', 'SM', 'TH', 'ZA'
-        ],
-
-        /**
-         * Validate identification number in different countries
-         *
-         * @see http://en.wikipedia.org/wiki/National_identification_number
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Consist of key:
-         * - message: The invalid message
-         * - country: The ISO 3166-1 country code. It can be
-         *      - One of country code defined in COUNTRY_CODES
-         *      - Name of field which its value defines the country code
-         *      - Name of callback function that returns the country code
-         *      - A callback function that returns the country code
-         * @returns {Boolean|Object}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            var country = options.country;
-            if (!country) {
-                country = value.substr(0, 2);
-            } else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
-                // Determine the country code
-                country = validator.getDynamicOption($field, country);
-            }
-
-            if ($.inArray(country, this.COUNTRY_CODES) === -1) {
-                return { valid: false, message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.id.countryNotSupported, country) };
-            }
-
-            var method  = ['_', country.toLowerCase()].join('');
-            return this[method](value)
-                    ? true
-                    : {
-                        valid: false,
-                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.id.country, $.fn.bootstrapValidator.i18n.id.countries[country.toUpperCase()])
-                    };
-        },
-
-        /**
-         * Validate Unique Master Citizen Number which uses in
-         * - Bosnia and Herzegovina (country code: BA)
-         * - Macedonia (MK)
-         * - Montenegro (ME)
-         * - Serbia (RS)
-         * - Slovenia (SI)
-         *
-         * @see http://en.wikipedia.org/wiki/Unique_Master_Citizen_Number
-         * @param {String} value The ID
-         * @param {String} countryCode The ISO country code, can be BA, MK, ME, RS, SI
-         * @returns {Boolean}
-         */
-        _validateJMBG: function(value, countryCode) {
-            if (!/^\d{13}$/.test(value)) {
-                return false;
-            }
-            var day   = parseInt(value.substr(0, 2), 10),
-                month = parseInt(value.substr(2, 2), 10),
-                year  = parseInt(value.substr(4, 3), 10),
-                rr    = parseInt(value.substr(7, 2), 10),
-                k     = parseInt(value.substr(12, 1), 10);
-
-            // Validate date of birth
-            // FIXME: Validate the year of birth
-            if (day > 31 || month > 12) {
-                return false;
-            }
-
-            // Validate checksum
-            var sum = 0;
-            for (var i = 0; i < 6; i++) {
-                sum += (7 - i) * (parseInt(value.charAt(i), 10) + parseInt(value.charAt(i + 6), 10));
-            }
-            sum = 11 - sum % 11;
-            if (sum === 10 || sum === 11) {
-                sum = 0;
-            }
-            if (sum !== k) {
-                return false;
-            }
-
-            // Validate political region
-            // rr is the political region of birth, which can be in ranges:
-            // 10-19: Bosnia and Herzegovina
-            // 20-29: Montenegro
-            // 30-39: Croatia (not used anymore)
-            // 41-49: Macedonia
-            // 50-59: Slovenia (only 50 is used)
-            // 70-79: Central Serbia
-            // 80-89: Serbian province of Vojvodina
-            // 90-99: Kosovo
-            switch (countryCode.toUpperCase()) {
-                case 'BA':
-                    return (10 <= rr && rr <= 19);
-                case 'MK':
-                    return (41 <= rr && rr <= 49);
-                case 'ME':
-                    return (20 <= rr && rr <= 29);
-                case 'RS':
-                    return (70 <= rr && rr <= 99);
-                case 'SI':
-                    return (50 <= rr && rr <= 59);
-                default:
-                    return true;
-            }
-        },
-
-        _ba: function(value) {
-            return this._validateJMBG(value, 'BA');
-        },
-        _mk: function(value) {
-            return this._validateJMBG(value, 'MK');
-        },
-        _me: function(value) {
-            return this._validateJMBG(value, 'ME');
-        },
-        _rs: function(value) {
-            return this._validateJMBG(value, 'RS');
-        },
-
-        /**
-         * Examples: 0101006500006
-         */
-        _si: function(value) {
-            return this._validateJMBG(value, 'SI');
-        },
-
-        /**
-         * Validate Bulgarian national identification number (EGN)
-         * Examples:
-         * - Valid: 7523169263, 8032056031, 803205 603 1, 8001010008, 7501020018, 7552010005, 7542011030
-         * - Invalid: 8019010008
-         *
-         * @see http://en.wikipedia.org/wiki/Uniform_civil_number
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _bg: function(value) {
-            if (!/^\d{10}$/.test(value) && !/^\d{6}\s\d{3}\s\d{1}$/.test(value)) {
-                return false;
-            }
-            value = value.replace(/\s/g, '');
-            // Check the birth date
-            var year  = parseInt(value.substr(0, 2), 10) + 1900,
-                month = parseInt(value.substr(2, 2), 10),
-                day   = parseInt(value.substr(4, 2), 10);
-            if (month > 40) {
-                year += 100;
-                month -= 40;
-            } else if (month > 20) {
-                year -= 100;
-                month -= 20;
-            }
-
-            if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
-                return false;
-            }
-
-            var sum    = 0,
-                weight = [2, 4, 8, 5, 10, 9, 7, 3, 6];
-            for (var i = 0; i < 9; i++) {
-                sum += parseInt(value.charAt(i), 10) * weight[i];
-            }
-            sum = (sum % 11) % 10;
-            return (sum + '' === value.substr(9, 1));
-        },
-
-        /**
-         * Validate Brazilian national identification number (CPF)
-         * Examples:
-         * - Valid: 39053344705, 390.533.447-05, 111.444.777-35
-         * - Invalid: 231.002.999-00
-         *
-         * @see http://en.wikipedia.org/wiki/Cadastro_de_Pessoas_F%C3%ADsicas
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _br: function(value) {
-            if (/^1{11}|2{11}|3{11}|4{11}|5{11}|6{11}|7{11}|8{11}|9{11}|0{11}$/.test(value)) {
-                return false;
-            }
-            if (!/^\d{11}$/.test(value) && !/^\d{3}\.\d{3}\.\d{3}-\d{2}$/.test(value)) {
-                return false;
-            }
-            value = value.replace(/\./g, '').replace(/-/g, '');
-
-            var d1 = 0;
-            for (var i = 0; i < 9; i++) {
-                d1 += (10 - i) * parseInt(value.charAt(i), 10);
-            }
-            d1 = 11 - d1 % 11;
-            if (d1 === 10 || d1 === 11) {
-                d1 = 0;
-            }
-            if (d1 + '' !== value.charAt(9)) {
-                return false;
-            }
-
-            var d2 = 0;
-            for (i = 0; i < 10; i++) {
-                d2 += (11 - i) * parseInt(value.charAt(i), 10);
-            }
-            d2 = 11 - d2 % 11;
-            if (d2 === 10 || d2 === 11) {
-                d2 = 0;
-            }
-
-            return (d2 + '' === value.charAt(10));
-        },
-
-        /**
-         * Validate Swiss Social Security Number (AHV-Nr/No AVS)
-         * Examples:
-         * - Valid: 756.1234.5678.95, 7561234567895
-         *
-         * @see http://en.wikipedia.org/wiki/National_identification_number#Switzerland
-         * @see http://www.bsv.admin.ch/themen/ahv/00011/02185/index.html?lang=de
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _ch: function(value) {
-            if (!/^756[\.]{0,1}[0-9]{4}[\.]{0,1}[0-9]{4}[\.]{0,1}[0-9]{2}$/.test(value)) {
-                return false;
-            }
-            value = value.replace(/\D/g, '').substr(3);
-            var length = value.length,
-                sum    = 0,
-                weight = (length === 8) ? [3, 1] : [1, 3];
-            for (var i = 0; i < length - 1; i++) {
-                sum += parseInt(value.charAt(i), 10) * weight[i % 2];
-            }
-            sum = 10 - sum % 10;
-            return (sum + '' === value.charAt(length - 1));
-        },
-
-        /**
-         * Validate Chilean national identification number (RUN/RUT)
-         * Examples:
-         * - Valid: 76086428-5, 22060449-7, 12531909-2
-         *
-         * @see http://en.wikipedia.org/wiki/National_identification_number#Chile
-         * @see https://palena.sii.cl/cvc/dte/ee_empresas_emisoras.html for samples
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _cl: function(value) {
-            if (!/^\d{7,8}[-]{0,1}[0-9K]$/i.test(value)) {
-                return false;
-            }
-            value = value.replace(/\-/g, '');
-            while (value.length < 9) {
-                value = '0' + value;
-            }
-            var sum    = 0,
-                weight = [3, 2, 7, 6, 5, 4, 3, 2];
-            for (var i = 0; i < 8; i++) {
-                sum += parseInt(value.charAt(i), 10) * weight[i];
-            }
-            sum = 11 - sum % 11;
-            if (sum === 11) {
-                sum = 0;
-            } else if (sum === 10) {
-                sum = 'K';
-            }
-            return sum + '' === value.charAt(8).toUpperCase();
-        },
-
-        /**
-         * Validate Chinese citizen identification number
-         *
-         * Rules:
-         * - For current 18-digit system (since 1st Oct 1999, defined by GB11643—1999 national standard):
-         *     - Digit 0-5: Must be a valid administrative division code of China PR.
-         *     - Digit 6-13: Must be a valid YYYYMMDD date of birth. A future date is tolerated.
-         *     - Digit 14-16: Order code, any integer.
-         *     - Digit 17: An ISO 7064:1983, MOD 11-2 checksum.
-         *       Both upper/lower case of X are tolerated.
-         * - For deprecated 15-digit system:
-         *     - Digit 0-5: Must be a valid administrative division code of China PR.
-         *     - Digit 6-11: Must be a valid YYMMDD date of birth, indicating the year of 19XX.
-         *     - Digit 12-14: Order code, any integer.
-         * Lists of valid administrative division codes of China PR can be seen here:
-         * <http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/>
-         * Published and maintained by National Bureau of Statistics of China PR.
-         * NOTE: Current and deprecated codes MUST BOTH be considered valid.
-         * Many Chinese citizens born in once existed administrative divisions!
-         *
-         * @see http://en.wikipedia.org/wiki/Resident_Identity_Card#Identity_card_number
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _cn: function(value) {
-            // Basic format check (18 or 15 digits, considering X in checksum)
-            value = value.trim();
-            if (!/^\d{15}$/.test(value) && !/^\d{17}[\dXx]{1}$/.test(value)) {
-                return false;
-            }
-            
-            // Check China PR Administrative division code
-            var adminDivisionCodes = {
-                11: {
-                    0: [0],
-                    1: [[0, 9], [11, 17]],
-                    2: [0, 28, 29]
-                },
-                12: {
-                    0: [0],
-                    1: [[0, 16]],
-                    2: [0, 21, 23, 25]
-                },
-                13: {
-                    0: [0],
-                    1: [[0, 5], 7, 8, 21, [23, 33], [81, 85]],
-                    2: [[0, 5], [7, 9], [23, 25], 27, 29, 30, 81, 83],
-                    3: [[0, 4], [21, 24]],
-                    4: [[0, 4], 6, 21, [23, 35], 81],
-                    5: [[0, 3], [21, 35], 81, 82],
-                    6: [[0, 4], [21, 38], [81, 84]],
-                    7: [[0, 3], 5, 6, [21, 33]],
-                    8: [[0, 4], [21, 28]],
-                    9: [[0, 3], [21, 30], [81, 84]],
-                    10: [[0, 3], [22, 26], 28, 81, 82],
-                    11: [[0, 2], [21, 28], 81, 82]
-                },
-                14: {
-                    0: [0],
-                    1: [0, 1, [5, 10], [21, 23], 81],
-                    2: [[0, 3], 11, 12, [21, 27]],
-                    3: [[0, 3], 11, 21, 22],
-                    4: [[0, 2], 11, 21, [23, 31], 81],
-                    5: [[0, 2], 21, 22, 24, 25, 81],
-                    6: [[0, 3], [21, 24]],
-                    7: [[0, 2], [21, 29], 81],
-                    8: [[0, 2], [21, 30], 81, 82],
-                    9: [[0, 2], [21, 32], 81],
-                    10: [[0, 2], [21, 34], 81, 82],
-                    11: [[0, 2], [21, 30], 81, 82],
-                    23: [[0, 3], 22, 23, [25, 30], 32, 33]
-                },
-                15: {
-                    0: [0],
-                    1: [[0, 5], [21, 25]],
-                    2: [[0, 7], [21, 23]],
-                    3: [[0, 4]],
-                    4: [[0, 4], [21, 26], [28, 30]],
-                    5: [[0, 2], [21, 26], 81],
-                    6: [[0, 2], [21, 27]],
-                    7: [[0, 3], [21, 27], [81, 85]],
-                    8: [[0, 2], [21, 26]],
-                    9: [[0, 2], [21, 29], 81],
-                    22: [[0, 2], [21, 24]],
-                    25: [[0, 2], [22, 31]],
-                    26: [[0, 2], [24, 27], [29, 32], 34],
-                    28: [0, 1, [22, 27]],
-                    29: [0, [21, 23]]
-                },
-                21: {
-                    0: [0],
-                    1: [[0, 6], [11, 14], [22, 24], 81],
-                    2: [[0, 4], [11, 13], 24, [81, 83]],
-                    3: [[0, 4], 11, 21, 23, 81],
-                    4: [[0, 4], 11, [21, 23]],
-                    5: [[0, 5], 21, 22],
-                    6: [[0, 4], 24, 81, 82],
-                    7: [[0, 3], 11, 26, 27, 81, 82],
-                    8: [[0, 4], 11, 81, 82],
-                    9: [[0, 5], 11, 21, 22],
-                    10: [[0, 5], 11, 21, 81],
-                    11: [[0, 3], 21, 22],
-                    12: [[0, 2], 4, 21, 23, 24, 81, 82],
-                    13: [[0, 3], 21, 22, 24, 81, 82],
-                    14: [[0, 4], 21, 22, 81]
-                },
-                22: {
-                    0: [0],
-                    1: [[0, 6], 12, 22, [81, 83]],
-                    2: [[0, 4], 11, 21, [81, 84]],
-                    3: [[0, 3], 22, 23, 81, 82],
-                    4: [[0, 3], 21, 22],
-                    5: [[0, 3], 21, 23, 24, 81, 82],
-                    6: [[0, 2], 4, 5, [21, 23], 25, 81],
-                    7: [[0, 2], [21, 24], 81],
-                    8: [[0, 2], 21, 22, 81, 82],
-                    24: [[0, 6], 24, 26]
-                },
-                23: {
-                    0: [0],
-                    1: [[0, 12], 21, [23, 29], [81, 84]],
-                    2: [[0, 8], 21, [23, 25], 27, [29, 31], 81],
-                    3: [[0, 7], 21, 81, 82],
-                    4: [[0, 7], 21, 22],
-                    5: [[0, 3], 5, 6, [21, 24]],
-                    6: [[0, 6], [21, 24]],
-                    7: [[0, 16], 22, 81],
-                    8: [[0, 5], 11, 22, 26, 28, 33, 81, 82],
-                    9: [[0, 4], 21],
-                    10: [[0, 5], 24, 25, 81, [83, 85]],
-                    11: [[0, 2], 21, 23, 24, 81, 82],
-                    12: [[0, 2], [21, 26], [81, 83]],
-                    27: [[0, 4], [21, 23]]
-                },
-                31: {
-                    0: [0],
-                    1: [0, 1, [3, 10], [12, 20]],
-                    2: [0, 30]
-                },
-                32: {
-                    0: [0],
-                    1: [[0, 7], 11, [13, 18], 24, 25],
-                    2: [[0, 6], 11, 81, 82],
-                    3: [[0, 5], 11, 12, [21, 24], 81, 82],
-                    4: [[0, 2], 4, 5, 11, 12, 81, 82],
-                    5: [[0, 9], [81, 85]],
-                    6: [[0, 2], 11, 12, 21, 23, [81, 84]],
-                    7: [0, 1, 3, 5, 6, [21, 24]],
-                    8: [[0, 4], 11, 26, [29, 31]],
-                    9: [[0, 3], [21, 25], 28, 81, 82],
-                    10: [[0, 3], 11, 12, 23, 81, 84, 88],
-                    11: [[0, 2], 11, 12, [81, 83]],
-                    12: [[0, 4], [81, 84]],
-                    13: [[0, 2], 11, [21, 24]]
-                },
-                33: {
-                    0: [0],
-                    1: [[0, 6], [8, 10], 22, 27, 82, 83, 85],
-                    2: [0, 1, [3, 6], 11, 12, 25, 26, [81, 83]],
-                    3: [[0, 4], 22, 24, [26, 29], 81, 82],
-                    4: [[0, 2], 11, 21, 24, [81, 83]],
-                    5: [[0, 3], [21, 23]],
-                    6: [[0, 2], 21, 24, [81, 83]],
-                    7: [[0, 3], 23, 26, 27, [81, 84]],
-                    8: [[0, 3], 22, 24, 25, 81],
-                    9: [[0, 3], 21, 22],
-                    10: [[0, 4], [21, 24], 81, 82],
-                    11: [[0, 2], [21, 27], 81]
-                },
-                34: {
-                    0: [0],
-                    1: [[0, 4], 11, [21, 24], 81],
-                    2: [[0, 4], 7, 8, [21, 23], 25],
-                    3: [[0, 4], 11, [21, 23]],
-                    4: [[0, 6], 21],
-                    5: [[0, 4], 6, [21, 23]],
-                    6: [[0, 4], 21],
-                    7: [[0, 3], 11, 21],
-                    8: [[0, 3], 11, [22, 28], 81],
-                    10: [[0, 4], [21, 24]],
-                    11: [[0, 3], 22, [24, 26], 81, 82],
-                    12: [[0, 4], 21, 22, 25, 26, 82],
-                    13: [[0, 2], [21, 24]],
-                    14: [[0, 2], [21, 24]],
-                    15: [[0, 3], [21, 25]],
-                    16: [[0, 2], [21, 23]],
-                    17: [[0, 2], [21, 23]],
-                    18: [[0, 2], [21, 25], 81]
-                },
-                35: {
-                    0: [0],
-                    1: [[0, 5], 11, [21, 25], 28, 81, 82],
-                    2: [[0, 6], [11, 13]],
-                    3: [[0, 5], 22],
-                    4: [[0, 3], 21, [23, 30], 81],
-                    5: [[0, 5], 21, [24, 27], [81, 83]],
-                    6: [[0, 3], [22, 29], 81],
-                    7: [[0, 2], [21, 25], [81, 84]],
-                    8: [[0, 2], [21, 25], 81],
-                    9: [[0, 2], [21, 26], 81, 82]
-                },
-                36: {
-                    0: [0],
-                    1: [[0, 5], 11, [21, 24]],
-                    2: [[0, 3], 22, 81],
-                    3: [[0, 2], 13, [21, 23]],
-                    4: [[0, 3], 21, [23, 30], 81, 82],
-                    5: [[0, 2], 21],
-                    6: [[0, 2], 22, 81],
-                    7: [[0, 2], [21, 35], 81, 82],
-                    8: [[0, 3], [21, 30], 81],
-                    9: [[0, 2], [21, 26], [81, 83]],
-                    10: [[0, 2], [21, 30]],
-                    11: [[0, 2], [21, 30], 81]
-                },
-                37: {
-                    0: [0],
-                    1: [[0, 5], 12, 13, [24, 26], 81],
-                    2: [[0, 3], 5, [11, 14], [81, 85]],
-                    3: [[0, 6], [21, 23]],
-                    4: [[0, 6], 81],
-                    5: [[0, 3], [21, 23]],
-                    6: [[0, 2], [11, 13], 34, [81, 87]],
-                    7: [[0, 5], 24, 25, [81, 86]],
-                    8: [[0, 2], 11, [26, 32], [81, 83]],
-                    9: [[0, 3], 11, 21, 23, 82, 83],
-                    10: [[0, 2], [81, 83]],
-                    11: [[0, 3], 21, 22],
-                    12: [[0, 3]],
-                    13: [[0, 2], 11, 12, [21, 29]],
-                    14: [[0, 2], [21, 28], 81, 82],
-                    15: [[0, 2], [21, 26], 81],
-                    16: [[0, 2], [21, 26]],
-                    17: [[0, 2], [21, 28]]
-                },
-                41: {
-                    0: [0],
-                    1: [[0, 6], 8, 22, [81, 85]],
-                    2: [[0, 5], 11, [21, 25]],
-                    3: [[0, 7], 11, [22, 29], 81],
-                    4: [[0, 4], 11, [21, 23], 25, 81, 82],
-                    5: [[0, 3], 5, 6, 22, 23, 26, 27, 81],
-                    6: [[0, 3], 11, 21, 22],
-                    7: [[0, 4], 11, 21, [24, 28], 81, 82],
-                    8: [[0, 4], 11, [21, 23], 25, [81, 83]],
-                    9: [[0, 2], 22, 23, [26, 28]],
-                    10: [[0, 2], [23, 25], 81, 82],
-                    11: [[0, 4], [21, 23]],
-                    12: [[0, 2], 21, 22, 24, 81, 82],
-                    13: [[0, 3], [21, 30], 81],
-                    14: [[0, 3], [21, 26], 81],
-                    15: [[0, 3], [21, 28]],
-                    16: [[0, 2], [21, 28], 81],
-                    17: [[0, 2], [21, 29]],
-                    90: [0, 1]
-                },
-                42: {
-                    0: [0],
-                    1: [[0, 7], [11, 17]],
-                    2: [[0, 5], 22, 81],
-                    3: [[0, 3], [21, 25], 81],
-                    5: [[0, 6], [25, 29], [81, 83]],
-                    6: [[0, 2], 6, 7, [24, 26], [82, 84]],
-                    7: [[0, 4]],
-                    8: [[0, 2], 4, 21, 22, 81],
-                    9: [[0, 2], [21, 23], 81, 82, 84],
-                    10: [[0, 3], [22, 24], 81, 83, 87],
-                    11: [[0, 2], [21, 27], 81, 82],
-                    12: [[0, 2], [21, 24], 81],
-                    13: [[0, 3], 21, 81],
-                    28: [[0, 2], 22, 23, [25, 28]],
-                    90: [0, [4, 6], 21]
-                },
-                43: {
-                    0: [0],
-                    1: [[0, 5], 11, 12, 21, 22, 24, 81],
-                    2: [[0, 4], 11, 21, [23, 25], 81],
-                    3: [[0, 2], 4, 21, 81, 82],
-                    4: [0, 1, [5, 8], 12, [21, 24], 26, 81, 82],
-                    5: [[0, 3], 11, [21, 25], [27, 29], 81],
-                    6: [[0, 3], 11, 21, 23, 24, 26, 81, 82],
-                    7: [[0, 3], [21, 26], 81],
-                    8: [[0, 2], 11, 21, 22],
-                    9: [[0, 3], [21, 23], 81],
-                    10: [[0, 3], [21, 28], 81],
-                    11: [[0, 3], [21, 29]],
-                    12: [[0, 2], [21, 30], 81],
-                    13: [[0, 2], 21, 22, 81, 82],
-                    31: [0, 1, [22, 27], 30]
-                },
-                44: {
-                    0: [0],
-                    1: [[0, 7], [11, 16], 83, 84],
-                    2: [[0, 5], 21, 22, 24, 29, 32, 33, 81, 82],
-                    3: [0, 1, [3, 8]],
-                    4: [[0, 4]],
-                    5: [0, 1, [6, 15], 23, 82, 83],
-                    6: [0, 1, [4, 8]],
-                    7: [0, 1, [3, 5], 81, [83, 85]],
-                    8: [[0, 4], 11, 23, 25, [81, 83]],
-                    9: [[0, 3], 23, [81, 83]],
-                    12: [[0, 3], [23, 26], 83, 84],
-                    13: [[0, 3], [22, 24], 81],
-                    14: [[0, 2], [21, 24], 26, 27, 81],
-                    15: [[0, 2], 21, 23, 81],
-                    16: [[0, 2], [21, 25]],
-                    17: [[0, 2], 21, 23, 81],
-                    18: [[0, 3], 21, 23, [25, 27], 81, 82],
-                    19: [0],
-                    20: [0],
-                    51: [[0, 3], 21, 22],
-                    52: [[0, 3], 21, 22, 24, 81],
-                    53: [[0, 2], [21, 23], 81]
-                },
-                45: {
-                    0: [0],
-                    1: [[0, 9], [21, 27]],
-                    2: [[0, 5], [21, 26]],
-                    3: [[0, 5], 11, 12, [21, 32]],
-                    4: [0, 1, [3, 6], 11, [21, 23], 81],
-                    5: [[0, 3], 12, 21],
-                    6: [[0, 3], 21, 81],
-                    7: [[0, 3], 21, 22],
-                    8: [[0, 4], 21, 81],
-                    9: [[0, 3], [21, 24], 81],
-                    10: [[0, 2], [21, 31]],
-                    11: [[0, 2], [21, 23]],
-                    12: [[0, 2], [21, 29], 81],
-                    13: [[0, 2], [21, 24], 81],
-                    14: [[0, 2], [21, 25], 81]
-                },
-                46: {
-                    0: [0],
-                    1: [0, 1, [5, 8]],
-                    2: [0, 1],
-                    3: [0, [21, 23]],
-                    90: [[0, 3], [5, 7], [21, 39]]
-                },
-                50: {
-                    0: [0],
-                    1: [[0, 19]],
-                    2: [0, [22, 38], [40, 43]],
-                    3: [0, [81, 84]]
-                },
-                51: {
-                    0: [0],
-                    1: [0, 1, [4, 8], [12, 15], [21, 24], 29, 31, 32, [81, 84]],
-                    3: [[0, 4], 11, 21, 22],
-                    4: [[0, 3], 11, 21, 22],
-                    5: [[0, 4], 21, 22, 24, 25],
-                    6: [0, 1, 3, 23, 26, [81, 83]],
-                    7: [0, 1, 3, 4, [22, 27], 81],
-                    8: [[0, 2], 11, 12, [21, 24]],
-                    9: [[0, 4], [21, 23]],
-                    10: [[0, 2], 11, 24, 25, 28],
-                    11: [[0, 2], [11, 13], 23, 24, 26, 29, 32, 33, 81],
-                    13: [[0, 4], [21, 25], 81],
-                    14: [[0, 2], [21, 25]],
-                    15: [[0, 3], [21, 29]],
-                    16: [[0, 3], [21, 23], 81],
-                    17: [[0, 3], [21, 25], 81],
-                    18: [[0, 3], [21, 27]],
-                    19: [[0, 3], [21, 23]],
-                    20: [[0, 2], 21, 22, 81],
-                    32: [0, [21, 33]],
-                    33: [0, [21, 38]],
-                    34: [0, 1, [22, 37]]
-                },
-                52: {
-                    0: [0],
-                    1: [[0, 3], [11, 15], [21, 23], 81],
-                    2: [0, 1, 3, 21, 22],
-                    3: [[0, 3], [21, 30], 81, 82],
-                    4: [[0, 2], [21, 25]],
-                    5: [[0, 2], [21, 27]],
-                    6: [[0, 3], [21, 28]],
-                    22: [0, 1, [22, 30]],
-                    23: [0, 1, [22, 28]],
-                    24: [0, 1, [22, 28]],
-                    26: [0, 1, [22, 36]],
-                    27: [[0, 2], 22, 23, [25, 32]]
-                },
-                53: {
-                    0: [0],
-                    1: [[0, 3], [11, 14], 21, 22, [24, 29], 81],
-                    3: [[0, 2], [21, 26], 28, 81],
-                    4: [[0, 2], [21, 28]],
-                    5: [[0, 2], [21, 24]],
-                    6: [[0, 2], [21, 30]],
-                    7: [[0, 2], [21, 24]],
-                    8: [[0, 2], [21, 29]],
-                    9: [[0, 2], [21, 27]],
-                    23: [0, 1, [22, 29], 31],
-                    25: [[0, 4], [22, 32]],
-                    26: [0, 1, [21, 28]],
-                    27: [0, 1, [22, 30]], 28: [0, 1, 22, 23],
-                    29: [0, 1, [22, 32]],
-                    31: [0, 2, 3, [22, 24]],
-                    34: [0, [21, 23]],
-                    33: [0, 21, [23, 25]],
-                    35: [0, [21, 28]]
-                },
-                54: {
-                    0: [0],
-                    1: [[0, 2], [21, 27]],
-                    21: [0, [21, 29], 32, 33],
-                    22: [0, [21, 29], [31, 33]],
-                    23: [0, 1, [22, 38]],
-                    24: [0, [21, 31]],
-                    25: [0, [21, 27]],
-                    26: [0, [21, 27]]
-                },
-                61: {
-                    0: [0],
-                    1: [[0, 4], [11, 16], 22, [24, 26]],
-                    2: [[0, 4], 22],
-                    3: [[0, 4], [21, 24], [26, 31]],
-                    4: [[0, 4], [22, 31], 81],
-                    5: [[0, 2], [21, 28], 81, 82],
-                    6: [[0, 2], [21, 32]],
-                    7: [[0, 2], [21, 30]],
-                    8: [[0, 2], [21, 31]],
-                    9: [[0, 2], [21, 29]],
-                    10: [[0, 2], [21, 26]]
-                },
-                62: {
-                    0: [0],
-                    1: [[0, 5], 11, [21, 23]],
-                    2: [0, 1],
-                    3: [[0, 2], 21],
-                    4: [[0, 3], [21, 23]],
-                    5: [[0, 3], [21, 25]],
-                    6: [[0, 2], [21, 23]],
-                    7: [[0, 2], [21, 25]],
-                    8: [[0, 2], [21, 26]],
-                    9: [[0, 2], [21, 24], 81, 82],
-                    10: [[0, 2], [21, 27]],
-                    11: [[0, 2], [21, 26]],
-                    12: [[0, 2], [21, 28]],
-                    24: [0, 21, [24, 29]],
-                    26: [0, 21, [23, 30]],
-                    29: [0, 1, [21, 27]],
-                    30: [0, 1, [21, 27]]
-                },
-                63: {
-                    0: [0],
-                    1: [[0, 5], [21, 23]],
-                    2: [0, 2, [21, 25]],
-                    21: [0, [21, 23], [26, 28]],
-                    22: [0, [21, 24]],
-                    23: [0, [21, 24]],
-                    25: [0, [21, 25]],
-                    26: [0, [21, 26]],
-                    27: [0, 1, [21, 26]],
-                    28: [[0, 2], [21, 23]]
-                },
-                64: {
-                    0: [0],
-                    1: [0, 1, [4, 6], 21, 22, 81],
-                    2: [[0, 3], 5, [21, 23]],
-                    3: [[0, 3], [21, 24], 81],
-                    4: [[0, 2], [21, 25]],
-                    5: [[0, 2], 21, 22]
-                },
-                65: {
-                    0: [0],
-                    1: [[0, 9], 21],
-                    2: [[0, 5]],
-                    21: [0, 1, 22, 23],
-                    22: [0, 1, 22, 23],
-                    23: [[0, 3], [23, 25], 27, 28],
-                    28: [0, 1, [22, 29]],
-                    29: [0, 1, [22, 29]],
-                    30: [0, 1, [22, 24]], 31: [0, 1, [21, 31]],
-                    32: [0, 1, [21, 27]],
-                    40: [0, 2, 3, [21, 28]],
-                    42: [[0, 2], 21, [23, 26]],
-                    43: [0, 1, [21, 26]],
-                    90: [[0, 4]], 27: [[0, 2], 22, 23]
-                },
-                71: { 0: [0] },
-                81: { 0: [0] },
-                82: { 0: [0] }
-            };
-            
-            var provincial  = parseInt(value.substr(0, 2), 10),
-                prefectural = parseInt(value.substr(2, 2), 10),
-                county      = parseInt(value.substr(4, 2), 10);
-            
-            if (!adminDivisionCodes[provincial] || !adminDivisionCodes[provincial][prefectural]) {
-                return false;
-            }
-            var inRange  = false,
-                rangeDef = adminDivisionCodes[provincial][prefectural];
-            for (var i = 0; i < rangeDef.length; i++) {
-                if (($.isArray(rangeDef[i]) && rangeDef[i][0] <= county && county <= rangeDef[i][1])
-                    || (!$.isArray(rangeDef[i]) && county === rangeDef[i]))
-                {
-                    inRange = true;
-                    break;
-                }
-            }
-
-            if (!inRange) {
-                return false;
-            }
-            
-            // Check date of birth
-            var dob;
-            if (value.length === 18) {
-                dob = value.substr(6, 8);
-            } else /* length == 15 */ { 
-                dob = '19' + value.substr(6, 6);
-            }
-            var year  = parseInt(dob.substr(0, 4), 10),
-                month = parseInt(dob.substr(4, 2), 10),
-                day   = parseInt(dob.substr(6, 2), 10);
-            if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
-                return false;
-            }
-            
-            // Check checksum (18-digit system only)
-            if (value.length === 18) {
-                var sum    = 0,
-                    weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
-                for (i = 0; i < 17; i++) {
-                    sum += parseInt(value.charAt(i), 10) * weight[i];
-                }
-                sum = (12 - (sum % 11)) % 11;
-                var checksum = (value.charAt(17).toUpperCase() !== 'X') ? parseInt(value.charAt(17), 10) : 10;
-                return checksum === sum;
-            }
-            
-            return true;
-        },
-        
-        /**
-         * Validate Czech national identification number (RC)
-         * Examples:
-         * - Valid: 7103192745, 991231123
-         * - Invalid: 1103492745, 590312123
-         *
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _cz: function(value) {
-            if (!/^\d{9,10}$/.test(value)) {
-                return false;
-            }
-            var year  = 1900 + parseInt(value.substr(0, 2), 10),
-                month = parseInt(value.substr(2, 2), 10) % 50 % 20,
-                day   = parseInt(value.substr(4, 2), 10);
-            if (value.length === 9) {
-                if (year >= 1980) {
-                    year -= 100;
-                }
-                if (year > 1953) {
-                    return false;
-                }
-            } else if (year < 1954) {
-                year += 100;
-            }
-
-            if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
-                return false;
-            }
-
-            // Check that the birth date is not in the future
-            if (value.length === 10) {
-                var check = parseInt(value.substr(0, 9), 10) % 11;
-                if (year < 1985) {
-                    check = check % 10;
-                }
-                return (check + '' === value.substr(9, 1));
-            }
-
-            return true;
-        },
-
-        /**
-         * Validate Danish Personal Identification number (CPR)
-         * Examples:
-         * - Valid: 2110625629, 211062-5629
-         * - Invalid: 511062-5629
-         *
-         * @see https://en.wikipedia.org/wiki/Personal_identification_number_(Denmark)
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _dk: function(value) {
-            if (!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(value)) {
-                return false;
-            }
-            value = value.replace(/-/g, '');
-            var day   = parseInt(value.substr(0, 2), 10),
-                month = parseInt(value.substr(2, 2), 10),
-                year  = parseInt(value.substr(4, 2), 10);
-
-            switch (true) {
-                case ('5678'.indexOf(value.charAt(6)) !== -1 && year >= 58):
-                    year += 1800;
-                    break;
-                case ('0123'.indexOf(value.charAt(6)) !== -1):
-                case ('49'.indexOf(value.charAt(6)) !== -1 && year >= 37):
-                    year += 1900;
-                    break;
-                default:
-                    year += 2000;
-                    break;
-            }
-
-            return $.fn.bootstrapValidator.helpers.date(year, month, day);
-        },
-
-        /**
-         * Validate Estonian Personal Identification Code (isikukood)
-         * Examples:
-         * - Valid: 37605030299
-         *
-         * @see http://et.wikipedia.org/wiki/Isikukood
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _ee: function(value) {
-            // Use the same format as Lithuanian Personal Code
-            return this._lt(value);
-        },
-
-        /**
-         * Validate Spanish personal identity code (DNI)
-         * Support i) DNI (for Spanish citizens) and ii) NIE (for foreign people)
-         *
-         * Examples:
-         * - Valid: i) 54362315K, 54362315-K; ii) X2482300W, X-2482300W, X-2482300-W
-         * - Invalid: i) 54362315Z; ii) X-2482300A
-         *
-         * @see https://en.wikipedia.org/wiki/National_identification_number#Spain
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _es: function(value) {
-            if (!/^[0-9A-Z]{8}[-]{0,1}[0-9A-Z]$/.test(value)                    // DNI
-                && !/^[XYZ][-]{0,1}[0-9]{7}[-]{0,1}[0-9A-Z]$/.test(value)) {    // NIE
-                return false;
-            }
-
-            value = value.replace(/-/g, '');
-            var index = 'XYZ'.indexOf(value.charAt(0));
-            if (index !== -1) {
-                // It is NIE number
-                value = index + value.substr(1) + '';
-            }
-
-            var check = parseInt(value.substr(0, 8), 10);
-            check = 'TRWAGMYFPDXBNJZSQVHLCKE'[check % 23];
-            return (check === value.substr(8, 1));
-        },
-
-        /**
-         * Validate Finnish Personal Identity Code (HETU)
-         * Examples:
-         * - Valid: 311280-888Y, 131052-308T
-         * - Invalid: 131052-308U, 310252-308Y
-         *
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _fi: function(value) {
-            if (!/^[0-9]{6}[-+A][0-9]{3}[0-9ABCDEFHJKLMNPRSTUVWXY]$/.test(value)) {
-                return false;
-            }
-            var day       = parseInt(value.substr(0, 2), 10),
-                month     = parseInt(value.substr(2, 2), 10),
-                year      = parseInt(value.substr(4, 2), 10),
-                centuries = {
-                    '+': 1800,
-                    '-': 1900,
-                    'A': 2000
-                };
-            year = centuries[value.charAt(6)] + year;
-
-            if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
-                return false;
-            }
-
-            var individual = parseInt(value.substr(7, 3), 10);
-            if (individual < 2) {
-                return false;
-            }
-            var n = value.substr(0, 6) + value.substr(7, 3) + '';
-            n = parseInt(n, 10);
-            return '0123456789ABCDEFHJKLMNPRSTUVWXY'.charAt(n % 31) === value.charAt(10);
-        },
-
-        /**
-         * Validate Croatian personal identification number (OIB)
-         * Examples:
-         * - Valid: 33392005961
-         * - Invalid: 33392005962
-         *
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _hr: function(value) {
-            if (!/^[0-9]{11}$/.test(value)) {
-                return false;
-            }
-            return $.fn.bootstrapValidator.helpers.mod11And10(value);
-        },
-
-        /**
-         * Validate Irish Personal Public Service Number (PPS)
-         * Examples:
-         * - Valid: 6433435F, 6433435FT, 6433435FW, 6433435OA, 6433435IH, 1234567TW, 1234567FA
-         * - Invalid: 6433435E, 6433435VH
-         *
-         * @see https://en.wikipedia.org/wiki/Personal_Public_Service_Number
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _ie: function(value) {
-            if (!/^\d{7}[A-W][AHWTX]?$/.test(value)) {
-                return false;
-            }
-
-            var getCheckDigit = function(value) {
-                while (value.length < 7) {
-                    value = '0' + value;
-                }
-                var alphabet = 'WABCDEFGHIJKLMNOPQRSTUV',
-                    sum      = 0;
-                for (var i = 0; i < 7; i++) {
-                    sum += parseInt(value.charAt(i), 10) * (8 - i);
-                }
-                sum += 9 * alphabet.indexOf(value.substr(7));
-                return alphabet[sum % 23];
-            };
-
-            // 2013 format
-            if (value.length === 9 && ('A' === value.charAt(8) || 'H' === value.charAt(8))) {
-                return value.charAt(7) === getCheckDigit(value.substr(0, 7) + value.substr(8) + '');
-            }
-            // The old format
-            else {
-                return value.charAt(7) === getCheckDigit(value.substr(0, 7));
-            }
-        },
-
-        /**
-         * Validate Iceland national identification number (Kennitala)
-         * Examples:
-         * - Valid: 120174-3399, 1201743399, 0902862349
-         *
-         * @see http://en.wikipedia.org/wiki/Kennitala
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _is: function(value) {
-            if (!/^[0-9]{6}[-]{0,1}[0-9]{4}$/.test(value)) {
-                return false;
-            }
-            value = value.replace(/-/g, '');
-            var day     = parseInt(value.substr(0, 2), 10),
-                month   = parseInt(value.substr(2, 2), 10),
-                year    = parseInt(value.substr(4, 2), 10),
-                century = parseInt(value.charAt(9), 10);
-
-            year = (century === 9) ? (1900 + year) : ((20 + century) * 100 + year);
-            if (!$.fn.bootstrapValidator.helpers.date(year, month, day, true)) {
-                return false;
-            }
-            // Validate the check digit
-            var sum    = 0,
-                weight = [3, 2, 7, 6, 5, 4, 3, 2];
-            for (var i = 0; i < 8; i++) {
-                sum += parseInt(value.charAt(i), 10) * weight[i];
-            }
-            sum = 11 - sum % 11;
-            return (sum + '' === value.charAt(8));
-        },
-
-        /**
-         * Validate Lithuanian Personal Code (Asmens kodas)
-         * Examples:
-         * - Valid: 38703181745
-         * - Invalid: 38703181746, 78703181745, 38703421745
-         *
-         * @see http://en.wikipedia.org/wiki/National_identification_number#Lithuania
-         * @see http://www.adomas.org/midi2007/pcode.html
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _lt: function(value) {
-            if (!/^[0-9]{11}$/.test(value)) {
-                return false;
-            }
-            var gender  = parseInt(value.charAt(0), 10),
-                year    = parseInt(value.substr(1, 2), 10),
-                month   = parseInt(value.substr(3, 2), 10),
-                day     = parseInt(value.substr(5, 2), 10),
-                century = (gender % 2 === 0) ? (17 + gender / 2) : (17 + (gender + 1) / 2);
-            year = century * 100 + year;
-            if (!$.fn.bootstrapValidator.helpers.date(year, month, day, true)) {
-                return false;
-            }
-
-            // Validate the check digit
-            var sum    = 0,
-                weight = [1, 2, 3, 4, 5, 6, 7, 8, 9, 1];
-            for (var i = 0; i < 10; i++) {
-                sum += parseInt(value.charAt(i), 10) * weight[i];
-            }
-            sum = sum % 11;
-            if (sum !== 10) {
-                return sum + '' === value.charAt(10);
-            }
-
-            // Re-calculate the check digit
-            sum    = 0;
-            weight = [3, 4, 5, 6, 7, 8, 9, 1, 2, 3];
-            for (i = 0; i < 10; i++) {
-                sum += parseInt(value.charAt(i), 10) * weight[i];
-            }
-            sum = sum % 11;
-            if (sum === 10) {
-                sum = 0;
-            }
-            return (sum + '' === value.charAt(10));
-        },
-
-        /**
-         * Validate Latvian Personal Code (Personas kods)
-         * Examples:
-         * - Valid: 161175-19997, 16117519997
-         * - Invalid: 161375-19997
-         *
-         * @see http://laacz.lv/2006/11/25/pk-parbaudes-algoritms/
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _lv: function(value) {
-            if (!/^[0-9]{6}[-]{0,1}[0-9]{5}$/.test(value)) {
-                return false;
-            }
-            value = value.replace(/\D/g, '');
-            // Check birth date
-            var day   = parseInt(value.substr(0, 2), 10),
-                month = parseInt(value.substr(2, 2), 10),
-                year  = parseInt(value.substr(4, 2), 10);
-            year = year + 1800 + parseInt(value.charAt(6), 10) * 100;
-
-            if (!$.fn.bootstrapValidator.helpers.date(year, month, day, true)) {
-                return false;
-            }
-
-            // Check personal code
-            var sum    = 0,
-                weight = [10, 5, 8, 4, 2, 1, 6, 3, 7, 9];
-            for (var i = 0; i < 10; i++) {
-                sum += parseInt(value.charAt(i), 10) * weight[i];
-            }
-            sum = (sum + 1) % 11 % 10;
-            return (sum + '' === value.charAt(10));
-        },
-
-        /**
-         * Validate Dutch national identification number (BSN)
-         * Examples:
-         * - Valid: 111222333, 941331490, 9413.31.490
-         * - Invalid: 111252333
-         *
-         * @see https://nl.wikipedia.org/wiki/Burgerservicenummer
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _nl: function(value) {
-            while (value.length < 9) {
-                value = '0' + value;
-            }
-            if (!/^[0-9]{4}[.]{0,1}[0-9]{2}[.]{0,1}[0-9]{3}$/.test(value)) {
-                return false;
-            }
-            value = value.replace(/\./g, '');
-            if (parseInt(value, 10) === 0) {
-                return false;
-            }
-            var sum    = 0,
-                length = value.length;
-            for (var i = 0; i < length - 1; i++) {
-                sum += (9 - i) * parseInt(value.charAt(i), 10);
-            }
-            sum = sum % 11;
-            if (sum === 10) {
-                sum = 0;
-            }
-            return (sum + '' === value.charAt(length - 1));
-        },
-
-        /**
-         * Validate Romanian numerical personal code (CNP)
-         * Examples:
-         * - Valid: 1630615123457, 1800101221144
-         * - Invalid: 8800101221144, 1632215123457, 1630615123458
-         *
-         * @see http://en.wikipedia.org/wiki/National_identification_number#Romania
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _ro: function(value) {
-            if (!/^[0-9]{13}$/.test(value)) {
-                return false;
-            }
-            var gender = parseInt(value.charAt(0), 10);
-            if (gender === 0 || gender === 7 || gender === 8) {
-                return false;
-            }
-
-            // Determine the date of birth
-            var year      = parseInt(value.substr(1, 2), 10),
-                month     = parseInt(value.substr(3, 2), 10),
-                day       = parseInt(value.substr(5, 2), 10),
-                // The year of date is determined base on the gender
-                centuries = {
-                    '1': 1900,  // Male born between 1900 and 1999
-                    '2': 1900,  // Female born between 1900 and 1999
-                    '3': 1800,  // Male born between 1800 and 1899
-                    '4': 1800,  // Female born between 1800 and 1899
-                    '5': 2000,  // Male born after 2000
-                    '6': 2000   // Female born after 2000
-                };
-            if (day > 31 && month > 12) {
-                return false;
-            }
-            if (gender !== 9) {
-                year = centuries[gender + ''] + year;
-                if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
-                    return false;
-                }
-            }
-
-            // Validate the check digit
-            var sum    = 0,
-                weight = [2, 7, 9, 1, 4, 6, 3, 5, 8, 2, 7, 9],
-                length = value.length;
-            for (var i = 0; i < length - 1; i++) {
-                sum += parseInt(value.charAt(i), 10) * weight[i];
-            }
-            sum = sum % 11;
-            if (sum === 10) {
-                sum = 1;
-            }
-            return (sum + '' === value.charAt(length - 1));
-        },
-
-        /**
-         * Validate Swedish personal identity number (personnummer)
-         * Examples:
-         * - Valid: 8112289874, 811228-9874, 811228+9874
-         * - Invalid: 811228-9873
-         *
-         * @see http://en.wikipedia.org/wiki/Personal_identity_number_(Sweden)
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _se: function(value) {
-            if (!/^[0-9]{10}$/.test(value) && !/^[0-9]{6}[-|+][0-9]{4}$/.test(value)) {
-                return false;
-            }
-            value = value.replace(/[^0-9]/g, '');
-
-            var year  = parseInt(value.substr(0, 2), 10) + 1900,
-                month = parseInt(value.substr(2, 2), 10),
-                day   = parseInt(value.substr(4, 2), 10);
-            if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
-                return false;
-            }
-
-            // Validate the last check digit
-            return $.fn.bootstrapValidator.helpers.luhn(value);
-        },
-
-        /**
-         * Validate Slovak national identifier number (RC)
-         * Examples:
-         * - Valid: 7103192745, 991231123
-         * - Invalid: 7103192746, 1103492745
-         *
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _sk: function(value) {
-            // Slovakia uses the same format as Czech Republic
-            return this._cz(value);
-        },
-
-        /**
-         * Validate San Marino citizen number
-         *
-         * @see http://en.wikipedia.org/wiki/National_identification_number#San_Marino
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _sm: function(value) {
-            return /^\d{5}$/.test(value);
-        },
-
-        /**
-         * Validate Thailand citizen number
-         * Examples:
-         * - Valid: 7145620509547, 3688699975685, 2368719339716
-         * - Invalid: 1100800092310
-         *
-         * @see http://en.wikipedia.org/wiki/National_identification_number#Thailand
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _th: function(value) {
-            if (value.length !== 13) {
-                return false;
-            }
-
-            var sum = 0;
-            for (var i = 0; i < 12; i++) {
-                sum += parseInt(value.charAt(i), 10) * (13 - i);
-            }
-
-            return (11 - sum % 11) % 10 === parseInt(value.charAt(12), 10);
-        },
-
-        /**
-         * Validate South African ID
-         * Example:
-         * - Valid: 8001015009087
-         * - Invalid: 8001015009287, 8001015009086
-         *
-         * @see http://en.wikipedia.org/wiki/National_identification_number#South_Africa
-         * @param {String} value The ID
-         * @returns {Boolean}
-         */
-        _za: function(value) {
-            if (!/^[0-9]{10}[0|1][8|9][0-9]$/.test(value)) {
-                return false;
-            }
-            var year        = parseInt(value.substr(0, 2), 10),
-                currentYear = new Date().getFullYear() % 100,
-                month       = parseInt(value.substr(2, 2), 10),
-                day         = parseInt(value.substr(4, 2), 10);
-            year = (year >= currentYear) ? (year + 1900) : (year + 2000);
-
-            if (!$.fn.bootstrapValidator.helpers.date(year, month, day)) {
-                return false;
-            }
-
-            // Validate the last check digit
-            return $.fn.bootstrapValidator.helpers.luhn(value);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.identical = $.extend($.fn.bootstrapValidator.i18n.identical || {}, {
-        'default': 'Please enter the same value'
-    });
-
-    $.fn.bootstrapValidator.validators.identical = {
-        html5Attributes: {
-            message: 'message',
-            field: 'field'
-        },
-
-        /**
-         * Check if input value equals to value of particular one
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Consists of the following key:
-         * - field: The name of field that will be used to compare with current one
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            var compareWith = validator.getFieldElements(options.field);
-            if (compareWith === null || compareWith.length === 0) {
-                return true;
-            }
-
-            if (value === compareWith.val()) {
-                validator.updateStatus(options.field, validator.STATUS_VALID, 'identical');
-                return true;
-            } else {
-                return false;
-            }
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.imei = $.extend($.fn.bootstrapValidator.i18n.imei || {}, {
-        'default': 'Please enter a valid IMEI number'
-    });
-
-    $.fn.bootstrapValidator.validators.imei = {
-        /**
-         * Validate IMEI (International Mobile Station Equipment Identity)
-         * Examples:
-         * - Valid: 35-209900-176148-1, 35-209900-176148-23, 3568680000414120, 490154203237518
-         * - Invalid: 490154203237517
-         *
-         * @see http://en.wikipedia.org/wiki/International_Mobile_Station_Equipment_Identity
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            switch (true) {
-                case /^\d{15}$/.test(value):
-                case /^\d{2}-\d{6}-\d{6}-\d{1}$/.test(value):
-                case /^\d{2}\s\d{6}\s\d{6}\s\d{1}$/.test(value):
-                    value = value.replace(/[^0-9]/g, '');
-                    return $.fn.bootstrapValidator.helpers.luhn(value);
-
-                case /^\d{14}$/.test(value):
-                case /^\d{16}$/.test(value):
-                case /^\d{2}-\d{6}-\d{6}(|-\d{2})$/.test(value):
-                case /^\d{2}\s\d{6}\s\d{6}(|\s\d{2})$/.test(value):
-                    return true;
-
-                default:
-                    return false;
-            }
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.imo = $.extend($.fn.bootstrapValidator.i18n.imo || {}, {
-        'default': 'Please enter a valid IMO number'
-    });
-
-    $.fn.bootstrapValidator.validators.imo = {
-        /**
-         * Validate IMO (International Maritime Organization)
-         * Examples:
-         * - Valid: IMO 8814275, IMO 9176187
-         * - Invalid: IMO 8814274
-         *
-         * @see http://en.wikipedia.org/wiki/IMO_Number
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            if (!/^IMO \d{7}$/i.test(value)) {
-                return false;
-            }
-            
-            // Grab just the digits
-            var sum    = 0,
-                digits = value.replace(/^.*(\d{7})$/, '$1');
-            
-            // Go over each char, multiplying by the inverse of it's position
-            // IMO 9176187
-            // (9 * 7) + (1 * 6) + (7 * 5) + (6 * 4) + (1 * 3) + (8 * 2) = 147
-            // Take the last digit of that, that's the check digit (7)
-            for (var i = 6; i >= 1; i--) {
-                sum += (digits.slice((6 - i), -i) * (i + 1));
-            }
-
-            return sum % 10 === parseInt(digits.charAt(6), 10);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.integer = $.extend($.fn.bootstrapValidator.i18n.integer || {}, {
-        'default': 'Please enter a valid number'
-    });
-
-    $.fn.bootstrapValidator.validators.integer = {
-        enableByHtml5: function($field) {
-            return ('number' === $field.attr('type')) && ($field.attr('step') === undefined || $field.attr('step') % 1 === 0);
-        },
-
-        /**
-         * Return true if the input value is an integer
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following key:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            if (this.enableByHtml5($field) && $field.get(0).validity && $field.get(0).validity.badInput === true) {
-                return false;
-            }
-
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-            return /^(?:-?(?:0|[1-9][0-9]*))$/.test(value);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.ip = $.extend($.fn.bootstrapValidator.i18n.ip || {}, {
-        'default': 'Please enter a valid IP address',
-        ipv4: 'Please enter a valid IPv4 address',
-        ipv6: 'Please enter a valid IPv6 address'
-    });
-
-    $.fn.bootstrapValidator.validators.ip = {
-        html5Attributes: {
-            message: 'message',
-            ipv4: 'ipv4',
-            ipv6: 'ipv6'
-        },
-
-        /**
-         * Return true if the input value is a IP address.
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - ipv4: Enable IPv4 validator, default to true
-         * - ipv6: Enable IPv6 validator, default to true
-         * - message: The invalid message
-         * @returns {Boolean|Object}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-            options = $.extend({}, { ipv4: true, ipv6: true }, options);
-
-            var ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,
-                ipv6Regex = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0- [...]
-                valid     = false,
-                message;
-
-            switch (true) {
-                case (options.ipv4 && !options.ipv6):
-                    valid   = ipv4Regex.test(value);
-                    message = options.message || $.fn.bootstrapValidator.i18n.ip.ipv4;
-                    break;
-
-                case (!options.ipv4 && options.ipv6):
-                    valid   = ipv6Regex.test(value);
-                    message = options.message || $.fn.bootstrapValidator.i18n.ip.ipv6;
-                    break;
-
-                case (options.ipv4 && options.ipv6):
-                /* falls through */
-                default:
-                    valid   = ipv4Regex.test(value) || ipv6Regex.test(value);
-                    message = options.message || $.fn.bootstrapValidator.i18n.ip['default'];
-                    break;
-            }
-
-            return {
-                valid: valid,
-                message: message
-            };
-        }
-    };
-}(window.jQuery));;(function($) {
-    $.fn.bootstrapValidator.i18n.isbn = $.extend($.fn.bootstrapValidator.i18n.isbn || {}, {
-        'default': 'Please enter a valid ISBN number'
-    });
-
-    $.fn.bootstrapValidator.validators.isbn = {
-        /**
-         * Return true if the input value is a valid ISBN 10 or ISBN 13 number
-         * Examples:
-         * - Valid:
-         * ISBN 10: 99921-58-10-7, 9971-5-0210-0, 960-425-059-0, 80-902734-1-6, 85-359-0277-5, 1-84356-028-3, 0-684-84328-5, 0-8044-2957-X, 0-85131-041-9, 0-943396-04-2, 0-9752298-0-X
-         * ISBN 13: 978-0-306-40615-7
-         * - Invalid:
-         * ISBN 10: 99921-58-10-6
-         * ISBN 13: 978-0-306-40615-6
-         *
-         * @see http://en.wikipedia.org/wiki/International_Standard_Book_Number
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} [options] Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            // http://en.wikipedia.org/wiki/International_Standard_Book_Number#Overview
-            // Groups are separated by a hyphen or a space
-            var type;
-            switch (true) {
-                case /^\d{9}[\dX]$/.test(value):
-                case (value.length === 13 && /^(\d+)-(\d+)-(\d+)-([\dX])$/.test(value)):
-                case (value.length === 13 && /^(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(value)):
-                    type = 'ISBN10';
-                    break;
-                case /^(978|979)\d{9}[\dX]$/.test(value):
-                case (value.length === 17 && /^(978|979)-(\d+)-(\d+)-(\d+)-([\dX])$/.test(value)):
-                case (value.length === 17 && /^(978|979)\s(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(value)):
-                    type = 'ISBN13';
-                    break;
-                default:
-                    return false;
-            }
-
-            // Replace all special characters except digits and X
-            value = value.replace(/[^0-9X]/gi, '');
-            var chars  = value.split(''),
-                length = chars.length,
-                sum    = 0,
-                i,
-                checksum;
-
-            switch (type) {
-                case 'ISBN10':
-                    sum = 0;
-                    for (i = 0; i < length - 1; i++) {
-                        sum += parseInt(chars[i], 10) * (10 - i);
-                    }
-                    checksum = 11 - (sum % 11);
-                    if (checksum === 11) {
-                        checksum = 0;
-                    } else if (checksum === 10) {
-                        checksum = 'X';
-                    }
-                    return (checksum + '' === chars[length - 1]);
-
-                case 'ISBN13':
-                    sum = 0;
-                    for (i = 0; i < length - 1; i++) {
-                        sum += ((i % 2 === 0) ? parseInt(chars[i], 10) : (parseInt(chars[i], 10) * 3));
-                    }
-                    checksum = 10 - (sum % 10);
-                    if (checksum === 10) {
-                        checksum = '0';
-                    }
-                    return (checksum + '' === chars[length - 1]);
-
-                default:
-                    return false;
-            }
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.isin = $.extend($.fn.bootstrapValidator.i18n.isin || {}, {
-        'default': 'Please enter a valid ISIN number'
-    });
-
-    $.fn.bootstrapValidator.validators.isin = {
-        // Available country codes
-        // See http://isin.net/country-codes/
-        COUNTRY_CODES: 'AF|AX|AL|DZ|AS|AD|AO|AI|AQ|AG|AR|AM|AW|AU|AT|AZ|BS|BH|BD|BB|BY|BE|BZ|BJ|BM|BT|BO|BQ|BA|BW|BV|BR|IO|BN|BG|BF|BI|KH|CM|CA|CV|KY|CF|TD|CL|CN|CX|CC|CO|KM|CG|CD|CK|CR|CI|HR|CU|CW|CY|CZ|DK|DJ|DM|DO|EC|EG|SV|GQ|ER|EE|ET|FK|FO|FJ|FI|FR|GF|PF|TF|GA|GM|GE|DE|GH|GI|GR|GL|GD|GP|GU|GT|GG|GN|GW|GY|HT|HM|VA|HN|HK|HU|IS|IN|ID|IR|IQ|IE|IM|IL|IT|JM|JP|JE|JO|KZ|KE|KI|KP|KR|KW|KG|LA|LV|LB|LS|LR|LY|LI|LT|LU|MO|MK|MG|MW|MY|MV|ML|MT|MH|MQ|MR|MU|YT|MX|FM|MD|MC|MN|ME|MS|MA|MZ|MM|NA|NR|NP| [...]
-
-        /**
-         * Validate an ISIN (International Securities Identification Number)
-         * Examples:
-         * - Valid: US0378331005, AU0000XVGZA3, GB0002634946
-         * - Invalid: US0378331004, AA0000XVGZA3
-         *
-         * @see http://en.wikipedia.org/wiki/International_Securities_Identifying_Number
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            value = value.toUpperCase();
-            var regex = new RegExp('^(' + this.COUNTRY_CODES + ')[0-9A-Z]{10}$');
-            if (!regex.test(value)) {
-                return false;
-            }
-
-            var converted = '',
-                length    = value.length;
-            // Convert letters to number
-            for (var i = 0; i < length - 1; i++) {
-                var c = value.charCodeAt(i);
-                converted += ((c > 57) ? (c - 55).toString() : value.charAt(i));
-            }
-
-            var digits = '',
-                n      = converted.length,
-                group  = (n % 2 !== 0) ? 0 : 1;
-            for (i = 0; i < n; i++) {
-                digits += (parseInt(converted[i], 10) * ((i % 2) === group ? 2 : 1) + '');
-            }
-
-            var sum = 0;
-            for (i = 0; i < digits.length; i++) {
-                sum += parseInt(digits.charAt(i), 10);
-            }
-            sum = (10 - (sum % 10)) % 10;
-            return sum + '' === value.charAt(length - 1);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.ismn = $.extend($.fn.bootstrapValidator.i18n.ismn || {}, {
-        'default': 'Please enter a valid ISMN number'
-    });
-
-    $.fn.bootstrapValidator.validators.ismn = {
-        /**
-         * Validate ISMN (International Standard Music Number)
-         * Examples:
-         * - Valid: M230671187, 979-0-0601-1561-5, 979 0 3452 4680 5, 9790060115615
-         * - Invalid: 9790060115614
-         *
-         * @see http://en.wikipedia.org/wiki/International_Standard_Music_Number
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            // Groups are separated by a hyphen or a space
-            var type;
-            switch (true) {
-                case /^M\d{9}$/.test(value):
-                case /^M-\d{4}-\d{4}-\d{1}$/.test(value):
-                case /^M\s\d{4}\s\d{4}\s\d{1}$/.test(value):
-                    type = 'ISMN10';
-                    break;
-                case /^9790\d{9}$/.test(value):
-                case /^979-0-\d{4}-\d{4}-\d{1}$/.test(value):
-                case /^979\s0\s\d{4}\s\d{4}\s\d{1}$/.test(value):
-                    type = 'ISMN13';
-                    break;
-                default:
-                    return false;
-            }
-
-            if ('ISMN10' === type) {
-                value = '9790' + value.substr(1);
-            }
-
-            // Replace all special characters except digits
-            value = value.replace(/[^0-9]/gi, '');
-            var length = value.length,
-                sum    = 0,
-                weight = [1, 3];
-            for (var i = 0; i < length - 1; i++) {
-                sum += parseInt(value.charAt(i), 10) * weight[i % 2];
-            }
-            sum = 10 - sum % 10;
-            return (sum + '' === value.charAt(length - 1));
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.issn = $.extend($.fn.bootstrapValidator.i18n.issn || {}, {
-        'default': 'Please enter a valid ISSN number'
-    });
-
-    $.fn.bootstrapValidator.validators.issn = {
-        /**
-         * Validate ISSN (International Standard Serial Number)
-         * Examples:
-         * - Valid: 0378-5955, 0024-9319, 0032-1478
-         * - Invalid: 0032-147X
-         *
-         * @see http://en.wikipedia.org/wiki/International_Standard_Serial_Number
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            // Groups are separated by a hyphen or a space
-            if (!/^\d{4}\-\d{3}[\dX]$/.test(value)) {
-                return false;
-            }
-
-            // Replace all special characters except digits and X
-            value = value.replace(/[^0-9X]/gi, '');
-            var chars  = value.split(''),
-                length = chars.length,
-                sum    = 0;
-
-            if (chars[7] === 'X') {
-                chars[7] = 10;
-            }
-            for (var i = 0; i < length; i++) {
-                sum += parseInt(chars[i], 10) * (8 - i);
-            }
-            return (sum % 11 === 0);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.lessThan = $.extend($.fn.bootstrapValidator.i18n.lessThan || {}, {
-        'default': 'Please enter a value less than or equal to %s',
-        notInclusive: 'Please enter a value less than %s'
-    });
-
-    $.fn.bootstrapValidator.validators.lessThan = {
-        html5Attributes: {
-            message: 'message',
-            value: 'value',
-            inclusive: 'inclusive'
-        },
-
-        enableByHtml5: function($field) {
-            var type = $field.attr('type'),
-                max  = $field.attr('max');
-            if (max && type !== 'date') {
-                return {
-                    value: max
-                };
-            }
-
-            return false;
-        },
-
-        /**
-         * Return true if the input value is less than or equal to given number
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - value: The number used to compare to. It can be
-         *      - A number
-         *      - Name of field which its value defines the number
-         *      - Name of callback function that returns the number
-         *      - A callback function that returns the number
-         *
-         * - inclusive [optional]: Can be true or false. Default is true
-         * - message: The invalid message
-         * @returns {Boolean|Object}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-            if (!$.isNumeric(value)) {
-                return false;
-            }
-
-            var compareTo = $.isNumeric(options.value) ? options.value : validator.getDynamicOption($field, options.value);
-            value = parseFloat(value);
-            return (options.inclusive === true || options.inclusive === undefined)
-                    ? {
-                        valid: value <= compareTo,
-                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.lessThan['default'], compareTo)
-                    }
-                    : {
-                        valid: value < compareTo,
-                        message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.lessThan.notInclusive, compareTo)
-                    };
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.mac = $.extend($.fn.bootstrapValidator.i18n.mac || {}, {
-        'default': 'Please enter a valid MAC address'
-    });
-
-    $.fn.bootstrapValidator.validators.mac = {
-        /**
-         * Return true if the input value is a MAC address.
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            return /^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$/.test(value);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.meid = $.extend($.fn.bootstrapValidator.i18n.meid || {}, {
-        'default': 'Please enter a valid MEID number'
-    });
-
-    $.fn.bootstrapValidator.validators.meid = {
-        /**
-         * Validate MEID (Mobile Equipment Identifier)
-         * Examples:
-         * - Valid: 293608736500703710, 29360-87365-0070-3710, AF0123450ABCDE, AF-012345-0ABCDE
-         * - Invalid: 2936087365007037101
-         *
-         * @see http://en.wikipedia.org/wiki/Mobile_equipment_identifier
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            switch (true) {
-                // 14 digit hex representation (no check digit)
-                case /^[0-9A-F]{15}$/i.test(value):
-                // 14 digit hex representation + dashes or spaces (no check digit)
-                case /^[0-9A-F]{2}[- ][0-9A-F]{6}[- ][0-9A-F]{6}[- ][0-9A-F]$/i.test(value):
-                // 18 digit decimal representation (no check digit)
-                case /^\d{19}$/.test(value):
-                // 18 digit decimal representation + dashes or spaces (no check digit)
-                case /^\d{5}[- ]\d{5}[- ]\d{4}[- ]\d{4}[- ]\d$/.test(value):
-                    // Grab the check digit
-                    var cd = value.charAt(value.length - 1);
-
-                    // Strip any non-hex chars
-                    value = value.replace(/[- ]/g, '');
-
-                    // If it's all digits, luhn base 10 is used
-                    if (value.match(/^\d*$/i)) {
-                        return $.fn.bootstrapValidator.helpers.luhn(value);
-                    }
-
-                    // Strip the check digit
-                    value = value.slice(0, -1);
-
-                    // Get every other char, and double it
-                    var cdCalc = '';
-                    for (var i = 1; i <= 13; i += 2) {
-                        cdCalc += (parseInt(value.charAt(i), 16) * 2).toString(16);
-                    }
-
-                    // Get the sum of each char in the string
-                    var sum = 0;
-                    for (i = 0; i < cdCalc.length; i++) {
-                        sum += parseInt(cdCalc.charAt(i), 16);
-                    }
-
-                    // If the last digit of the calc is 0, the check digit is 0
-                    return (sum % 10 === 0)
-                            ? (cd === '0')
-                            // Subtract it from the next highest 10s number (64 goes to 70) and subtract the sum
-                            // Double it and turn it into a hex char
-                            : (cd === ((Math.floor((sum + 10) / 10) * 10 - sum) * 2).toString(16));
-
-                // 14 digit hex representation (no check digit)
-                case /^[0-9A-F]{14}$/i.test(value):
-                // 14 digit hex representation + dashes or spaces (no check digit)
-                case /^[0-9A-F]{2}[- ][0-9A-F]{6}[- ][0-9A-F]{6}$/i.test(value):
-                // 18 digit decimal representation (no check digit)
-                case /^\d{18}$/.test(value):
-                // 18 digit decimal representation + dashes or spaces (no check digit)
-                case /^\d{5}[- ]\d{5}[- ]\d{4}[- ]\d{4}$/.test(value):
-                    return true;
-
-                default:
-                    return false;
-            }
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.notEmpty = $.extend($.fn.bootstrapValidator.i18n.notEmpty || {}, {
-        'default': 'Please enter a value'
-    });
-
-    $.fn.bootstrapValidator.validators.notEmpty = {
-        enableByHtml5: function($field) {
-            var required = $field.attr('required') + '';
-            return ('required' === required || 'true' === required);
-        },
-
-        /**
-         * Check if input value is empty or not
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var type = $field.attr('type');
-            if ('radio' === type || 'checkbox' === type) {
-                return validator
-                            .getFieldElements($field.attr('data-bv-field'))
-                            .filter(':checked')
-                            .length > 0;
-            }
-
-            if ('number' === type && $field.get(0).validity && $field.get(0).validity.badInput === true) {
-                return true;
-            }
-
-            return $.trim($field.val()) !== '';
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.numeric = $.extend($.fn.bootstrapValidator.i18n.numeric || {}, {
-        'default': 'Please enter a valid float number'
-    });
-
-    $.fn.bootstrapValidator.validators.numeric = {
-        html5Attributes: {
-            message: 'message',
-            separator: 'separator'
-        },
-
-        enableByHtml5: function($field) {
-            return ('number' === $field.attr('type')) && ($field.attr('step') !== undefined) && ($field.attr('step') % 1 !== 0);
-        },
-
-        /**
-         * Validate decimal number
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Consist of key:
-         * - message: The invalid message
-         * - separator: The decimal separator. Can be "." (default), ","
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            if (this.enableByHtml5($field) && $field.get(0).validity && $field.get(0).validity.badInput === true) {
-                return false;
-            }
-
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-            var separator = options.separator || '.';
-            if (separator !== '.') {
-                value = value.replace(separator, '.');
-            }
-
-            return !isNaN(parseFloat(value)) && isFinite(value);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.phone = $.extend($.fn.bootstrapValidator.i18n.phone || {}, {
-        'default': 'Please enter a valid phone number',
-        countryNotSupported: 'The country code %s is not supported',
-        country: 'Please enter a valid phone number in %s',
-        countries: {
-            BR: 'Brazil',
-            CN: 'China',
-            CZ: 'Czech Republic',
-            DK: 'Denmark',
-            ES: 'Spain',
-            FR: 'France',
-            GB: 'United Kingdom',
-            MA: 'Morocco',
-            PK: 'Pakistan',
-            RO: 'Romania',
-            RU: 'Russia',
-            SK: 'Slovakia',
-            TH: 'Thailand',
-            US: 'USA',
-            VE: 'Venezuela'
-        }
-    });
-
-    $.fn.bootstrapValidator.validators.phone = {
-        html5Attributes: {
-            message: 'message',
-            country: 'country'
-        },
-
-        // The supported countries
-        COUNTRY_CODES: ['BR', 'CN', 'CZ', 'DK', 'ES', 'FR', 'GB', 'MA', 'PK', 'RO', 'RU', 'SK', 'TH', 'US', 'VE'],
-
-        /**
-         * Return true if the input value contains a valid phone number for the country
-         * selected in the options
-         *
-         * @param {BootstrapValidator} validator Validate plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Consist of key:
-         * - message: The invalid message
-         * - country: The ISO-3166 country code. It can be
-         *      - A country code
-         *      - Name of field which its value defines the country code
-         *      - Name of callback function that returns the country code
-         *      - A callback function that returns the country code
-         *
-         * @returns {Boolean|Object}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            var country = options.country;
-            if (typeof country !== 'string' || $.inArray(country, this.COUNTRY_CODES) === -1) {
-                // Try to determine the country
-                country = validator.getDynamicOption($field, country);
-            }
-
-            if (!country || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
-                return {
-                    valid: false,
-                    message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.phone.countryNotSupported, country)
-                };
-            }
-
-            var isValid = true;
-            switch (country.toUpperCase()) {
-                case 'BR':
-                    // Test: http://regexr.com/399m1
-                    value   = $.trim(value);
-                    isValid = (/^(([\d]{4}[-.\s]{1}[\d]{2,3}[-.\s]{1}[\d]{2}[-.\s]{1}[\d]{2})|([\d]{4}[-.\s]{1}[\d]{3}[-.\s]{1}[\d]{4})|((\(?\+?[0-9]{2}\)?\s?)?(\(?\d{2}\)?\s?)?\d{4,5}[-.\s]?\d{4}))$/).test(value);
-                    break;
-
-                case 'CN':
-                    // http://regexr.com/39dq4
-                    value   = $.trim(value);
-                    isValid = (/^((00|\+)?(86(?:-| )))?((\d{11})|(\d{3}[- ]{1}\d{4}[- ]{1}\d{4})|((\d{2,4}[- ]){1}(\d{7,8}|(\d{3,4}[- ]{1}\d{4}))([- ]{1}\d{1,4})?))$/).test(value);
-                    break;
-
-                case 'CZ':
-                    // Test: http://regexr.com/39hhl
-                    isValid = /^(((00)([- ]?)|\+)(420)([- ]?))?((\d{3})([- ]?)){2}(\d{3})$/.test(value);
-                    break;
-
-                case 'DK':
-                    // Mathing DK phone numbers with country code in 1 of 3 formats and an
-                    // 8 digit phone number not starting with a 0 or 1. Can have 1 space
-                    // between each character except inside the country code.
-                    // Test: http://regex101.com/r/sS8fO4/1
-                    value   = $.trim(value);
-                    isValid = (/^(\+45|0045|\(45\))?\s?[2-9](\s?\d){7}$/).test(value);
-                    break;
-
-                case 'ES':
-                    // http://regex101.com/r/rB9mA9/1
-                    value   = $.trim(value);
-                    isValid = (/^(?:(?:(?:\+|00)34\D?))?(?:9|6)(?:\d\D?){8}$/).test(value);
-                    break;
-
-                case 'FR':
-                    // http://regexr.com/39a2p
-                    value   = $.trim(value);
-                    isValid = (/^(?:(?:(?:\+|00)33[ ]?(?:\(0\)[ ]?)?)|0){1}[1-9]{1}([ .-]?)(?:\d{2}\1?){3}\d{2}$/).test(value);
-                    break;
-
-            	case 'GB':
-            		// http://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers#Match_GB_telephone_number_in_any_format
-            		// Test: http://regexr.com/38uhv
-            		value   = $.trim(value);
-            		isValid = (/^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$/).test(value);
-                    break;
-
-                case 'MA':
-                    // http://en.wikipedia.org/wiki/Telephone_numbers_in_Morocco
-                    // Test: http://regexr.com/399n8
-                    value   = $.trim(value);
-                    isValid = (/^(?:(?:(?:\+|00)212[\s]?(?:[\s]?\(0\)[\s]?)?)|0){1}(?:5[\s.-]?[2-3]|6[\s.-]?[13-9]){1}[0-9]{1}(?:[\s.-]?\d{2}){3}$/).test(value);
-                    break;
-
-                case 'PK':
-                    // http://regex101.com/r/yH8aV9/2
-                    value   = $.trim(value);
-                    isValid = (/^0?3[0-9]{2}[0-9]{7}$/).test(value);
-                    break;
-
-        		case 'RO':
-        		    // All mobile network and land line
-                    // http://regexr.com/39fv1
-        		    isValid = (/^(\+4|)?(07[0-8]{1}[0-9]{1}|02[0-9]{2}|03[0-9]{2}){1}?(\s|\.|\-)?([0-9]{3}(\s|\.|\-|)){2}$/g).test(value);
-        		    break;
-
-                case 'RU':
-                    // http://regex101.com/r/gW7yT5/5
-                    isValid = (/^((8|\+7|007)[\-\.\/ ]?)?([\(\/\.]?\d{3}[\)\/\.]?[\-\.\/ ]?)?[\d\-\.\/ ]{7,10}$/g).test(value);
-                    break;
-
-                case 'SK':
-                    // Test: http://regexr.com/39hhl
-                    isValid = /^(((00)([- ]?)|\+)(420)([- ]?))?((\d{3})([- ]?)){2}(\d{3})$/.test(value);
-                    break;
-
-                case 'TH':
-        		    // http://regex101.com/r/vM5mZ4/2
-        		    isValid = (/^0\(?([6|8-9]{2})*-([0-9]{3})*-([0-9]{4})$/).test(value);
-        		    break;
-
-                case 'VE':
-                    // http://regex101.com/r/eM2yY0/6
-                    value   = $.trim(value);
-                    isValid = (/^0(?:2(?:12|4[0-9]|5[1-9]|6[0-9]|7[0-8]|8[1-35-8]|9[1-5]|3[45789])|4(?:1[246]|2[46]))\d{7}$/).test(value);
-                    break;
-
-                case 'US':
-                /* falls through */
-                default:
-                    // Make sure US phone numbers have 10 digits
-                    // May start with 1, +1, or 1-; should discard
-                    // Area code may be delimited with (), & sections may be delimited with . or -
-                    // Test: http://regexr.com/38mqi
-                    value   = value.replace(/\D/g, '');
-                    isValid = (/^(?:(1\-?)|(\+1 ?))?\(?(\d{3})[\)\-\.]?(\d{3})[\-\.]?(\d{4})$/).test(value) && (value.length === 10);
-                    break;
-            }
-
-            return {
-                valid: isValid,
-                message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.phone.country, $.fn.bootstrapValidator.i18n.phone.countries[country])
-            };
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.regexp = $.extend($.fn.bootstrapValidator.i18n.regexp || {}, {
-        'default': 'Please enter a value matching the pattern'
-    });
-
-    $.fn.bootstrapValidator.validators.regexp = {
-        html5Attributes: {
-            message: 'message',
-            regexp: 'regexp'
-        },
-
-        enableByHtml5: function($field) {
-            var pattern = $field.attr('pattern');
-            if (pattern) {
-                return {
-                    regexp: pattern
-                };
-            }
-
-            return false;
-        },
-
-        /**
-         * Check if the element value matches given regular expression
-         *
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Consists of the following key:
-         * - regexp: The regular expression you need to check
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            var regexp = ('string' === typeof options.regexp) ? new RegExp(options.regexp) : options.regexp;
-            return regexp.test(value);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.remote = $.extend($.fn.bootstrapValidator.i18n.remote || {}, {
-        'default': 'Please enter a valid value'
-    });
-
-    $.fn.bootstrapValidator.validators.remote = {
-        html5Attributes: {
-            message: 'message',
-            name: 'name',
-            type: 'type',
-            url: 'url',
-            delay: 'delay'
-        },
-
-        /**
-         * Destroy the timer when destroying the bootstrapValidator (using validator.destroy() method)
-         */
-        destroy: function(validator, $field, options) {
-            if ($field.data('bv.remote.timer')) {
-                clearTimeout($field.data('bv.remote.timer'));
-                $field.removeData('bv.remote.timer');
-            }
-        },
-
-        /**
-         * Request a remote server to check the input value
-         *
-         * @param {BootstrapValidator} validator Plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - url {String|Function}
-         * - type {String} [optional] Can be GET or POST (default)
-         * - data {Object|Function} [optional]: By default, it will take the value
-         *  {
-         *      <fieldName>: <fieldValue>
-         *  }
-         * - delay
-         * - name {String} [optional]: Override the field name for the request.
-         * - message: The invalid message
-         * - headers: Additional headers
-         * @returns {Deferred}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val(),
-                dfd   = new $.Deferred();
-            if (value === '') {
-                dfd.resolve($field, 'remote', { valid: true });
-                return dfd;
-            }
-
-            var name    = $field.attr('data-bv-field'),
-                data    = options.data || {},
-                url     = options.url,
-                type    = options.type || 'GET',
-                headers = options.headers || {};
-
-            // Support dynamic data
-            if ('function' === typeof data) {
-                data = data.call(this, validator);
-            }
-
-            // Support dynamic url
-            if ('function' === typeof url) {
-                url = url.call(this, validator);
-            }
-
-            data[options.name || name] = value;
-            function runCallback() {
-                var xhr = $.ajax({
-                    type: type,
-                    headers: headers,
-                    url: url,
-                    dataType: 'json',
-                    data: data
-                });
-                xhr.then(function(response) {
-                    response.valid = response.valid === true || response.valid === 'true';
-                    dfd.resolve($field, 'remote', response);
-                });
-
-                dfd.fail(function() {
-                    xhr.abort();
-                });
-
-                return dfd;
-            }
-            
-            if (options.delay) {
-                // Since the form might have multiple fields with the same name
-                // I have to attach the timer to the field element
-                if ($field.data('bv.remote.timer')) {
-                    clearTimeout($field.data('bv.remote.timer'));
-                }
-
-                $field.data('bv.remote.timer', setTimeout(runCallback, options.delay));
-                return dfd;
-            } else {
-                return runCallback();
-            }
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.rtn = $.extend($.fn.bootstrapValidator.i18n.rtn || {}, {
-        'default': 'Please enter a valid RTN number'
-    });
-
-    $.fn.bootstrapValidator.validators.rtn = {
-        /**
-         * Validate a RTN (Routing transit number)
-         * Examples:
-         * - Valid: 021200025, 789456124
-         *
-         * @see http://en.wikipedia.org/wiki/Routing_transit_number
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            if (!/^\d{9}$/.test(value)) {
-                return false;
-            }
-
-            var sum = 0;
-            for (var i = 0; i < value.length; i += 3) {
-                sum += parseInt(value.charAt(i),     10) * 3
-                    +  parseInt(value.charAt(i + 1), 10) * 7
-                    +  parseInt(value.charAt(i + 2), 10);
-            }
-            return (sum !== 0 && sum % 10 === 0);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.sedol = $.extend($.fn.bootstrapValidator.i18n.sedol || {}, {
-        'default': 'Please enter a valid SEDOL number'
-    });
-
-    $.fn.bootstrapValidator.validators.sedol = {
-        /**
-         * Validate a SEDOL (Stock Exchange Daily Official List)
-         * Examples:
-         * - Valid: 0263494, B0WNLY7
-         *
-         * @see http://en.wikipedia.org/wiki/SEDOL
-         * @param {BootstrapValidator} validator The validator plugin instance
-         * @param {jQuery} $field Field element
-         * @param {Object} options Can consist of the following keys:
-         * - message: The invalid message
-         * @returns {Boolean}
-         */
-        validate: function(validator, $field, options) {
-            var value = $field.val();
-            if (value === '') {
-                return true;
-            }
-
-            value = value.toUpperCase();
-            if (!/^[0-9A-Z]{7}$/.test(value)) {
-                return false;
-            }
-
-            var sum    = 0,
-                weight = [1, 3, 1, 7, 3, 9, 1],
-                length = value.length;
-            for (var i = 0; i < length - 1; i++) {
-	            sum += weight[i] * parseInt(value.charAt(i), 36);
-	        }
-	        sum = (10 - sum % 10) % 10;
-            return sum + '' === value.charAt(length - 1);
-        }
-    };
-}(window.jQuery));
-;(function($) {
-    $.fn.bootstrapValidator.i18n.siren = $.extend($.fn.bootstrapValidator.i18n.siren || {}, {
-        'default': 'Please enter a valid SIREN number'
-    });
-
-	$.fn.bootstrapValidator.validators.siren = {
-		/**
-		 * Check if a string is a siren number
-		 *
-		 * @param {BootstrapValidator} validator The validator plugin instance
-		 * @param {jQuery} $field Field element
-		 * @param {Object} options Consist of key:
-         * - message: The invalid message
-		 * @returns {Boolean}
-		 */
-		validate: function(validator, $field, options) {
-			var value = $field.val();
-			if (value === '') {
-				return true;
-			}
-
-            if (!/^\d{9}$/.test(value)) {
-                return false;
-            }
-            return $.fn.bootstrapValidator.helpers.luhn(value);
-		}
-	};
-}(window.jQuery));
... 27296 lines suppressed ...