http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.ar.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.ar.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.ar.js
new file mode 100644
index 0000000..12ae182
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.ar.js
@@ -0,0 +1,15 @@
+/**
+ * Arabic translation for bootstrap-datepicker
+ * Mohammed Alshehri <[email protected]>
+ */
+;(function($){
+    $.fn.datepicker.dates['ar'] = {
+        days: ["الأحد", "الاثنين", "الثلاثاء", 
"الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"],
+        daysShort: ["أحد", "اثنين", "ثلاثاء", "أربعاء", 
"خميس", "جمعة", "سبت", "أحد"],
+        daysMin: ["ح", "ن", "ث", "ع", "خ", "ج", "س", "ح"],
+        months: ["يناير", "فبراير", "مارس", "أبريل", "م
ايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", 
"أكتوبر", "نوفمبر", "ديسمبر"],
+        monthsShort: ["يناير", "فبراير", "مارس", "أبريل", 
"مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", 
"أكتوبر", "نوفمبر", "ديسمبر"],
+        today: "هذا اليوم",
+        rtl: true
+    };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.bg.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.bg.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.bg.js
new file mode 100644
index 0000000..6837afd
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.bg.js
@@ -0,0 +1,14 @@
+/**
+ * Bulgarian translation for bootstrap-datepicker
+ * Apostol Apostolov <[email protected]>
+ */
+;(function($){
+       $.fn.datepicker.dates['bg'] = {
+               days: ["Неделя", "Понеделник", 
"Вторник", "Сряда", "Четвъртък", "Петък", 
"Събота", "Неделя"],
+               daysShort: ["Нед", "Пон", "Вто", "Сря", "Чет", 
"Пет", "Съб", "Нед"],
+               daysMin: ["Н", "П", "В", "С", "Ч", "П", "С", "Н"],
+               months: ["Януари", "Февруари", "Март", 
"Април", "Май", "Юни", "Юли", "Август", 
"Септември", "Октомври", "Ноември", "Декември"],
+               monthsShort: ["Ян", "Фев", "Мар", "Апр", "Май", 
"Юни", "Юли", "Авг", "Сеп", "Окт", "Ное", "Дек"],
+               today: "днес"
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.es.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.es.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.es.js
new file mode 100644
index 0000000..7217690
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.es.js
@@ -0,0 +1,14 @@
+/**
+ * Spanish translation for bootstrap-datepicker
+ * Bruno Bonamin <[email protected]>
+ */
+;(function($){
+       $.fn.datepicker.dates['es'] = {
+               days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", 
"Viernes", "Sábado", "Domingo"],
+               daysShort: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb", 
"Dom"],
+               daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa", "Do"],
+               months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", 
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
+               monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", 
"Ago", "Sep", "Oct", "Nov", "Dic"],
+               today: "Hoy"
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.et.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.et.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.et.js
new file mode 100644
index 0000000..87c812e
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.et.js
@@ -0,0 +1,18 @@
+/**
+ * Estonian translation for bootstrap-datepicker
+ * Ando Roots <https://github.com/anroots>
+ * Fixes by Illimar Tambek <<https://github.com/ragulka>
+ */
+;(function($){
+       $.fn.datepicker.dates['et'] = {
+               days: ["Pühapäev", "Esmaspäev", "Teisipäev", "Kolmapäev", 
"Neljapäev", "Reede", "Laupäev", "Pühapäev"],
+               daysShort: ["Pühap", "Esmasp", "Teisip", "Kolmap", "Neljap", 
"Reede", "Laup", "Pühap"],
+               daysMin: ["P", "E", "T", "K", "N", "R", "L", "P"],
+               months: ["Jaanuar", "Veebruar", "Märts", "Aprill", "Mai", 
"Juuni", "Juuli", "August", "September", "Oktoober", "November", "Detsember"],
+               monthsShort: ["Jaan", "Veebr", "Märts", "Apr", "Mai", "Juuni", 
"Juuli", "Aug", "Sept", "Okt", "Nov", "Dets"],
+               today: "Täna",
+               clear: "Tühjenda",
+               weekStart: 1,
+               format: "dd.mm.yyyy"
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.fi.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.fi.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.fi.js
new file mode 100644
index 0000000..01f40dc
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.fi.js
@@ -0,0 +1,16 @@
+/**
+ * Finnish translation for bootstrap-datepicker
+ * Jaakko Salonen <https://github.com/jsalonen>
+ */
+;(function($){
+       $.fn.datepicker.dates['fi'] = {
+               days: ["sunnuntai", "maanantai", "tiistai", "keskiviikko", 
"torstai", "perjantai", "lauantai", "sunnuntai"],
+               daysShort: ["sun", "maa", "tii", "kes", "tor", "per", "lau", 
"sun"],
+               daysMin: ["su", "ma", "ti", "ke", "to", "pe", "la", "su"],
+               months: ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", 
"toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", 
"marraskuu", "joulukuu"],
+               monthsShort: ["tam", "hel", "maa", "huh", "tou", "kes", "hei", 
"elo", "syy", "lok", "mar", "jou"],
+               today: "tänään",
+               weekStart: 1,
+               format: "d.m.yyyy"
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.hu.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.hu.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.hu.js
new file mode 100644
index 0000000..bf5308a
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.hu.js
@@ -0,0 +1,16 @@
+/**
+ * Hungarian translation for bootstrap-datepicker
+ * Sotus László <[email protected]>
+ */
+;(function($){
+  $.fn.datepicker.dates['hu'] = {
+               days: ["Vasárnap", "Hétfő", "Kedd", "Szerda", 
"Csütörtök", "Péntek", "Szombat", "Vasárnap"],
+               daysShort: ["Vas", "Hét", "Ked", "Sze", "Csü", "Pén", "Szo", 
"Vas"],
+               daysMin: ["Va", "Hé", "Ke", "Sz", "Cs", "Pé", "Sz", "Va"],
+               months: ["Január", "Február", "Március", "Április", 
"Május", "Június", "Július", "Augusztus", "Szeptember", "Október", 
"November", "December"],
+               monthsShort: ["Jan", "Feb", "Már", "Ápr", "Máj", "Jún", 
"Júl", "Aug", "Sze", "Okt", "Nov", "Dec"],
+               today: "Ma",
+               weekStart: 1,
+               format: "yyyy.mm.dd"
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.id.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.id.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.id.js
new file mode 100644
index 0000000..aae6e89
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.id.js
@@ -0,0 +1,15 @@
+/**
+ * Bahasa translation for bootstrap-datepicker
+ * Azwar Akbar <[email protected]>
+ */
+;(function($){
+       $.fn.datepicker.dates['id'] = {
+               days: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", 
"Sabtu", "Minggu"],
+               daysShort: ["Mgu", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab", 
"Mgu"],
+               daysMin: ["Mg", "Sn", "Sl", "Ra", "Ka", "Ju", "Sa", "Mg"],
+               months: ["Januari", "Februari", "Maret", "April", "Mei", 
"Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"],
+               monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", 
"Ags", "Sep", "Okt", "Nov", "Des"],
+               today: "Hari Ini",
+               clear: "Kosongkan"
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.is.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.is.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.is.js
new file mode 100644
index 0000000..0e57a91
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.is.js
@@ -0,0 +1,14 @@
+/**
+ * Icelandic translation for bootstrap-datepicker
+ * Hinrik Örn Sigurðsson <[email protected]>
+ */
+;(function($){
+       $.fn.datepicker.dates['is'] = {
+               days: ["Sunnudagur", "Mánudagur", "Þriðjudagur", 
"Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur", "Sunnudagur"],
+               daysShort: ["Sun", "Mán", "Þri", "Mið", "Fim", "Fös", 
"Lau", "Sun"],
+               daysMin: ["Su", "Má", "Þr", "Mi", "Fi", "Fö", "La", "Su"],
+               months: ["Janúar", "Febrúar", "Mars", "Apríl", "Maí", 
"Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", 
"Desember"],
+               monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maí", "Jún", 
"Júl", "Ágú", "Sep", "Okt", "Nóv", "Des"],
+               today: "Í Dag"
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js
new file mode 100644
index 0000000..ee4201a
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.nl-BE.js
@@ -0,0 +1,17 @@
+/**
+ * Belgium-Dutch translation for bootstrap-datepicker
+ * Julien Poulin <[email protected]>
+ */
+;(function($){
+  $.fn.datepicker.dates['nl-BE'] = {
+    days: ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag", 
"Zaterdag", "Zondag"],
+    daysShort: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"],
+    daysMin: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"],
+    months: ["Januari", "Februari", "Maart", "April", "Mei", "Juni", "Juli", 
"Augustus", "September", "Oktober", "November", "December"],
+    monthsShort: ["Jan", "Feb", "Mrt", "Apr", "Mei", "Jun", "Jul", "Aug", 
"Sep", "Okt", "Nov", "Dec"],
+    today: "Vandaag",
+    clear: "Leegmaken",
+    weekStart: 1,
+    format: "dd/mm/yyyy"
+  };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.nl.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.nl.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.nl.js
new file mode 100644
index 0000000..13a2f1a
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.nl.js
@@ -0,0 +1,14 @@
+/**
+ * Dutch translation for bootstrap-datepicker
+ * Reinier Goltstein <[email protected]>
+ */
+;(function($){
+       $.fn.datepicker.dates['nl'] = {
+               days: ["Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", 
"Vrijdag", "Zaterdag", "Zondag"],
+               daysShort: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"],
+               daysMin: ["Zo", "Ma", "Di", "Wo", "Do", "Vr", "Za", "Zo"],
+               months: ["Januari", "Februari", "Maart", "April", "Mei", 
"Juni", "Juli", "Augustus", "September", "Oktober", "November", "December"],
+               monthsShort: ["Jan", "Feb", "Mrt", "Apr", "Mei", "Jun", "Jul", 
"Aug", "Sep", "Okt", "Nov", "Dec"],
+               today: "Vandaag"
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.ro.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.ro.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.ro.js
new file mode 100644
index 0000000..e1e65df
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.ro.js
@@ -0,0 +1,16 @@
+/**
+ * Romanian translation for bootstrap-datepicker
+ * Cristian Vasile <[email protected]>
+ */
+;(function($){
+       $.fn.datepicker.dates['ro'] = {
+               days: ["Duminică", "Luni", "Marţi", "Miercuri", "Joi", 
"Vineri", "Sâmbătă", "Duminică"],
+               daysShort: ["Dum", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", 
"Dum"],
+               daysMin: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sâ", "Du"],
+               months: ["Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", 
"Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", 
"Decembrie"],
+               monthsShort: ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", 
"Aug", "Sep", "Oct", "Nov", "Dec"],
+               today: "Astăzi",
+               clear: "Șterge",
+               weekStart: 1
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.sk.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.sk.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.sk.js
new file mode 100644
index 0000000..c48032a
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.sk.js
@@ -0,0 +1,15 @@
+/**
+ * Slovak translation for bootstrap-datepicker
+ * Marek Lichtner <[email protected]>
+ * Fixes by Michal RemiÅ¡ <[email protected]>
+ */
+;(function($){
+       $.fn.datepicker.dates["sk"] = {
+               days: ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", 
"Piatok", "Sobota", "Nedeľa"],
+               daysShort: ["Ned", "Pon", "Uto", "Str", "Å tv", "Pia", "Sob", 
"Ned"],
+               daysMin: ["Ne", "Po", "Ut", "St", "Å t", "Pia", "So", "Ne"],
+               months: ["Január", "Február", "Marec", "Apríl", "Máj", 
"Jún", "Júl", "August", "September", "Október", "November", "December"],
+               monthsShort: ["Jan", "Feb", "Mar", "Apr", "Máj", "Jún", 
"Júl", "Aug", "Sep", "Okt", "Nov", "Dec"],
+               today: "Dnes"
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.tr.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.tr.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.tr.js
new file mode 100644
index 0000000..2be8b6d
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.tr.js
@@ -0,0 +1,16 @@
+/**
+ * Turkish translation for bootstrap-datepicker
+ * Serkan Algur <[email protected]>
+ */
+;(function($){
+       $.fn.datepicker.dates['tr'] = {
+               days: ["Pazar", "Pazartesi", "Salı", "Çarşamba", 
"Perşembe", "Cuma", "Cumartesi", "Pazar"],
+               daysShort: ["Pz", "Pzt", "Sal", "Çrş", "Prş", "Cu", "Cts", 
"Pz"],
+               daysMin: ["Pz", "Pzt", "Sa", "Çr", "Pr", "Cu", "Ct", "Pz"],
+               months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", 
"Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
+               monthsShort: ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", 
"Ağu", "Eyl", "Eki", "Kas", "Ara"],
+               today: "Bugün",
+               format: "dd.mm.yyyy"
+       };
+}(jQuery));
+

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js
new file mode 100644
index 0000000..d6625ec
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js
@@ -0,0 +1,16 @@
+/**
+ * Simplified Chinese translation for bootstrap-datepicker
+ * Yuan Cheung <[email protected]>
+ */
+;(function($){
+       $.fn.datepicker.dates['zh-CN'] = {
+               days: ["星期日", "星期一", "星期二", "星期三", 
"星期四", "星期五", "星期六", "星期日"],
+               daysShort: ["周日", "周一", "周二", "周三", "周四", 
"周五", "周六", "周日"],
+               daysMin:  ["日", "一", "二", "三", "四", "五", "六", 
"日"],
+               months: ["一月", "二月", "三月", "四月", "五月", "å…
­æœˆ", "七月", "八月", "九月", "十月", "十一月", "十二月"],
+               monthsShort: ["一月", "二月", "三月", "四月", "五月", 
"六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
+               today: "今日",
+               format: "yyyy年mm月dd日",
+               weekStart: 1
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js
new file mode 100644
index 0000000..53337ae
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/datepicker/locales/bootstrap-datepicker.zh-TW.js
@@ -0,0 +1,17 @@
+/**
+ * Traditional Chinese translation for bootstrap-datepicker
+ * Rung-Sheng Jang <[email protected]>
+ * FrankWu  <[email protected]> Fix more appropriate use of Traditional 
Chinese habit
+ */
+;(function($){
+       $.fn.datepicker.dates['zh-TW'] = {
+               days: ["星期日", "星期一", "星期二", "星期三", 
"星期四", "星期五", "星期六", "星期日"],
+               daysShort: ["週日", "週一", "週二", "週三", "週四", 
"週五", "週六", "週日"],
+               daysMin:  ["日", "一", "二", "三", "四", "五", "六", 
"日"],
+               months: ["一月", "二月", "三月", "四月", "五月", "å…
­æœˆ", "七月", "八月", "九月", "十月", "十一月", "十二月"],
+               monthsShort: ["一月", "二月", "三月", "四月", "五月", 
"六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
+               today: "今天",
+               format: "yyyy年mm月dd日",
+               weekStart: 1
+       };
+}(jQuery));

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/daterangepicker/daterangepicker-bs3.css
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/daterangepicker/daterangepicker-bs3.css
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/daterangepicker/daterangepicker-bs3.css
new file mode 100755
index 0000000..7a501fb
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/daterangepicker/daterangepicker-bs3.css
@@ -0,0 +1,335 @@
+/*!
+ * Stylesheet for the Date Range Picker, for use with Bootstrap 3.x
+ *
+ * Copyright 2013-2015 Dan Grossman ( http://www.dangrossman.info )
+ * Licensed under the MIT license. See 
http://www.opensource.org/licenses/mit-license.php
+ *
+ * Built for http://www.improvely.com
+ */
+
+ .daterangepicker.dropdown-menu {
+  max-width: none;
+  z-index: 3000;
+}
+
+.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar {
+  float: left;
+  margin: 4px;
+}
+
+.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar,
+.daterangepicker.openscenter .ranges, .daterangepicker.openscenter .calendar {
+  float: right;
+  margin: 4px;
+}
+
+.daterangepicker.single .ranges, .daterangepicker.single .calendar {
+  float: none;
+}
+
+.daterangepicker .ranges {
+  width: 160px;
+  text-align: left;
+}
+
+.daterangepicker .ranges .range_inputs>div {
+  float: left;
+}
+
+.daterangepicker .ranges .range_inputs>div:nth-child(2) {
+  padding-left: 11px;
+}
+
+.daterangepicker .calendar {
+  display: none;
+  max-width: 270px;
+}
+
+.daterangepicker.show-calendar .calendar {
+    display: block;
+}
+
+.daterangepicker .calendar.single .calendar-date {
+  border: none;
+}
+
+.daterangepicker .calendar th, .daterangepicker .calendar td {
+  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+  white-space: nowrap;
+  text-align: center;
+  min-width: 32px;
+}
+
+.daterangepicker .daterangepicker_start_input label,
+.daterangepicker .daterangepicker_end_input label {
+  color: #333;
+  display: block;
+  font-size: 11px;
+  font-weight: normal;
+  height: 20px;
+  line-height: 20px;
+  margin-bottom: 2px;
+  text-shadow: #fff 1px 1px 0px;
+  text-transform: uppercase;
+  width: 74px;
+}
+
+.daterangepicker .ranges input {
+  font-size: 11px;
+}
+
+.daterangepicker .ranges .input-mini {
+  border: 1px solid #ccc;
+  border-radius: 4px;
+  color: #555;
+  display: block;
+  font-size: 11px;
+  height: 30px;
+  line-height: 30px;
+  vertical-align: middle;
+  margin: 0 0 10px 0;
+  padding: 0 6px;
+  width: 74px;
+}
+
+.daterangepicker .ranges ul {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+
+.daterangepicker .ranges li {
+  font-size: 13px;
+  background: #f5f5f5;
+  border: 1px solid #f5f5f5;
+  color: #08c;
+  padding: 3px 12px;
+  margin-bottom: 8px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+  cursor: pointer;
+}
+
+.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover {
+  background: #08c;
+  border: 1px solid #08c;
+  color: #fff;
+}
+
+.daterangepicker .calendar-date {
+  border: 1px solid #ddd;
+  padding: 4px;
+  border-radius: 4px;
+  background: #fff;
+}
+
+.daterangepicker .calendar-time {
+  text-align: center;
+  margin: 8px auto 0 auto;
+  line-height: 30px;
+}
+
+.daterangepicker {
+  position: absolute;
+  background: #fff;
+  top: 100px;
+  left: 20px;
+  padding: 4px;
+  margin-top: 1px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+
+.daterangepicker.opensleft:before {
+  position: absolute;
+  top: -7px;
+  right: 9px;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.daterangepicker.opensleft:after {
+  position: absolute;
+  top: -6px;
+  right: 10px;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #fff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.daterangepicker.openscenter:before {
+  position: absolute;
+  top: -7px;
+  left: 0;  
+  right: 0;
+  width: 0;
+  margin-left: auto;
+  margin-right: auto;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.daterangepicker.openscenter:after {
+  position: absolute;
+  top: -6px;
+  left: 0;  
+  right: 0;  
+  width: 0;
+  margin-left: auto;
+  margin-right: auto;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #fff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.daterangepicker.opensright:before {
+  position: absolute;
+  top: -7px;
+  left: 9px;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.daterangepicker.opensright:after {
+  position: absolute;
+  top: -6px;
+  left: 10px;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #fff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.daterangepicker.dropup{
+  margin-top: -5px;
+}
+.daterangepicker.dropup:before{
+  top: initial;
+  bottom:-7px;
+  border-bottom: initial;
+  border-top: 7px solid #ccc;
+}
+.daterangepicker.dropup:after{
+  top: initial;
+  bottom:-6px;
+  border-bottom: initial;
+  border-top: 6px solid #fff;
+}
+
+.daterangepicker table {
+  width: 100%;
+  margin: 0;
+}
+
+.daterangepicker td, .daterangepicker th {
+  text-align: center;
+  width: 20px;
+  height: 20px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  cursor: pointer;
+  white-space: nowrap;
+}
+
+.daterangepicker td.off {
+  color: #999;
+}
+
+.daterangepicker td.disabled, .daterangepicker option.disabled {
+  color: #999;
+}
+
+.daterangepicker td.available:hover, .daterangepicker th.available:hover {
+  background: #eee;
+}
+
+.daterangepicker td.in-range {
+  background: #ebf4f8;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+
+.daterangepicker td.start-date {
+  -webkit-border-radius: 4px 0 0 4px;
+  -moz-border-radius: 4px 0 0 4px;
+  border-radius: 4px 0 0 4px;
+}
+
+.daterangepicker td.end-date {
+  -webkit-border-radius: 0 4px 4px 0;
+  -moz-border-radius: 0 4px 4px 0;
+  border-radius: 0 4px 4px 0;
+}
+
+.daterangepicker td.start-date.end-date {
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+
+.daterangepicker td.active, .daterangepicker td.active:hover {
+  background-color: #357ebd;
+  border-color: #3071a9;
+  color: #fff;
+}
+
+.daterangepicker td.week, .daterangepicker th.week {
+  font-size: 80%;
+  color: #ccc;
+}
+
+.daterangepicker select.monthselect, .daterangepicker select.yearselect {
+  font-size: 12px;
+  padding: 1px;
+  height: auto;
+  margin: 0;
+  cursor: default;
+}
+
+.daterangepicker select.monthselect {
+  margin-right: 2%;
+  width: 56%;
+}
+
+.daterangepicker select.yearselect {
+  width: 40%;
+}
+
+.daterangepicker select.hourselect, .daterangepicker select.minuteselect, 
.daterangepicker select.secondselect, .daterangepicker select.ampmselect {
+  width: 50px;
+  margin-bottom: 0;
+}
+
+.daterangepicker_start_input {
+  float: left;
+}
+
+.daterangepicker_end_input {
+  float: left; 
+  padding-left: 11px
+}
+
+.daterangepicker th.month {
+  width: auto;
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/f6922c96/modules/webconfig/nodejs/node_modules/admin-lte/plugins/daterangepicker/daterangepicker.js
----------------------------------------------------------------------
diff --git 
a/modules/webconfig/nodejs/node_modules/admin-lte/plugins/daterangepicker/daterangepicker.js
 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/daterangepicker/daterangepicker.js
new file mode 100755
index 0000000..228612b
--- /dev/null
+++ 
b/modules/webconfig/nodejs/node_modules/admin-lte/plugins/daterangepicker/daterangepicker.js
@@ -0,0 +1,1304 @@
+/**
+* @version: 1.3.21
+* @author: Dan Grossman http://www.dangrossman.info/
+* @copyright: Copyright (c) 2012-2015 Dan Grossman. All rights reserved.
+* @license: Licensed under the MIT license. See 
http://www.opensource.org/licenses/mit-license.php
+* @website: https://www.improvely.com/
+*/
+
+(function(root, factory) {
+
+  if (typeof define === 'function' && define.amd) {
+    define(['moment', 'jquery', 'exports'], function(momentjs, $, exports) {
+      root.daterangepicker = factory(root, exports, momentjs, $);
+    });
+
+  } else if (typeof exports !== 'undefined') {
+    var momentjs = require('moment');
+    var jQuery;
+    try {
+      jQuery = require('jquery');
+    } catch (err) {
+      jQuery = window.jQuery;
+      if (!jQuery) throw new Error('jQuery dependency not found');
+    }
+
+    factory(root, exports, momentjs, jQuery);
+
+  // Finally, as a browser global.
+  } else {
+    root.daterangepicker = factory(root, {}, root.moment, (root.jQuery || 
root.Zepto || root.ender || root.$));
+  }
+
+}(this, function(root, daterangepicker, moment, $) {
+
+    var DateRangePicker = function (element, options, cb) {
+
+        // by default, the daterangepicker element is placed at the bottom of 
HTML body
+        this.parentEl = 'body';
+
+        //element that triggered the date range picker
+        this.element = $(element);
+
+        //tracks visible state
+        this.isShowing = false;
+
+        //create the picker HTML object
+        var DRPTemplate = '<div class="daterangepicker dropdown-menu">' +
+                '<div class="calendar first left"></div>' +
+                '<div class="calendar second right"></div>' +
+                '<div class="ranges">' +
+                  '<div class="range_inputs">' +
+                    '<div class="daterangepicker_start_input">' +
+                      '<label for="daterangepicker_start"></label>' +
+                      '<input class="input-mini" type="text" 
name="daterangepicker_start" value="" />' +
+                    '</div>' +
+                    '<div class="daterangepicker_end_input">' +
+                      '<label for="daterangepicker_end"></label>' +
+                      '<input class="input-mini" type="text" 
name="daterangepicker_end" value="" />' +
+                    '</div>' +
+                    '<button class="applyBtn" 
disabled="disabled"></button>&nbsp;' +
+                    '<button class="cancelBtn"></button>' +
+                  '</div>' +
+                '</div>' +
+              '</div>';
+
+        //custom options
+        if (typeof options !== 'object' || options === null)
+            options = {};
+
+        this.parentEl = (typeof options === 'object' && options.parentEl && 
$(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl);
+        this.container = $(DRPTemplate).appendTo(this.parentEl);
+
+        this.setOptions(options, cb);
+
+        //event listeners
+        this.container.find('.calendar')
+            .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, 
this))
+            .on('click.daterangepicker', '.next', $.proxy(this.clickNext, 
this))
+            .on('click.daterangepicker', 'td.available', 
$.proxy(this.clickDate, this))
+            .on('mouseenter.daterangepicker', 'td.available', 
$.proxy(this.hoverDate, this))
+            .on('mouseleave.daterangepicker', 'td.available', 
$.proxy(this.updateFormInputs, this))
+            .on('change.daterangepicker', 'select.yearselect', 
$.proxy(this.updateMonthYear, this))
+            .on('change.daterangepicker', 'select.monthselect', 
$.proxy(this.updateMonthYear, this))
+            .on('change.daterangepicker', 
'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', 
$.proxy(this.updateTime, this));
+
+        this.container.find('.ranges')
+            .on('click.daterangepicker', 'button.applyBtn', 
$.proxy(this.clickApply, this))
+            .on('click.daterangepicker', 'button.cancelBtn', 
$.proxy(this.clickCancel, this))
+            .on('click.daterangepicker', 
'.daterangepicker_start_input,.daterangepicker_end_input', 
$.proxy(this.showCalendars, this))
+            .on('change.daterangepicker', 
'.daterangepicker_start_input,.daterangepicker_end_input', 
$.proxy(this.inputsChanged, this))
+            .on('keydown.daterangepicker', 
'.daterangepicker_start_input,.daterangepicker_end_input', 
$.proxy(this.inputsKeydown, this))
+            .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this))
+            .on('mouseenter.daterangepicker', 'li', $.proxy(this.enterRange, 
this))
+            .on('mouseleave.daterangepicker', 'li', 
$.proxy(this.updateFormInputs, this));
+
+        if (this.element.is('input')) {
+            this.element.on({
+                'click.daterangepicker': $.proxy(this.show, this),
+                'focus.daterangepicker': $.proxy(this.show, this),
+                'keyup.daterangepicker': $.proxy(this.updateFromControl, this),
+                'keydown.daterangepicker': $.proxy(this.keydown, this)
+            });
+        } else {
+            this.element.on('click.daterangepicker', $.proxy(this.toggle, 
this));
+        }
+
+    };
+
+    DateRangePicker.prototype = {
+
+        constructor: DateRangePicker,
+
+        setOptions: function(options, callback) {
+
+            this.startDate = moment().startOf('day');
+            this.endDate = moment().endOf('day');
+            this.timeZone = moment().utcOffset();
+            this.minDate = false;
+            this.maxDate = false;
+            this.dateLimit = false;
+
+            this.showDropdowns = false;
+            this.showWeekNumbers = false;
+            this.timePicker = false;
+            this.timePickerSeconds = false;
+            this.timePickerIncrement = 30;
+            this.timePicker12Hour = true;
+            this.singleDatePicker = false;
+            this.ranges = {};
+
+            this.opens = 'right';
+            if (this.element.hasClass('pull-right'))
+                this.opens = 'left';
+
+            this.drops = 'down';
+            if (this.element.hasClass('dropup'))
+                this.drops = 'up';
+
+            this.buttonClasses = ['btn', 'btn-small btn-sm'];
+            this.applyClass = 'btn-success';
+            this.cancelClass = 'btn-default';
+
+            this.format = 'MM/DD/YYYY';
+            this.separator = ' - ';
+
+            this.locale = {
+                applyLabel: 'Apply',
+                cancelLabel: 'Cancel',
+                fromLabel: 'From',
+                toLabel: 'To',
+                weekLabel: 'W',
+                customRangeLabel: 'Custom Range',
+                daysOfWeek: moment.weekdaysMin(),
+                monthNames: moment.monthsShort(),
+                firstDay: moment.localeData()._week.dow
+            };
+
+            this.cb = function () { };
+
+            if (typeof options.format === 'string')
+                this.format = options.format;
+
+            if (typeof options.separator === 'string')
+                this.separator = options.separator;
+
+            if (typeof options.startDate === 'string')
+                this.startDate = moment(options.startDate, this.format);
+
+            if (typeof options.endDate === 'string')
+                this.endDate = moment(options.endDate, this.format);
+
+            if (typeof options.minDate === 'string')
+                this.minDate = moment(options.minDate, this.format);
+
+            if (typeof options.maxDate === 'string')
+                this.maxDate = moment(options.maxDate, this.format);
+
+            if (typeof options.startDate === 'object')
+                this.startDate = moment(options.startDate);
+
+            if (typeof options.endDate === 'object')
+                this.endDate = moment(options.endDate);
+
+            if (typeof options.minDate === 'object')
+                this.minDate = moment(options.minDate);
+
+            if (typeof options.maxDate === 'object')
+                this.maxDate = moment(options.maxDate);
+
+            if (typeof options.applyClass === 'string')
+                this.applyClass = options.applyClass;
+
+            if (typeof options.cancelClass === 'string')
+                this.cancelClass = options.cancelClass;
+
+            if (typeof options.dateLimit === 'object')
+                this.dateLimit = options.dateLimit;
+
+            if (typeof options.locale === 'object') {
+
+                if (typeof options.locale.daysOfWeek === 'object') {
+                    // Create a copy of daysOfWeek to avoid modification of 
original
+                    // options object for reusability in multiple 
daterangepicker instances
+                    this.locale.daysOfWeek = options.locale.daysOfWeek.slice();
+                }
+
+                if (typeof options.locale.monthNames === 'object') {
+                  this.locale.monthNames = options.locale.monthNames.slice();
+                }
+
+                if (typeof options.locale.firstDay === 'number') {
+                  this.locale.firstDay = options.locale.firstDay;
+                }
+
+                if (typeof options.locale.applyLabel === 'string') {
+                  this.locale.applyLabel = options.locale.applyLabel;
+                }
+
+                if (typeof options.locale.cancelLabel === 'string') {
+                  this.locale.cancelLabel = options.locale.cancelLabel;
+                }
+
+                if (typeof options.locale.fromLabel === 'string') {
+                  this.locale.fromLabel = options.locale.fromLabel;
+                }
+
+                if (typeof options.locale.toLabel === 'string') {
+                  this.locale.toLabel = options.locale.toLabel;
+                }
+
+                if (typeof options.locale.weekLabel === 'string') {
+                  this.locale.weekLabel = options.locale.weekLabel;
+                }
+
+                if (typeof options.locale.customRangeLabel === 'string') {
+                  this.locale.customRangeLabel = 
options.locale.customRangeLabel;
+                }
+            }
+
+            if (typeof options.opens === 'string')
+                this.opens = options.opens;
+
+            if (typeof options.drops === 'string')
+                this.drops = options.drops;
+
+            if (typeof options.showWeekNumbers === 'boolean') {
+                this.showWeekNumbers = options.showWeekNumbers;
+            }
+
+            if (typeof options.buttonClasses === 'string') {
+                this.buttonClasses = [options.buttonClasses];
+            }
+
+            if (typeof options.buttonClasses === 'object') {
+                this.buttonClasses = options.buttonClasses;
+            }
+
+            if (typeof options.showDropdowns === 'boolean') {
+                this.showDropdowns = options.showDropdowns;
+            }
+
+            if (typeof options.singleDatePicker === 'boolean') {
+                this.singleDatePicker = options.singleDatePicker;
+                if (this.singleDatePicker) {
+                    this.endDate = this.startDate.clone();
+                }
+            }
+
+            if (typeof options.timePicker === 'boolean') {
+                this.timePicker = options.timePicker;
+            }
+
+            if (typeof options.timePickerSeconds === 'boolean') {
+                this.timePickerSeconds = options.timePickerSeconds;
+            }
+
+            if (typeof options.timePickerIncrement === 'number') {
+                this.timePickerIncrement = options.timePickerIncrement;
+            }
+
+            if (typeof options.timePicker12Hour === 'boolean') {
+                this.timePicker12Hour = options.timePicker12Hour;
+            }
+
+            // update day names order to firstDay
+            if (this.locale.firstDay != 0) {
+                var iterator = this.locale.firstDay;
+                while (iterator > 0) {
+                    
this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift());
+                    iterator--;
+                }
+            }
+
+            var start, end, range;
+
+            //if no start/end dates set, check if an input element contains 
initial values
+            if (typeof options.startDate === 'undefined' && typeof 
options.endDate === 'undefined') {
+                if ($(this.element).is('input[type=text]')) {
+                    var val = $(this.element).val(),
+                        split = val.split(this.separator);
+
+                    start = end = null;
+
+                    if (split.length == 2) {
+                        start = moment(split[0], this.format);
+                        end = moment(split[1], this.format);
+                    } else if (this.singleDatePicker && val !== "") {
+                        start = moment(val, this.format);
+                        end = moment(val, this.format);
+                    }
+                    if (start !== null && end !== null) {
+                        this.startDate = start;
+                        this.endDate = end;
+                    }
+                }
+            }
+
+            // bind the time zone used to build the calendar to either the 
timeZone passed in through the options or the zone of the startDate (which will 
be the local time zone by default)
+            if (typeof options.timeZone === 'string' || typeof 
options.timeZone === 'number') {
+               if (typeof options.timeZone === 'string' && typeof moment.tz 
!== 'undefined') {
+                       this.timeZone = 
moment.tz.zone(options.timeZone).parse(new Date) * -1;  // Offset is positive 
if the timezone is behind UTC and negative if it is ahead.
+               } else {
+                       this.timeZone = options.timeZone;
+               }
+              this.startDate.utcOffset(this.timeZone);
+              this.endDate.utcOffset(this.timeZone);
+            } else {
+                this.timeZone = moment(this.startDate).utcOffset();
+            }
+
+            if (typeof options.ranges === 'object') {
+                for (range in options.ranges) {
+
+                    if (typeof options.ranges[range][0] === 'string')
+                        start = moment(options.ranges[range][0], this.format);
+                    else
+                        start = moment(options.ranges[range][0]);
+
+                    if (typeof options.ranges[range][1] === 'string')
+                        end = moment(options.ranges[range][1], this.format);
+                    else
+                        end = moment(options.ranges[range][1]);
+
+                    // If we have a min/max date set, bound this range
+                    // to it, but only if it would otherwise fall
+                    // outside of the min/max.
+                    if (this.minDate && start.isBefore(this.minDate))
+                        start = moment(this.minDate);
+
+                    if (this.maxDate && end.isAfter(this.maxDate))
+                        end = moment(this.maxDate);
+
+                    // If the end of the range is before the minimum (if min 
is set) OR
+                    // the start of the range is after the max (also if set) 
don't display this
+                    // range option.
+                    if ((this.minDate && end.isBefore(this.minDate)) || 
(this.maxDate && start.isAfter(this.maxDate))) {
+                        continue;
+                    }
+
+                    this.ranges[range] = [start, end];
+                }
+
+                var list = '<ul>';
+                for (range in this.ranges) {
+                    list += '<li>' + range + '</li>';
+                }
+                list += '<li>' + this.locale.customRangeLabel + '</li>';
+                list += '</ul>';
+                this.container.find('.ranges ul').remove();
+                this.container.find('.ranges').prepend(list);
+            }
+
+            if (typeof callback === 'function') {
+                this.cb = callback;
+            }
+
+            if (!this.timePicker) {
+                this.startDate = this.startDate.startOf('day');
+                this.endDate = this.endDate.endOf('day');
+            }
+
+            if (this.singleDatePicker) {
+                this.opens = 'right';
+                this.container.addClass('single');
+                this.container.find('.calendar.right').show();
+                this.container.find('.calendar.left').hide();
+                if (!this.timePicker) {
+                    this.container.find('.ranges').hide();
+                } else {
+                    this.container.find('.ranges .daterangepicker_start_input, 
.ranges .daterangepicker_end_input').hide();
+                }
+                if (!this.container.find('.calendar.right').hasClass('single'))
+                    this.container.find('.calendar.right').addClass('single');
+            } else {
+                this.container.removeClass('single');
+                this.container.find('.calendar.right').removeClass('single');
+                this.container.find('.ranges').show();
+            }
+
+            this.oldStartDate = this.startDate.clone();
+            this.oldEndDate = this.endDate.clone();
+            this.oldChosenLabel = this.chosenLabel;
+
+            this.leftCalendar = {
+                month: moment([this.startDate.year(), this.startDate.month(), 
1, this.startDate.hour(), this.startDate.minute(), this.startDate.second()]),
+                calendar: []
+            };
+
+            this.rightCalendar = {
+                month: moment([this.endDate.year(), this.endDate.month(), 1, 
this.endDate.hour(), this.endDate.minute(), this.endDate.second()]),
+                calendar: []
+            };
+
+            if (this.opens == 'right' || this.opens == 'center') {
+                //swap calendar positions
+                var first = this.container.find('.calendar.first');
+                var second = this.container.find('.calendar.second');
+
+                if (second.hasClass('single')) {
+                    second.removeClass('single');
+                    first.addClass('single');
+                }
+
+                first.removeClass('left').addClass('right');
+                second.removeClass('right').addClass('left');
+
+                if (this.singleDatePicker) {
+                    first.show();
+                    second.hide();
+                }
+            }
+
+            if (typeof options.ranges === 'undefined' && 
!this.singleDatePicker) {
+                this.container.addClass('show-calendar');
+            }
+
+            this.container.removeClass('opensleft 
opensright').addClass('opens' + this.opens);
+
+            this.updateView();
+            this.updateCalendars();
+
+            //apply CSS classes and labels to buttons
+            var c = this.container;
+            $.each(this.buttonClasses, function (idx, val) {
+                c.find('button').addClass(val);
+            });
+            this.container.find('.daterangepicker_start_input 
label').html(this.locale.fromLabel);
+            this.container.find('.daterangepicker_end_input 
label').html(this.locale.toLabel);
+            if (this.applyClass.length)
+                this.container.find('.applyBtn').addClass(this.applyClass);
+            if (this.cancelClass.length)
+                this.container.find('.cancelBtn').addClass(this.cancelClass);
+            this.container.find('.applyBtn').html(this.locale.applyLabel);
+            this.container.find('.cancelBtn').html(this.locale.cancelLabel);
+        },
+
+        setStartDate: function(startDate) {
+            if (typeof startDate === 'string')
+                this.startDate = moment(startDate, 
this.format).utcOffset(this.timeZone);
+
+            if (typeof startDate === 'object')
+                this.startDate = moment(startDate);
+
+            if (!this.timePicker)
+                this.startDate = this.startDate.startOf('day');
+
+            this.oldStartDate = this.startDate.clone();
+
+            this.updateView();
+            this.updateCalendars();
+            this.updateInputText();
+        },
+
+        setEndDate: function(endDate) {
+            if (typeof endDate === 'string')
+                this.endDate = moment(endDate, 
this.format).utcOffset(this.timeZone);
+
+            if (typeof endDate === 'object')
+                this.endDate = moment(endDate);
+
+            if (!this.timePicker)
+                this.endDate = this.endDate.endOf('day');
+
+            this.oldEndDate = this.endDate.clone();
+
+            this.updateView();
+            this.updateCalendars();
+            this.updateInputText();
+        },
+
+        updateView: function () {
+            
this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute());
+            
this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute());
+            this.updateFormInputs();
+        },
+
+        updateFormInputs: function () {
+            
this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.format));
+            
this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.format));
+
+            if (this.startDate.isSame(this.endDate) || 
this.startDate.isBefore(this.endDate)) {
+                this.container.find('button.applyBtn').removeAttr('disabled');
+            } else {
+                this.container.find('button.applyBtn').attr('disabled', 
'disabled');
+            }
+        },
+
+        updateFromControl: function () {
+            if (!this.element.is('input')) return;
+            if (!this.element.val().length) return;
+
+            var dateString = this.element.val().split(this.separator),
+                start = null,
+                end = null;
+
+            if(dateString.length === 2) {
+                start = moment(dateString[0], 
this.format).utcOffset(this.timeZone);
+                end = moment(dateString[1], 
this.format).utcOffset(this.timeZone);
+            }
+
+            if (this.singleDatePicker || start === null || end === null) {
+                start = moment(this.element.val(), 
this.format).utcOffset(this.timeZone);
+                end = start;
+            }
+
+            if (end.isBefore(start)) return;
+
+            this.oldStartDate = this.startDate.clone();
+            this.oldEndDate = this.endDate.clone();
+
+            this.startDate = start;
+            this.endDate = end;
+
+            if (!this.startDate.isSame(this.oldStartDate) || 
!this.endDate.isSame(this.oldEndDate))
+                this.notify();
+
+            this.updateCalendars();
+        },
+        
+        keydown: function (e) {
+            //hide on tab or enter
+               if ((e.keyCode === 9) || (e.keyCode === 13)) {
+                       this.hide();
+               }
+        },
+
+        notify: function () {
+            this.updateView();
+            this.cb(this.startDate, this.endDate, this.chosenLabel);
+        },
+
+        move: function () {
+            var parentOffset = { top: 0, left: 0 },
+               containerTop;
+            var parentRightEdge = $(window).width();
+            if (!this.parentEl.is('body')) {
+                parentOffset = {
+                    top: this.parentEl.offset().top - 
this.parentEl.scrollTop(),
+                    left: this.parentEl.offset().left - 
this.parentEl.scrollLeft()
+                };
+                parentRightEdge = this.parentEl[0].clientWidth + 
this.parentEl.offset().left;
+            }
+            
+            if (this.drops == 'up')
+               containerTop = this.element.offset().top - 
this.container.outerHeight() - parentOffset.top;
+            else
+               containerTop = this.element.offset().top + 
this.element.outerHeight() - parentOffset.top;
+            this.container[this.drops == 'up' ? 'addClass' : 
'removeClass']('dropup');
+
+            if (this.opens == 'left') {
+                this.container.css({
+                    top: containerTop,
+                    right: parentRightEdge - this.element.offset().left - 
this.element.outerWidth(),
+                    left: 'auto'
+                });
+                if (this.container.offset().left < 0) {
+                    this.container.css({
+                        right: 'auto',
+                        left: 9
+                    });
+                }
+            } else if (this.opens == 'center') {
+                this.container.css({
+                    top: containerTop,
+                    left: this.element.offset().left - parentOffset.left + 
this.element.outerWidth() / 2
+                            - this.container.outerWidth() / 2,
+                    right: 'auto'
+                });
+                if (this.container.offset().left < 0) {
+                    this.container.css({
+                        right: 'auto',
+                        left: 9
+                    });
+                }
+            } else {
+                this.container.css({
+                    top: containerTop,
+                    left: this.element.offset().left - parentOffset.left,
+                    right: 'auto'
+                });
+                if (this.container.offset().left + this.container.outerWidth() 
> $(window).width()) {
+                    this.container.css({
+                        left: 'auto',
+                        right: 0
+                    });
+                }
+            }
+        },
+
+        toggle: function (e) {
+            if (this.element.hasClass('active')) {
+                this.hide();
+            } else {
+                this.show();
+            }
+        },
+
+        show: function (e) {
+            if (this.isShowing) return;
+
+            this.element.addClass('active');
+            this.container.show();
+            this.move();
+
+            // Create a click proxy that is private to this instance of 
datepicker, for unbinding
+            this._outsideClickProxy = $.proxy(function (e) { 
this.outsideClick(e); }, this);
+            // Bind global datepicker mousedown for hiding and
+            $(document)
+              .on('mousedown.daterangepicker', this._outsideClickProxy)
+              // also support mobile devices
+              .on('touchend.daterangepicker', this._outsideClickProxy)
+              // also explicitly play nice with Bootstrap dropdowns, which 
stopPropagation when clicking them
+              .on('click.daterangepicker', '[data-toggle=dropdown]', 
this._outsideClickProxy)
+              // and also close when focus changes to outside the picker (eg. 
tabbing between controls)
+              .on('focusin.daterangepicker', this._outsideClickProxy);
+
+            this.isShowing = true;
+            this.element.trigger('show.daterangepicker', this);
+        },
+
+        outsideClick: function (e) {
+            var target = $(e.target);
+            // if the page is clicked anywhere except within the 
daterangerpicker/button
+            // itself then call this.hide()
+            if (
+                // ie modal dialog fix
+                e.type == "focusin" ||
+                target.closest(this.element).length ||
+                target.closest(this.container).length ||
+                target.closest('.calendar-date').length
+                ) return;
+            this.hide();
+        },
+
+        hide: function (e) {
+            if (!this.isShowing) return;
+
+            $(document)
+              .off('.daterangepicker');
+
+            this.element.removeClass('active');
+            this.container.hide();
+
+            if (!this.startDate.isSame(this.oldStartDate) || 
!this.endDate.isSame(this.oldEndDate))
+                this.notify();
+
+            this.oldStartDate = this.startDate.clone();
+            this.oldEndDate = this.endDate.clone();
+
+            this.isShowing = false;
+            this.element.trigger('hide.daterangepicker', this);
+        },
+
+        enterRange: function (e) {
+            // mouse pointer has entered a range label
+            var label = e.target.innerHTML;
+            if (label == this.locale.customRangeLabel) {
+                this.updateView();
+            } else {
+                var dates = this.ranges[label];
+                
this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.format));
+                
this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.format));
+            }
+        },
+
+        showCalendars: function() {
+            this.container.addClass('show-calendar');
+            this.move();
+            this.element.trigger('showCalendar.daterangepicker', this);
+        },
+
+        hideCalendars: function() {
+            this.container.removeClass('show-calendar');
+            this.element.trigger('hideCalendar.daterangepicker', this);
+        },
+
+        // when a date is typed into the start to end date textboxes
+        inputsChanged: function (e) {
+            var el = $(e.target);
+            var date = moment(el.val(), this.format);
+            if (!date.isValid()) return;
+
+            var startDate, endDate;
+            if (el.attr('name') === 'daterangepicker_start') {
+                startDate = (false !== this.minDate && 
date.isBefore(this.minDate)) ? this.minDate : date;
+                endDate = this.endDate;
+            } else {
+                startDate = this.startDate;
+                endDate = (false !== this.maxDate && 
date.isAfter(this.maxDate)) ? this.maxDate : date;
+            }
+            this.setCustomDates(startDate, endDate);
+        },
+
+        inputsKeydown: function(e) {
+            if (e.keyCode === 13) {
+                this.inputsChanged(e);
+                this.notify();
+            }
+        },
+
+        updateInputText: function() {
+            if (this.element.is('input') && !this.singleDatePicker) {
+                this.element.val(this.startDate.format(this.format) + 
this.separator + this.endDate.format(this.format));
+                this.element.trigger('change');
+            } else if (this.element.is('input')) {
+                this.element.val(this.endDate.format(this.format));
+                this.element.trigger('change');
+            }
+        },
+
+        clickRange: function (e) {
+            var label = e.target.innerHTML;
+            this.chosenLabel = label;
+            if (label == this.locale.customRangeLabel) {
+                this.showCalendars();
+            } else {
+                var dates = this.ranges[label];
+
+                this.startDate = dates[0];
+                this.endDate = dates[1];
+
+                if (!this.timePicker) {
+                    this.startDate.startOf('day');
+                    this.endDate.endOf('day');
+                }
+
+                
this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute());
+                
this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute());
+                this.updateCalendars();
+
+                this.updateInputText();
+
+                this.hideCalendars();
+                this.hide();
+                this.element.trigger('apply.daterangepicker', this);
+            }
+        },
+
+        clickPrev: function (e) {
+            var cal = $(e.target).parents('.calendar');
+            if (cal.hasClass('left')) {
+                this.leftCalendar.month.subtract(1, 'month');
+            } else {
+                this.rightCalendar.month.subtract(1, 'month');
+            }
+            this.updateCalendars();
+        },
+
+        clickNext: function (e) {
+            var cal = $(e.target).parents('.calendar');
+            if (cal.hasClass('left')) {
+                this.leftCalendar.month.add(1, 'month');
+            } else {
+                this.rightCalendar.month.add(1, 'month');
+            }
+            this.updateCalendars();
+        },
+
+        hoverDate: function (e) {
+            var title = $(e.target).attr('data-title');
+            var row = title.substr(1, 1);
+            var col = title.substr(3, 1);
+            var cal = $(e.target).parents('.calendar');
+
+            if (cal.hasClass('left')) {
+                
this.container.find('input[name=daterangepicker_start]').val(this.leftCalendar.calendar[row][col].format(this.format));
+            } else {
+                
this.container.find('input[name=daterangepicker_end]').val(this.rightCalendar.calendar[row][col].format(this.format));
+            }
+        },
+
+        setCustomDates: function(startDate, endDate) {
+            this.chosenLabel = this.locale.customRangeLabel;
+            if (startDate.isAfter(endDate)) {
+                var difference = this.endDate.diff(this.startDate);
+                endDate = moment(startDate).add(difference, 'ms');
+                if (this.maxDate && endDate.isAfter(this.maxDate)) {
+                  endDate = this.maxDate.clone();
+                }
+            }
+            this.startDate = startDate;
+            this.endDate = endDate;
+
+            this.updateView();
+            this.updateCalendars();
+        },
+
+        clickDate: function (e) {
+            var title = $(e.target).attr('data-title');
+            var row = title.substr(1, 1);
+            var col = title.substr(3, 1);
+            var cal = $(e.target).parents('.calendar');
+
+            var startDate, endDate;
+            if (cal.hasClass('left')) {
+                startDate = this.leftCalendar.calendar[row][col];
+                endDate = this.endDate;
+                if (typeof this.dateLimit === 'object') {
+                    var maxDate = 
moment(startDate).add(this.dateLimit).startOf('day');
+                    if (endDate.isAfter(maxDate)) {
+                        endDate = maxDate;
+                    }
+                }
+            } else {
+                startDate = this.startDate;
+                endDate = this.rightCalendar.calendar[row][col];
+                if (typeof this.dateLimit === 'object') {
+                    var minDate = 
moment(endDate).subtract(this.dateLimit).startOf('day');
+                    if (startDate.isBefore(minDate)) {
+                        startDate = minDate;
+                    }
+                }
+            }
+
+            if (this.singleDatePicker && cal.hasClass('left')) {
+                endDate = startDate.clone();
+            } else if (this.singleDatePicker && cal.hasClass('right')) {
+                startDate = endDate.clone();
+            }
+
+            cal.find('td').removeClass('active');
+
+            $(e.target).addClass('active');
+
+            this.setCustomDates(startDate, endDate);
+
+            if (!this.timePicker)
+                endDate.endOf('day');
+
+            if (this.singleDatePicker && !this.timePicker)
+                this.clickApply();
+        },
+
+        clickApply: function (e) {
+            this.updateInputText();
+            this.hide();
+            this.element.trigger('apply.daterangepicker', this);
+        },
+
+        clickCancel: function (e) {
+            this.startDate = this.oldStartDate;
+            this.endDate = this.oldEndDate;
+            this.chosenLabel = this.oldChosenLabel;
+            this.updateView();
+            this.updateCalendars();
+            this.hide();
+            this.element.trigger('cancel.daterangepicker', this);
+        },
+
+        updateMonthYear: function (e) {
+            var isLeft = $(e.target).closest('.calendar').hasClass('left'),
+                leftOrRight = isLeft ? 'left' : 'right',
+                cal = this.container.find('.calendar.'+leftOrRight);
+
+            // Month must be Number for new moment versions
+            var month = parseInt(cal.find('.monthselect').val(), 10);
+            var year = cal.find('.yearselect').val();
+
+            if (!isLeft && !this.singleDatePicker) {
+                if (year < this.startDate.year() || (year == 
this.startDate.year() && month < this.startDate.month())) {
+                    month = this.startDate.month();
+                    year = this.startDate.year();
+                }
+            }
+
+            if (this.minDate) {
+                if (year < this.minDate.year() || (year == this.minDate.year() 
&& month < this.minDate.month())) {
+                    month = this.minDate.month();
+                    year = this.minDate.year();
+                }
+            }
+
+            if (this.maxDate) {
+                if (year > this.maxDate.year() || (year == this.maxDate.year() 
&& month > this.maxDate.month())) {
+                    month = this.maxDate.month();
+                    year = this.maxDate.year();
+                }
+            }
+
+
+            this[leftOrRight+'Calendar'].month.month(month).year(year);
+            this.updateCalendars();
+        },
+
+        updateTime: function(e) {
+
+            var cal = $(e.target).closest('.calendar'),
+                isLeft = cal.hasClass('left');
+
+            var hour = parseInt(cal.find('.hourselect').val(), 10);
+            var minute = parseInt(cal.find('.minuteselect').val(), 10);
+            var second = 0;
+
+            if (this.timePickerSeconds) {
+                second = parseInt(cal.find('.secondselect').val(), 10);
+            }
+
+            if (this.timePicker12Hour) {
+                var ampm = cal.find('.ampmselect').val();
+                if (ampm === 'PM' && hour < 12)
+                    hour += 12;
+                if (ampm === 'AM' && hour === 12)
+                    hour = 0;
+            }
+
+            if (isLeft) {
+                var start = this.startDate.clone();
+                start.hour(hour);
+                start.minute(minute);
+                start.second(second);
+                this.startDate = start;
+                
this.leftCalendar.month.hour(hour).minute(minute).second(second);
+                if (this.singleDatePicker)
+                    this.endDate = start.clone();
+            } else {
+                var end = this.endDate.clone();
+                end.hour(hour);
+                end.minute(minute);
+                end.second(second);
+                this.endDate = end;
+                if (this.singleDatePicker)
+                    this.startDate = end.clone();
+                
this.rightCalendar.month.hour(hour).minute(minute).second(second);
+            }
+
+            this.updateView();
+            this.updateCalendars();
+        },
+
+        updateCalendars: function () {
+            this.leftCalendar.calendar = 
this.buildCalendar(this.leftCalendar.month.month(), 
this.leftCalendar.month.year(), this.leftCalendar.month.hour(), 
this.leftCalendar.month.minute(), this.leftCalendar.month.second(), 'left');
+            this.rightCalendar.calendar = 
this.buildCalendar(this.rightCalendar.month.month(), 
this.rightCalendar.month.year(), this.rightCalendar.month.hour(), 
this.rightCalendar.month.minute(), this.rightCalendar.month.second(), 'right');
+            
this.container.find('.calendar.left').empty().html(this.renderCalendar(this.leftCalendar.calendar,
 this.startDate, this.minDate, this.maxDate, 'left'));
+            
this.container.find('.calendar.right').empty().html(this.renderCalendar(this.rightCalendar.calendar,
 this.endDate, this.singleDatePicker ? this.minDate : this.startDate, 
this.maxDate, 'right'));
+
+            this.container.find('.ranges li').removeClass('active');
+            var customRange = true;
+            var i = 0;
+            for (var range in this.ranges) {
+                if (this.timePicker) {
+                    if (this.startDate.isSame(this.ranges[range][0]) && 
this.endDate.isSame(this.ranges[range][1])) {
+                        customRange = false;
+                        this.chosenLabel = this.container.find('.ranges 
li:eq(' + i + ')')
+                            .addClass('active').html();
+                    }
+                } else {
+                    //ignore times when comparing dates if time picker is not 
enabled
+                    if (this.startDate.format('YYYY-MM-DD') == 
this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') 
== this.ranges[range][1].format('YYYY-MM-DD')) {
+                        customRange = false;
+                        this.chosenLabel = this.container.find('.ranges 
li:eq(' + i + ')')
+                            .addClass('active').html();
+                    }
+                }
+                i++;
+            }
+            if (customRange) {
+                this.chosenLabel = this.container.find('.ranges 
li:last').addClass('active').html();
+                this.showCalendars();
+            }
+        },
+
+        buildCalendar: function (month, year, hour, minute, second, side) {
+            var daysInMonth = moment([year, month]).daysInMonth();
+            var firstDay = moment([year, month, 1]);
+            var lastDay = moment([year, month, daysInMonth]);
+            var lastMonth = moment(firstDay).subtract(1, 'month').month();
+            var lastYear = moment(firstDay).subtract(1, 'month').year();
+
+            var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth();
+
+            var dayOfWeek = firstDay.day();
+
+            var i;
+
+            //initialize a 6 rows x 7 columns array for the calendar
+            var calendar = [];
+            calendar.firstDay = firstDay;
+            calendar.lastDay = lastDay;
+
+            for (i = 0; i < 6; i++) {
+                calendar[i] = [];
+            }
+
+            //populate the calendar with date objects
+            var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay 
+ 1;
+            if (startDay > daysInLastMonth)
+                startDay -= 7;
+
+            if (dayOfWeek == this.locale.firstDay)
+                startDay = daysInLastMonth - 6;
+
+            var curDate = moment([lastYear, lastMonth, startDay, 12, minute, 
second]).utcOffset(this.timeZone);
+
+            var col, row;
+            for (i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = 
moment(curDate).add(24, 'hour')) {
+                if (i > 0 && col % 7 === 0) {
+                    col = 0;
+                    row++;
+                }
+                calendar[row][col] = curDate.clone().hour(hour);
+                curDate.hour(12);
+
+                if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == 
this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) 
&& side == 'left') {
+                    calendar[row][col] = this.minDate.clone();
+                }
+
+                if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == 
this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) 
&& side == 'right') {
+                    calendar[row][col] = this.maxDate.clone();
+                }
+
+            }
+
+            return calendar;
+        },
+
+        renderDropdowns: function (selected, minDate, maxDate) {
+            var currentMonth = selected.month();
+            var currentYear = selected.year();
+            var maxYear = (maxDate && maxDate.year()) || (currentYear + 5);
+            var minYear = (minDate && minDate.year()) || (currentYear - 50);
+
+            var monthHtml = '<select class="monthselect">';
+            var inMinYear = currentYear == minYear;
+            var inMaxYear = currentYear == maxYear;
+
+            for (var m = 0; m < 12; m++) {
+                if ((!inMinYear || m >= minDate.month()) && (!inMaxYear || m 
<= maxDate.month())) {
+                    monthHtml += "<option value='" + m + "'" +
+                        (m === currentMonth ? " selected='selected'" : "") +
+                        ">" + this.locale.monthNames[m] + "</option>";
+                }
+            }
+            monthHtml += "</select>";
+
+            var yearHtml = '<select class="yearselect">';
+
+            for (var y = minYear; y <= maxYear; y++) {
+                yearHtml += '<option value="' + y + '"' +
+                    (y === currentYear ? ' selected="selected"' : '') +
+                    '>' + y + '</option>';
+            }
+
+            yearHtml += '</select>';
+
+            return monthHtml + yearHtml;
+        },
+
+        renderCalendar: function (calendar, selected, minDate, maxDate, side) {
+
+            var html = '<div class="calendar-date">';
+            html += '<table class="table-condensed">';
+            html += '<thead>';
+            html += '<tr>';
+
+            // add empty cell for week number
+            if (this.showWeekNumbers)
+                html += '<th></th>';
+
+            if (!minDate || minDate.isBefore(calendar.firstDay)) {
+                html += '<th class="prev available"><i class="fa fa-arrow-left 
icon icon-arrow-left glyphicon glyphicon-arrow-left"></i></th>';
+            } else {
+                html += '<th></th>';
+            }
+
+            var dateHtml = this.locale.monthNames[calendar[1][1].month()] + 
calendar[1][1].format(" YYYY");
+
+            if (this.showDropdowns) {
+                dateHtml = this.renderDropdowns(calendar[1][1], minDate, 
maxDate);
+            }
+
+            html += '<th colspan="5" class="month">' + dateHtml + '</th>';
+            if (!maxDate || maxDate.isAfter(calendar.lastDay)) {
+                html += '<th class="next available"><i class="fa 
fa-arrow-right icon icon-arrow-right glyphicon 
glyphicon-arrow-right"></i></th>';
+            } else {
+                html += '<th></th>';
+            }
+
+            html += '</tr>';
+            html += '<tr>';
+
+            // add week number label
+            if (this.showWeekNumbers)
+                html += '<th class="week">' + this.locale.weekLabel + '</th>';
+
+            $.each(this.locale.daysOfWeek, function (index, dayOfWeek) {
+                html += '<th>' + dayOfWeek + '</th>';
+            });
+
+            html += '</tr>';
+            html += '</thead>';
+            html += '<tbody>';
+
+            for (var row = 0; row < 6; row++) {
+                html += '<tr>';
+
+                // add week number
+                if (this.showWeekNumbers)
+                    html += '<td class="week">' + calendar[row][0].week() + 
'</td>';
+
+                for (var col = 0; col < 7; col++) {
+                    var cname = 'available ';
+                    cname += (calendar[row][col].month() == 
calendar[1][1].month()) ? '' : 'off';
+
+                    if ((minDate && calendar[row][col].isBefore(minDate, 
'day')) || (maxDate && calendar[row][col].isAfter(maxDate, 'day'))) {
+                        cname = ' off disabled ';
+                    } else if (calendar[row][col].format('YYYY-MM-DD') == 
selected.format('YYYY-MM-DD')) {
+                        cname += ' active ';
+                        if (calendar[row][col].format('YYYY-MM-DD') == 
this.startDate.format('YYYY-MM-DD')) {
+                            cname += ' start-date ';
+                        }
+                        if (calendar[row][col].format('YYYY-MM-DD') == 
this.endDate.format('YYYY-MM-DD')) {
+                            cname += ' end-date ';
+                        }
+                    } else if (calendar[row][col] >= this.startDate && 
calendar[row][col] <= this.endDate) {
+                        cname += ' in-range ';
+                        if (calendar[row][col].isSame(this.startDate)) { cname 
+= ' start-date '; }
+                        if (calendar[row][col].isSame(this.endDate)) { cname 
+= ' end-date '; }
+                    }
+
+                    var title = 'r' + row + 'c' + col;
+                    html += '<td class="' + cname.replace(/\s+/g, ' 
').replace(/^\s?(.*?)\s?$/, '$1') + '" data-title="' + title + '">' + 
calendar[row][col].date() + '</td>';
+                }
+                html += '</tr>';
+            }
+
+            html += '</tbody>';
+            html += '</table>';
+            html += '</div>';
+
+            var i;
+            if (this.timePicker) {
+
+                html += '<div class="calendar-time">';
+                html += '<select class="hourselect">';
+
+                // Disallow selections before the minDate or after the maxDate
+                var min_hour = 0;
+                var max_hour = 23;
+
+                if (minDate && (side == 'left' || this.singleDatePicker) && 
selected.format('YYYY-MM-DD') == minDate.format('YYYY-MM-DD')) {
+                    min_hour = minDate.hour();
+                    if (selected.hour() < min_hour)
+                        selected.hour(min_hour);
+                    if (this.timePicker12Hour && min_hour >= 12 && 
selected.hour() >= 12)
+                        min_hour -= 12;
+                    if (this.timePicker12Hour && min_hour == 12)
+                        min_hour = 1;
+                }
+
+                if (maxDate && (side == 'right' || this.singleDatePicker) && 
selected.format('YYYY-MM-DD') == maxDate.format('YYYY-MM-DD')) {
+                    max_hour = maxDate.hour();
+                    if (selected.hour() > max_hour)
+                        selected.hour(max_hour);
+                    if (this.timePicker12Hour && max_hour >= 12 && 
selected.hour() >= 12)
+                        max_hour -= 12;
+                }
+
+                var start = 0;
+                var end = 23;
+                var selected_hour = selected.hour();
+                if (this.timePicker12Hour) {
+                    start = 1;
+                    end = 12;
+                    if (selected_hour >= 12)
+                        selected_hour -= 12;
+                    if (selected_hour === 0)
+                        selected_hour = 12;
+                }
+
+                for (i = start; i <= end; i++) {
+
+                    if (i == selected_hour) {
+                        html += '<option value="' + i + '" 
selected="selected">' + i + '</option>';
+                    } else if (i < min_hour || i > max_hour) {
+                        html += '<option value="' + i + '" disabled="disabled" 
class="disabled">' + i + '</option>';
+                    } else {
+                        html += '<option value="' + i + '">' + i + '</option>';
+                    }
+                }
+
+                html += '</select> : ';
+
+                html += '<select class="minuteselect">';
+
+                // Disallow selections before the minDate or after the maxDate
+                var min_minute = 0;
+                var max_minute = 59;
+
+                if (minDate && (side == 'left' || this.singleDatePicker) && 
selected.format('YYYY-MM-DD h A') == minDate.format('YYYY-MM-DD h A')) {
+                    min_minute = minDate.minute();
+                    if (selected.minute() < min_minute)
+                        selected.minute(min_minute);
+                }
+
+                if (maxDate && (side == 'right' || this.singleDatePicker) && 
selected.format('YYYY-MM-DD h A') == maxDate.format('YYYY-MM-DD h A')) {
+                    max_minute = maxDate.minute();
+                    if (selected.minute() > max_minute)
+                        selected.minute(max_minute);
+                }
+
+                for (i = 0; i < 60; i += this.timePickerIncrement) {
+                    var num = i;
+                    if (num < 10)
+                        num = '0' + num;
+                    if (i == selected.minute()) {
+                        html += '<option value="' + i + '" 
selected="selected">' + num + '</option>';
+                    } else if (i < min_minute || i > max_minute) {
+                        html += '<option value="' + i + '" disabled="disabled" 
class="disabled">' + num + '</option>';
+                    } else {
+                        html += '<option value="' + i + '">' + num + 
'</option>';
+                    }
+                }
+
+                html += '</select> ';
+
+                if (this.timePickerSeconds) {
+                    html += ': <select class="secondselect">';
+
+                    for (i = 0; i < 60; i += this.timePickerIncrement) {
+                        var num = i;
+                        if (num < 10)
+                            num = '0' + num;
+                        if (i == selected.second()) {
+                            html += '<option value="' + i + '" 
selected="selected">' + num + '</option>';
+                        } else {
+                            html += '<option value="' + i + '">' + num + 
'</option>';
+                        }
+                    }
+
+                    html += '</select>';
+                }
+
+                if (this.timePicker12Hour) {
+                    html += '<select class="ampmselect">';
+
+                    // Disallow selection before the minDate or after the 
maxDate
+                    var am_html = '';
+                    var pm_html = '';
+
+                    if (minDate && (side == 'left' || this.singleDatePicker) 
&& selected.format('YYYY-MM-DD') == minDate.format('YYYY-MM-DD') && 
minDate.hour() >= 12) {
+                        am_html = ' disabled="disabled" class="disabled"';
+                    }
+
+                    if (maxDate && (side == 'right' || this.singleDatePicker) 
&& selected.format('YYYY-MM-DD') == maxDate.format('YYYY-MM-DD') && 
maxDate.hour() < 12) {
+                        pm_html = ' disabled="disabled" class="disabled"';
+                    }
+
+                    if (selected.hour() >= 12) {
+                        html += '<option value="AM"' + am_html + 
'>AM</option><option value="PM" selected="selected"' + pm_html + '>PM</option>';
+                    } else {
+                        html += '<option value="AM" selected="selected"' + 
am_html + '>AM</option><option value="PM"' + pm_html + '>PM</option>';
+                    }
+                    html += '</select>';
+                }
+
+                html += '</div>';
+
+            }
+
+            return html;
+
+        },
+
+        remove: function() {
+
+            this.container.remove();
+            this.element.off('.daterangepicker');
+            this.element.removeData('daterangepicker');
+
+        }
+
+    };
+
+    $.fn.daterangepicker = function (options, cb) {
+        this.each(function () {
+            var el = $(this);
+            if (el.data('daterangepicker'))
+                el.data('daterangepicker').remove();
+            el.data('daterangepicker', new DateRangePicker(el, options, cb));
+        });
+        return this;
+    };
+
+}));

Reply via email to