daterangepicker.js 100 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427
  1. // jquery.daterangepicker.js
  2. // author : Chunlong Liu
  3. // license : MIT
  4. // www.jszen.com
  5. (function (factory) {
  6. if (typeof define === 'function' && define.amd) {
  7. // AMD. Register as an anonymous module.
  8. define(['jquery', 'moment'], factory);
  9. } else if (typeof exports === 'object' && typeof module !== 'undefined') {
  10. // CommonJS. Register as a module
  11. module.exports = factory(require('jquery'), require('moment'));
  12. } else {
  13. // Browser globals
  14. factory(jQuery, moment);
  15. }
  16. }(function ($, moment) {
  17. 'use strict';
  18. $.dateRangePickerLanguages = {
  19. "default": //default language: English
  20. {
  21. "selected": "Selected:",
  22. "day": "Day",
  23. "days": "Days",
  24. "apply": "Close",
  25. "week-1": "mo",
  26. "week-2": "tu",
  27. "week-3": "we",
  28. "week-4": "th",
  29. "week-5": "fr",
  30. "week-6": "sa",
  31. "week-7": "su",
  32. "week-number": "W",
  33. "month-name": ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"],
  34. "shortcuts": "Shortcuts",
  35. "custom-values": "Custom Values",
  36. "past": "Past",
  37. "following": "Following",
  38. "previous": "Previous",
  39. "prev-week": "Week",
  40. "prev-month": "Month",
  41. "prev-year": "Year",
  42. "next": "Next",
  43. "next-week": "Week",
  44. "next-month": "Month",
  45. "next-year": "Year",
  46. "less-than": "Date range should not be more than %d days",
  47. "more-than": "Date range should not be less than %d days",
  48. "default-more": "Please select a date range longer than %d days",
  49. "default-single": "Please select a date",
  50. "default-less": "Please select a date range less than %d days",
  51. "default-range": "Please select a date range between %d and %d days",
  52. "default-default": "Please select a date range",
  53. "time": "Time",
  54. "hour": "Hour",
  55. "minute": "Minute"
  56. },
  57. "id": {
  58. "selected": "Terpilih:",
  59. "day": "Hari",
  60. "days": "Hari",
  61. "apply": "Tutup",
  62. "week-1": "sen",
  63. "week-2": "sel",
  64. "week-3": "rab",
  65. "week-4": "kam",
  66. "week-5": "jum",
  67. "week-6": "sab",
  68. "week-7": "min",
  69. "week-number": "W",
  70. "month-name": ["januari", "februari", "maret", "april", "mei", "juni", "juli", "agustus", "september", "oktober", "november", "desember"],
  71. "shortcuts": "Pintas",
  72. "custom-values": "Nilai yang ditentukan",
  73. "past": "Yang Lalu",
  74. "following": "Mengikuti",
  75. "previous": "Sebelumnya",
  76. "prev-week": "Minggu",
  77. "prev-month": "Bulan",
  78. "prev-year": "Tahun",
  79. "next": "Selanjutnya",
  80. "next-week": "Minggu",
  81. "next-month": "Bulan",
  82. "next-year": "Tahun",
  83. "less-than": "Tanggal harus lebih dari %d hari",
  84. "more-than": "Tanggal harus kurang dari %d hari",
  85. "default-more": "Jarak tanggal harus lebih lama dari %d hari",
  86. "default-single": "Silakan pilih tanggal",
  87. "default-less": "Jarak rentang tanggal tidak boleh lebih lama dari %d hari",
  88. "default-range": "Rentang tanggal harus antara %d dan %d hari",
  89. "default-default": "Silakan pilih rentang tanggal",
  90. "time": "Waktu",
  91. "hour": "Jam",
  92. "minute": "Menit"
  93. },
  94. "az": {
  95. "selected": "Seçildi:",
  96. "day": " gün",
  97. "days": " gün",
  98. "apply": "tətbiq",
  99. "week-1": "1",
  100. "week-2": "2",
  101. "week-3": "3",
  102. "week-4": "4",
  103. "week-5": "5",
  104. "week-6": "6",
  105. "week-7": "7",
  106. "month-name": ["yanvar", "fevral", "mart", "aprel", "may", "iyun", "iyul", "avqust", "sentyabr", "oktyabr", "noyabr", "dekabr"],
  107. "shortcuts": "Qısayollar",
  108. "past": "Keçmiş",
  109. "following": "Növbəti",
  110. "previous": "   ",
  111. "prev-week": "Öncəki həftə",
  112. "prev-month": "Öncəki ay",
  113. "prev-year": "Öncəki il",
  114. "next": "   ",
  115. "next-week": "Növbəti həftə",
  116. "next-month": "Növbəti ay",
  117. "next-year": "Növbəti il",
  118. "less-than": "Tarix aralığı %d gündən çox olmamalıdır",
  119. "more-than": "Tarix aralığı %d gündən az olmamalıdır",
  120. "default-more": "%d gündən çox bir tarix seçin",
  121. "default-single": "Tarix seçin",
  122. "default-less": "%d gündən az bir tarix seçin",
  123. "default-range": "%d və %d gün aralığında tarixlər seçin",
  124. "default-default": "Tarix aralığı seçin"
  125. },
  126. "bg": {
  127. "selected": "Избрано:",
  128. "day": "Ден",
  129. "days": "Дни",
  130. "apply": "Затвори",
  131. "week-1": "пн",
  132. "week-2": "вт",
  133. "week-3": "ср",
  134. "week-4": "чт",
  135. "week-5": "пт",
  136. "week-6": "сб",
  137. "week-7": "нд",
  138. "week-number": "С",
  139. "month-name": ["януари", "февруари", "март", "април", "май", "юни", "юли", "август", "септември", "октомври", "ноември", "декември"],
  140. "shortcuts": "Преки пътища",
  141. "custom-values": "Персонализирани стойности",
  142. "past": "Минал",
  143. "following": "Следващ",
  144. "previous": "Предишен",
  145. "prev-week": "Седмица",
  146. "prev-month": "Месец",
  147. "prev-year": "Година",
  148. "next": "Следващ",
  149. "next-week": "Седмица",
  150. "next-month": "Месец",
  151. "next-year": "Година",
  152. "less-than": "Периодът от време не трябва да е повече от %d дни",
  153. "more-than": "Периодът от време не трябва да е по-малко от %d дни",
  154. "default-more": "Моля изберете период по-дълъг от %d дни",
  155. "default-single": "Моля изберете дата",
  156. "default-less": "Моля изберете период по-къс от %d дни",
  157. "default-range": "Моля изберете период между %d и %d дни",
  158. "default-default": "Моля изберете период",
  159. "time": "Време",
  160. "hour": "Час",
  161. "minute": "Минута"
  162. },
  163. "cn": //simplified chinese
  164. {
  165. "selected": "已选择:",
  166. "day": "天",
  167. "days": "天",
  168. "apply": "确定",
  169. "week-1": "一",
  170. "week-2": "二",
  171. "week-3": "三",
  172. "week-4": "四",
  173. "week-5": "五",
  174. "week-6": "六",
  175. "week-7": "日",
  176. "week-number": "周",
  177. "month-name": ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
  178. "shortcuts": "快捷选择",
  179. "past": "过去",
  180. "following": "将来",
  181. "previous": "   ",
  182. "prev-week": "上周",
  183. "prev-month": "上个月",
  184. "prev-year": "去年",
  185. "next": "   ",
  186. "next-week": "下周",
  187. "next-month": "下个月",
  188. "next-year": "明年",
  189. "less-than": "所选日期范围不能大于%d天",
  190. "more-than": "所选日期范围不能小于%d天",
  191. "default-more": "请选择大于%d天的日期范围",
  192. "default-less": "请选择小于%d天的日期范围",
  193. "default-range": "请选择%d天到%d天的日期范围",
  194. "default-single": "请选择一个日期",
  195. "default-default": "请选择一个日期范围",
  196. "time": "时间",
  197. "hour": "小时",
  198. "minute": "分钟"
  199. },
  200. "cz": {
  201. "selected": "Vybráno:",
  202. "day": "Den",
  203. "days": "Dny",
  204. "apply": "Zavřít",
  205. "week-1": "po",
  206. "week-2": "út",
  207. "week-3": "st",
  208. "week-4": "čt",
  209. "week-5": "pá",
  210. "week-6": "so",
  211. "week-7": "ne",
  212. "month-name": ["leden", "únor", "březen", "duben", "květen", "červen", "červenec", "srpen", "září", "říjen", "listopad", "prosinec"],
  213. "shortcuts": "Zkratky",
  214. "past": "po",
  215. "following": "následující",
  216. "previous": "předchozí",
  217. "prev-week": "týden",
  218. "prev-month": "měsíc",
  219. "prev-year": "rok",
  220. "next": "další",
  221. "next-week": "týden",
  222. "next-month": "měsíc",
  223. "next-year": "rok",
  224. "less-than": "Rozsah data by neměl být větší než %d dnů",
  225. "more-than": "Rozsah data by neměl být menší než %d dnů",
  226. "default-more": "Prosím zvolte rozsah data větší než %d dnů",
  227. "default-single": "Prosím zvolte datum",
  228. "default-less": "Prosím zvolte rozsah data menší než %d dnů",
  229. "default-range": "Prosím zvolte rozsah data mezi %d a %d dny",
  230. "default-default": "Prosím zvolte rozsah data"
  231. },
  232. "de": {
  233. "selected": "Auswahl:",
  234. "day": "Tag",
  235. "days": "Tage",
  236. "apply": "Schließen",
  237. "week-1": "mo",
  238. "week-2": "di",
  239. "week-3": "mi",
  240. "week-4": "do",
  241. "week-5": "fr",
  242. "week-6": "sa",
  243. "week-7": "so",
  244. "month-name": ["januar", "februar", "märz", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "dezember"],
  245. "shortcuts": "Schnellwahl",
  246. "past": "Vorherige",
  247. "following": "Folgende",
  248. "previous": "Vorherige",
  249. "prev-week": "Woche",
  250. "prev-month": "Monat",
  251. "prev-year": "Jahr",
  252. "next": "Nächste",
  253. "next-week": "Woche",
  254. "next-month": "Monat",
  255. "next-year": "Jahr",
  256. "less-than": "Datumsbereich darf nicht größer sein als %d Tage",
  257. "more-than": "Datumsbereich darf nicht kleiner sein als %d Tage",
  258. "default-more": "Bitte mindestens %d Tage auswählen",
  259. "default-single": "Bitte ein Datum auswählen",
  260. "default-less": "Bitte weniger als %d Tage auswählen",
  261. "default-range": "Bitte einen Datumsbereich zwischen %d und %d Tagen auswählen",
  262. "default-default": "Bitte ein Start- und Enddatum auswählen",
  263. "Time": "Zeit",
  264. "hour": "Stunde",
  265. "minute": "Minute"
  266. },
  267. "es": {
  268. "selected": "Seleccionado:",
  269. "day": "Día",
  270. "days": "Días",
  271. "apply": "Cerrar",
  272. "week-1": "lu",
  273. "week-2": "ma",
  274. "week-3": "mi",
  275. "week-4": "ju",
  276. "week-5": "vi",
  277. "week-6": "sa",
  278. "week-7": "do",
  279. "month-name": ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"],
  280. "shortcuts": "Accesos directos",
  281. "past": "Pasado",
  282. "following": "Siguiente",
  283. "previous": "Anterior",
  284. "prev-week": "Semana",
  285. "prev-month": "Mes",
  286. "prev-year": "Año",
  287. "next": "Siguiente",
  288. "next-week": "Semana",
  289. "next-month": "Mes",
  290. "next-year": "Año",
  291. "less-than": "El rango no debería ser mayor de %d días",
  292. "more-than": "El rango no debería ser menor de %d días",
  293. "default-more": "Por favor selecciona un rango mayor a %d días",
  294. "default-single": "Por favor selecciona un día",
  295. "default-less": "Por favor selecciona un rango menor a %d días",
  296. "default-range": "Por favor selecciona un rango entre %d y %d días",
  297. "default-default": "Por favor selecciona un rango de fechas."
  298. },
  299. "fr": {
  300. "selected": "Sélection:",
  301. "day": "Jour",
  302. "days": "Jours",
  303. "apply": "Fermer",
  304. "week-1": "lu",
  305. "week-2": "ma",
  306. "week-3": "me",
  307. "week-4": "je",
  308. "week-5": "ve",
  309. "week-6": "sa",
  310. "week-7": "di",
  311. "month-name": ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"],
  312. "shortcuts": "Raccourcis",
  313. "past": "Passé",
  314. "following": "Suivant",
  315. "previous": "Précédent",
  316. "prev-week": "Semaine",
  317. "prev-month": "Mois",
  318. "prev-year": "Année",
  319. "next": "Suivant",
  320. "next-week": "Semaine",
  321. "next-month": "Mois",
  322. "next-year": "Année",
  323. "less-than": "L'intervalle ne doit pas être supérieure à %d jours",
  324. "more-than": "L'intervalle ne doit pas être inférieure à %d jours",
  325. "default-more": "Merci de choisir une intervalle supérieure à %d jours",
  326. "default-single": "Merci de choisir une date",
  327. "default-less": "Merci de choisir une intervalle inférieure %d jours",
  328. "default-range": "Merci de choisir une intervalle comprise entre %d et %d jours",
  329. "default-default": "Merci de choisir une date"
  330. },
  331. "hu": {
  332. "selected": "Kiválasztva:",
  333. "day": "Nap",
  334. "days": "Nap",
  335. "apply": "Ok",
  336. "week-1": "h",
  337. "week-2": "k",
  338. "week-3": "sz",
  339. "week-4": "cs",
  340. "week-5": "p",
  341. "week-6": "sz",
  342. "week-7": "v",
  343. "month-name": ["január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"],
  344. "shortcuts": "Gyorsválasztó",
  345. "past": "Múlt",
  346. "following": "Következő",
  347. "previous": "Előző",
  348. "prev-week": "Hét",
  349. "prev-month": "Hónap",
  350. "prev-year": "Év",
  351. "next": "Következő",
  352. "next-week": "Hét",
  353. "next-month": "Hónap",
  354. "next-year": "Év",
  355. "less-than": "A kiválasztás nem lehet több %d napnál",
  356. "more-than": "A kiválasztás nem lehet több %d napnál",
  357. "default-more": "Válassz ki egy időszakot ami hosszabb mint %d nap",
  358. "default-single": "Válassz egy napot",
  359. "default-less": "Válassz ki egy időszakot ami rövidebb mint %d nap",
  360. "default-range": "Válassz ki egy %d - %d nap hosszú időszakot",
  361. "default-default": "Válassz ki egy időszakot"
  362. },
  363. "it": {
  364. "selected": "Selezionati:",
  365. "day": "Giorno",
  366. "days": "Giorni",
  367. "apply": "Chiudi",
  368. "week-1": "lu",
  369. "week-2": "ma",
  370. "week-3": "me",
  371. "week-4": "gi",
  372. "week-5": "ve",
  373. "week-6": "sa",
  374. "week-7": "do",
  375. "month-name": ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"],
  376. "shortcuts": "Scorciatoie",
  377. "past": "Scorso",
  378. "following": "Successivo",
  379. "previous": "Precedente",
  380. "prev-week": "Settimana",
  381. "prev-month": "Mese",
  382. "prev-year": "Anno",
  383. "next": "Prossimo",
  384. "next-week": "Settimana",
  385. "next-month": "Mese",
  386. "next-year": "Anno",
  387. "less-than": "L'intervallo non dev'essere maggiore di %d giorni",
  388. "more-than": "L'intervallo non dev'essere minore di %d giorni",
  389. "default-more": "Seleziona un intervallo maggiore di %d giorni",
  390. "default-single": "Seleziona una data",
  391. "default-less": "Seleziona un intervallo minore di %d giorni",
  392. "default-range": "Seleziona un intervallo compreso tra i %d e i %d giorni",
  393. "default-default": "Seleziona un intervallo di date"
  394. },
  395. "ko": {
  396. "selected": "기간:",
  397. "day": "일",
  398. "days": "일간",
  399. "apply": "닫기",
  400. "week-1": "월",
  401. "week-2": "화",
  402. "week-3": "수",
  403. "week-4": "목",
  404. "week-5": "금",
  405. "week-6": "토",
  406. "week-7": "일",
  407. "week-number": "주",
  408. "month-name": ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"],
  409. "shortcuts": "단축키들",
  410. "past": "지난(오늘기준)",
  411. "following": "이후(오늘기준)",
  412. "previous": "이전",
  413. "prev-week": "1주",
  414. "prev-month": "1달",
  415. "prev-year": "1년",
  416. "next": "다음",
  417. "next-week": "1주",
  418. "next-month": "1달",
  419. "next-year": "1년",
  420. "less-than": "날짜 범위는 %d 일보다 많을 수 없습니다",
  421. "more-than": "날짜 범위는 %d 일보다 작을 수 없습니다",
  422. "default-more": "날짜 범위를 %d 일보다 길게 선택해 주세요",
  423. "default-single": "날짜를 선택해 주세요",
  424. "default-less": "%d 일보다 작은 날짜를 선택해 주세요",
  425. "default-range": "%d와 %d 일 사이의 날짜 범위를 선택해 주세요",
  426. "default-default": "날짜 범위를 선택해 주세요",
  427. "time": "시각",
  428. "hour": "시",
  429. "minute": "분"
  430. },
  431. "no": {
  432. "selected": "Valgt:",
  433. "day": "Dag",
  434. "days": "Dager",
  435. "apply": "Lukk",
  436. "week-1": "ma",
  437. "week-2": "ti",
  438. "week-3": "on",
  439. "week-4": "to",
  440. "week-5": "fr",
  441. "week-6": "lø",
  442. "week-7": "sø",
  443. "month-name": ["januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"],
  444. "shortcuts": "Snarveier",
  445. "custom-values": "Egendefinerte Verdier",
  446. "past": "Over", // Not quite sure about the context of this one
  447. "following": "Følger",
  448. "previous": "Forrige",
  449. "prev-week": "Uke",
  450. "prev-month": "Måned",
  451. "prev-year": "År",
  452. "next": "Neste",
  453. "next-week": "Uke",
  454. "next-month": "Måned",
  455. "next-year": "År",
  456. "less-than": "Datoperioden skal ikkje være lengre enn %d dager",
  457. "more-than": "Datoperioden skal ikkje være kortere enn %d dager",
  458. "default-more": "Vennligst velg ein datoperiode lengre enn %d dager",
  459. "default-single": "Vennligst velg ein dato",
  460. "default-less": "Vennligst velg ein datoperiode mindre enn %d dager",
  461. "default-range": "Vennligst velg ein datoperiode mellom %d og %d dager",
  462. "default-default": "Vennligst velg ein datoperiode",
  463. "time": "Tid",
  464. "hour": "Time",
  465. "minute": "Minutter"
  466. },
  467. "nl": {
  468. "selected": "Geselecteerd:",
  469. "day": "Dag",
  470. "days": "Dagen",
  471. "apply": "Ok",
  472. "week-1": "ma",
  473. "week-2": "di",
  474. "week-3": "wo",
  475. "week-4": "do",
  476. "week-5": "vr",
  477. "week-6": "za",
  478. "week-7": "zo",
  479. "month-name": ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"],
  480. "shortcuts": "Snelkoppelingen",
  481. "custom-values": "Aangepaste waarden",
  482. "past": "Verleden",
  483. "following": "Komend",
  484. "previous": "Vorige",
  485. "prev-week": "Week",
  486. "prev-month": "Maand",
  487. "prev-year": "Jaar",
  488. "next": "Volgende",
  489. "next-week": "Week",
  490. "next-month": "Maand",
  491. "next-year": "Jaar",
  492. "less-than": "Interval moet langer dan %d dagen zijn",
  493. "more-than": "Interval mag niet minder dan %d dagen zijn",
  494. "default-more": "Selecteer een interval langer dan %dagen",
  495. "default-single": "Selecteer een datum",
  496. "default-less": "Selecteer een interval minder dan %d dagen",
  497. "default-range": "Selecteer een interval tussen %d en %d dagen",
  498. "default-default": "Selecteer een interval",
  499. "time": "Tijd",
  500. "hour": "Uur",
  501. "minute": "Minuut"
  502. },
  503. "ru": {
  504. "selected": "Выбрано:",
  505. "day": "День",
  506. "days": "Дней",
  507. "apply": "Применить",
  508. "week-1": "пн",
  509. "week-2": "вт",
  510. "week-3": "ср",
  511. "week-4": "чт",
  512. "week-5": "пт",
  513. "week-6": "сб",
  514. "week-7": "вс",
  515. "month-name": ["январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь"],
  516. "shortcuts": "Быстрый выбор",
  517. "custom-values": "Пользовательские значения",
  518. "past": "Прошедшие",
  519. "following": "Следующие",
  520. "previous": "   ",
  521. "prev-week": "Неделя",
  522. "prev-month": "Месяц",
  523. "prev-year": "Год",
  524. "next": "   ",
  525. "next-week": "Неделя",
  526. "next-month": "Месяц",
  527. "next-year": "Год",
  528. "less-than": "Диапазон не может быть больше %d дней",
  529. "more-than": "Диапазон не может быть меньше %d дней",
  530. "default-more": "Пожалуйста выберите диапазон больше %d дней",
  531. "default-single": "Пожалуйста выберите дату",
  532. "default-less": "Пожалуйста выберите диапазон меньше %d дней",
  533. "default-range": "Пожалуйста выберите диапазон между %d и %d днями",
  534. "default-default": "Пожалуйста выберите диапазон",
  535. "time": "Время",
  536. "hour": "Часы",
  537. "minute": "Минуты"
  538. },
  539. "pl": {
  540. "selected": "Wybrany:",
  541. "day": "Dzień",
  542. "days": "Dni",
  543. "apply": "Zamknij",
  544. "week-1": "pon",
  545. "week-2": "wt",
  546. "week-3": "śr",
  547. "week-4": "czw",
  548. "week-5": "pt",
  549. "week-6": "so",
  550. "week-7": "nd",
  551. "month-name": ["styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień"],
  552. "shortcuts": "Skróty",
  553. "custom-values": "Niestandardowe wartości",
  554. "past": "Przeszłe",
  555. "following": "Następne",
  556. "previous": "Poprzednie",
  557. "prev-week": "tydzień",
  558. "prev-month": "miesiąc",
  559. "prev-year": "rok",
  560. "next": "Następny",
  561. "next-week": "tydzień",
  562. "next-month": "miesiąc",
  563. "next-year": "rok",
  564. "less-than": "Okres nie powinien być dłuższy niż %d dni",
  565. "more-than": "Okres nie powinien być krótszy niż %d ni",
  566. "default-more": "Wybierz okres dłuższy niż %d dni",
  567. "default-single": "Wybierz datę",
  568. "default-less": "Wybierz okres krótszy niż %d dni",
  569. "default-range": "Wybierz okres trwający od %d do %d dni",
  570. "default-default": "Wybierz okres",
  571. "time": "Czas",
  572. "hour": "Godzina",
  573. "minute": "Minuta"
  574. },
  575. "se": {
  576. "selected": "Vald:",
  577. "day": "dag",
  578. "days": "dagar",
  579. "apply": "godkänn",
  580. "week-1": "ma",
  581. "week-2": "ti",
  582. "week-3": "on",
  583. "week-4": "to",
  584. "week-5": "fr",
  585. "week-6": "lö",
  586. "week-7": "sö",
  587. "month-name": ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"],
  588. "shortcuts": "genvägar",
  589. "custom-values": "Anpassade värden",
  590. "past": "över",
  591. "following": "följande",
  592. "previous": "förra",
  593. "prev-week": "vecka",
  594. "prev-month": "månad",
  595. "prev-year": "år",
  596. "next": "nästa",
  597. "next-week": "vecka",
  598. "next-month": "måned",
  599. "next-year": "år",
  600. "less-than": "Datumintervall bör inte vara mindre än %d dagar",
  601. "more-than": "Datumintervall bör inte vara mer än %d dagar",
  602. "default-more": "Välj ett datumintervall längre än %d dagar",
  603. "default-single": "Välj ett datum",
  604. "default-less": "Välj ett datumintervall mindre än %d dagar",
  605. "default-range": "Välj ett datumintervall mellan %d och %d dagar",
  606. "default-default": "Välj ett datumintervall",
  607. "time": "tid",
  608. "hour": "timme",
  609. "minute": "minut"
  610. },
  611. "pt": //Portuguese (European)
  612. {
  613. "selected": "Selecionado:",
  614. "day": "Dia",
  615. "days": "Dias",
  616. "apply": "Fechar",
  617. "week-1": "seg",
  618. "week-2": "ter",
  619. "week-3": "qua",
  620. "week-4": "qui",
  621. "week-5": "sex",
  622. "week-6": "sab",
  623. "week-7": "dom",
  624. "week-number": "N",
  625. "month-name": ["janeiro", "fevereiro", "março", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"],
  626. "shortcuts": "Atalhos",
  627. "custom-values": "Valores Personalizados",
  628. "past": "Passado",
  629. "following": "Seguinte",
  630. "previous": "Anterior",
  631. "prev-week": "Semana",
  632. "prev-month": "Mês",
  633. "prev-year": "Ano",
  634. "next": "Próximo",
  635. "next-week": "Próxima Semana",
  636. "next-month": "Próximo Mês",
  637. "next-year": "Próximo Ano",
  638. "less-than": "O período selecionado não deve ser maior que %d dias",
  639. "more-than": "O período selecionado não deve ser menor que %d dias",
  640. "default-more": "Selecione um período superior a %d dias",
  641. "default-single": "Selecione uma data",
  642. "default-less": "Selecione um período inferior a %d dias",
  643. "default-range": "Selecione um período de %d a %d dias",
  644. "default-default": "Selecione um período",
  645. "time": "Tempo",
  646. "hour": "Hora",
  647. "minute": "Minuto"
  648. },
  649. "tc": // traditional chinese
  650. {
  651. "selected": "已選擇:",
  652. "day": "天",
  653. "days": "天",
  654. "apply": "確定",
  655. "week-1": "一",
  656. "week-2": "二",
  657. "week-3": "三",
  658. "week-4": "四",
  659. "week-5": "五",
  660. "week-6": "六",
  661. "week-7": "日",
  662. "week-number": "周",
  663. "month-name": ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"],
  664. "shortcuts": "快速選擇",
  665. "past": "過去",
  666. "following": "將來",
  667. "previous": "   ",
  668. "prev-week": "上週",
  669. "prev-month": "上個月",
  670. "prev-year": "去年",
  671. "next": "   ",
  672. "next-week": "下周",
  673. "next-month": "下個月",
  674. "next-year": "明年",
  675. "less-than": "所選日期範圍不能大於%d天",
  676. "more-than": "所選日期範圍不能小於%d天",
  677. "default-more": "請選擇大於%d天的日期範圍",
  678. "default-less": "請選擇小於%d天的日期範圍",
  679. "default-range": "請選擇%d天到%d天的日期範圍",
  680. "default-single": "請選擇一個日期",
  681. "default-default": "請選擇一個日期範圍",
  682. "time": "日期",
  683. "hour": "小時",
  684. "minute": "分鐘"
  685. },
  686. "ja": {
  687. "selected": "選択しました:",
  688. "day": "日",
  689. "days": "日々",
  690. "apply": "閉じる",
  691. "week-1": "月",
  692. "week-2": "火",
  693. "week-3": "水",
  694. "week-4": "木",
  695. "week-5": "金",
  696. "week-6": "土",
  697. "week-7": "日",
  698. "month-name": ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
  699. "shortcuts": "クイック選択",
  700. "past": "過去",
  701. "following": "将来",
  702. "previous": "   ",
  703. "prev-week": "先週、",
  704. "prev-month": "先月",
  705. "prev-year": "昨年",
  706. "next": "   ",
  707. "next-week": "来週",
  708. "next-month": "来月",
  709. "next-year": "来年",
  710. "less-than": "日付の範囲は %d 日以上にすべきではありません",
  711. "more-than": "日付の範囲は %d 日を下回ってはいけません",
  712. "default-more": "%d 日よりも長い期間を選択してください",
  713. "default-less": "%d 日未満の期間を選択してください",
  714. "default-range": "%d と% d日の間の日付範囲を選択してください",
  715. "default-single": "日付を選択してください",
  716. "default-default": "日付範囲を選択してください",
  717. "time": "時間",
  718. "hour": "時間",
  719. "minute": "分"
  720. },
  721. "da": {
  722. "selected": "Valgt:",
  723. "day": "Dag",
  724. "days": "Dage",
  725. "apply": "Luk",
  726. "week-1": "ma",
  727. "week-2": "ti",
  728. "week-3": "on",
  729. "week-4": "to",
  730. "week-5": "fr",
  731. "week-6": "lö",
  732. "week-7": "sö",
  733. "month-name": ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"],
  734. "shortcuts": "genveje",
  735. "custom-values": "Brugerdefinerede værdier",
  736. "past": "Forbi",
  737. "following": "Følgende",
  738. "previous": "Forrige",
  739. "prev-week": "uge",
  740. "prev-month": "månad",
  741. "prev-year": "år",
  742. "next": "Næste",
  743. "next-week": "Næste uge",
  744. "next-month": "Næste måned",
  745. "next-year": "Næste år",
  746. "less-than": "Dato interval bør ikke være med end %d dage",
  747. "more-than": "Dato interval bør ikke være mindre end %d dage",
  748. "default-more": "Vælg datointerval længere end %d dage",
  749. "default-single": "Vælg dato",
  750. "default-less": "Vælg datointerval mindre end %d dage",
  751. "default-range": "Vælg datointerval mellem %d og %d dage",
  752. "default-default": "Vælg datointerval",
  753. "time": "tid",
  754. "hour": "time",
  755. "minute": "minut"
  756. },
  757. "fi": // Finnish
  758. {
  759. "selected": "Valittu:",
  760. "day": "Päivä",
  761. "days": "Päivää",
  762. "apply": "Sulje",
  763. "week-1": "ma",
  764. "week-2": "ti",
  765. "week-3": "ke",
  766. "week-4": "to",
  767. "week-5": "pe",
  768. "week-6": "la",
  769. "week-7": "su",
  770. "week-number": "V",
  771. "month-name": ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"],
  772. "shortcuts": "Pikavalinnat",
  773. "custom-values": "Mukautetut Arvot",
  774. "past": "Menneet",
  775. "following": "Tulevat",
  776. "previous": "Edellinen",
  777. "prev-week": "Viikko",
  778. "prev-month": "Kuukausi",
  779. "prev-year": "Vuosi",
  780. "next": "Seuraava",
  781. "next-week": "Viikko",
  782. "next-month": "Kuukausi",
  783. "next-year": "Vuosi",
  784. "less-than": "Aikajakson tulisi olla vähemmän kuin %d päivää",
  785. "more-than": "Aikajakson ei tulisi olla vähempää kuin %d päivää",
  786. "default-more": "Valitse pidempi aikajakso kuin %d päivää",
  787. "default-single": "Valitse päivä",
  788. "default-less": "Valitse lyhyempi aikajakso kuin %d päivää",
  789. "default-range": "Valitse aikajakso %d ja %d päivän väliltä",
  790. "default-default": "Valitse aikajakso",
  791. "time": "Aika",
  792. "hour": "Tunti",
  793. "minute": "Minuutti"
  794. },
  795. "cat": // Catala
  796. {
  797. "selected": "Seleccionats:",
  798. "day": "Dia",
  799. "days": "Dies",
  800. "apply": "Tanca",
  801. "week-1": "Dl",
  802. "week-2": "Dm",
  803. "week-3": "Dc",
  804. "week-4": "Dj",
  805. "week-5": "Dv",
  806. "week-6": "Ds",
  807. "week-7": "Dg",
  808. "week-number": "S",
  809. "month-name": ["gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre"],
  810. "shortcuts": "Dreçeres",
  811. "custom-values": "Valors personalitzats",
  812. "past": "Passat",
  813. "following": "Futur",
  814. "previous": "Anterior",
  815. "prev-week": "Setmana",
  816. "prev-month": "Mes",
  817. "prev-year": "Any",
  818. "next": "Següent",
  819. "next-week": "Setmana",
  820. "next-month": "Mes",
  821. "next-year": "Any",
  822. "less-than": "El període no hauria de ser de més de %d dies",
  823. "more-than": "El període no hauria de ser de menys de %d dies",
  824. "default-more": "Perfavor selecciona un període més gran de %d dies",
  825. "default-single": "Perfavor selecciona una data",
  826. "default-less": "Perfavor selecciona un període de menys de %d dies",
  827. "default-range": "Perfavor selecciona un període d'entre %d i %d dies",
  828. "default-default": "Perfavor selecciona un període",
  829. "time": "Temps",
  830. "hour": "Hora",
  831. "minute": "Minut"
  832. }
  833. };
  834. $.fn.dateRangePicker = function (opt) {
  835. if (!opt) opt = {};
  836. opt = $.extend(true, {
  837. autoClose: false,
  838. format: 'YYYY-MM-DD',
  839. separator: ' - ',
  840. language: 'auto',
  841. startOfWeek: 'sunday', // or monday
  842. getValue: function () {
  843. return $(this).val();
  844. },
  845. setValue: function (s) {
  846. if (!$(this).attr('readonly') && !$(this).is(':disabled') && s != $(this).val()) {
  847. $(this).val(s);
  848. }
  849. },
  850. startDate: false,
  851. endDate: false,
  852. time: {
  853. enabled: false
  854. },
  855. minDays: 0,
  856. maxDays: 0,
  857. showShortcuts: false,
  858. shortcuts: {
  859. //'prev-days': [1,3,5,7],
  860. // 'next-days': [3,5,7],
  861. //'prev' : ['week','month','year'],
  862. // 'next' : ['week','month','year']
  863. },
  864. customShortcuts: [],
  865. inline: false,
  866. container: 'body',
  867. alwaysOpen: false,
  868. singleDate: false,
  869. lookBehind: false,
  870. batchMode: false,
  871. duration: 700,
  872. stickyMonths: false,
  873. dayDivAttrs: [],
  874. dayTdAttrs: [],
  875. selectForward: false,
  876. selectBackward: false,
  877. applyBtnClass: '',
  878. singleMonth: 'auto',
  879. hoveringTooltip: function (days, startTime, hoveringTime) {
  880. return days > 1 ? days + ' ' + translate('days') : '';
  881. },
  882. showTopbar: true,
  883. swapTime: false,
  884. showWeekNumbers: false,
  885. getWeekNumber: function (date) //date will be the first day of a week
  886. {
  887. return moment(date).format('w');
  888. },
  889. customOpenAnimation: null,
  890. customCloseAnimation: null,
  891. customArrowPrevSymbol: null,
  892. customArrowNextSymbol: null
  893. }, opt);
  894. opt.start = false;
  895. opt.end = false;
  896. opt.startWeek = false;
  897. //detect a touch device
  898. opt.isTouchDevice = 'ontouchstart' in window || navigator.msMaxTouchPoints;
  899. //if it is a touch device, hide hovering tooltip
  900. if (opt.isTouchDevice) opt.hoveringTooltip = false;
  901. //show one month on mobile devices
  902. if (opt.singleMonth == 'auto') opt.singleMonth = $(window).width() < 480;
  903. if (opt.singleMonth) opt.stickyMonths = false;
  904. if (!opt.showTopbar) opt.autoClose = true;
  905. if (opt.startDate && typeof opt.startDate == 'string') opt.startDate = moment(opt.startDate, opt.format).toDate();
  906. if (opt.endDate && typeof opt.endDate == 'string') opt.endDate = moment(opt.endDate, opt.format).toDate();
  907. var languages = getLanguages();
  908. var box;
  909. var initiated = false;
  910. var self = this;
  911. var selfDom = $(self).get(0);
  912. var domChangeTimer;
  913. $(this).unbind('.datepicker').bind('click.datepicker', function (evt) {
  914. var isOpen = box.is(':visible');
  915. if (!isOpen) open(opt.duration);
  916. }).bind('change.datepicker', function (evt) {
  917. checkAndSetDefaultValue();
  918. }).bind('keyup.datepicker', function () {
  919. try {
  920. clearTimeout(domChangeTimer);
  921. } catch (e) {
  922. }
  923. domChangeTimer = setTimeout(function () {
  924. checkAndSetDefaultValue();
  925. }, 2000);
  926. });
  927. init_datepicker.call(this);
  928. if (opt.alwaysOpen) {
  929. open(0);
  930. }
  931. // expose some api
  932. $(this).data('dateRangePicker', {
  933. setStart: function (d1) {
  934. if (typeof d1 == 'string') {
  935. d1 = moment(d1, opt.format).toDate();
  936. }
  937. opt.end = false;
  938. setSingleDate(d1);
  939. return this;
  940. },
  941. setEnd: function (d2, silent) {
  942. var start = new Date();
  943. start.setTime(opt.start);
  944. if (typeof d2 == 'string') {
  945. d2 = moment(d2, opt.format).toDate();
  946. }
  947. setDateRange(start, d2, silent);
  948. return this;
  949. },
  950. setDateRange: function (d1, d2, silent) {
  951. if (typeof d1 == 'string' && typeof d2 == 'string') {
  952. d1 = moment(d1, opt.format).toDate();
  953. d2 = moment(d2, opt.format).toDate();
  954. }
  955. setDateRange(d1, d2, silent);
  956. },
  957. clear: clearSelection,
  958. close: closeDatePicker,
  959. open: open,
  960. redraw: redrawDatePicker,
  961. getDatePicker: getDatePicker,
  962. resetMonthsView: resetMonthsView,
  963. destroy: function () {
  964. $(self).unbind('.datepicker');
  965. $(self).data('dateRangePicker', '');
  966. $(self).data('date-picker-opened', null);
  967. box.remove();
  968. $(window).unbind('resize.datepicker', calcPosition);
  969. $(document).unbind('click.datepicker', closeDatePicker);
  970. }
  971. });
  972. $(window).bind('resize.datepicker', calcPosition);
  973. return this;
  974. function IsOwnDatePickerClicked(evt, selfObj) {
  975. return (selfObj.contains(evt.target) || evt.target == selfObj || (selfObj.childNodes != undefined && $.inArray(evt.target, selfObj.childNodes) >= 0));
  976. }
  977. function init_datepicker() {
  978. var self = this;
  979. if ($(this).data('date-picker-opened')) {
  980. closeDatePicker();
  981. return;
  982. }
  983. $(this).data('date-picker-opened', true);
  984. box = createDom().hide();
  985. box.append('<div class="date-range-length-tip"></div>');
  986. $(opt.container).append(box);
  987. if (!opt.inline) {
  988. calcPosition();
  989. } else {
  990. box.addClass('inline-wrapper');
  991. }
  992. if (opt.alwaysOpen) {
  993. box.find('.apply-btn').hide();
  994. }
  995. var defaultTime = getDefaultTime();
  996. resetMonthsView(defaultTime);
  997. if (opt.time.enabled) {
  998. if ((opt.startDate && opt.endDate) || (opt.start && opt.end)) {
  999. showTime(moment(opt.start || opt.startDate).toDate(), 'time1');
  1000. showTime(moment(opt.end || opt.endDate).toDate(), 'time2');
  1001. } else {
  1002. var defaultEndTime = opt.defaultEndTime ? opt.defaultEndTime : defaultTime;
  1003. showTime(defaultTime, 'time1');
  1004. showTime(defaultEndTime, 'time2');
  1005. }
  1006. }
  1007. //showSelectedInfo();
  1008. var defaultTopText = '';
  1009. if (opt.singleDate)
  1010. defaultTopText = translate('default-single');
  1011. else if (opt.minDays && opt.maxDays)
  1012. defaultTopText = translate('default-range');
  1013. else if (opt.minDays)
  1014. defaultTopText = translate('default-more');
  1015. else if (opt.maxDays)
  1016. defaultTopText = translate('default-less');
  1017. else
  1018. defaultTopText = translate('default-default');
  1019. box.find('.default-top').html(defaultTopText.replace(/\%d/, opt.minDays).replace(/\%d/, opt.maxDays));
  1020. if (opt.singleMonth) {
  1021. box.addClass('single-month');
  1022. } else {
  1023. box.addClass('two-months');
  1024. }
  1025. setTimeout(function () {
  1026. updateCalendarWidth();
  1027. initiated = true;
  1028. }, 0);
  1029. box.click(function (evt) {
  1030. evt.stopPropagation();
  1031. });
  1032. //if user click other place of the webpage, close date range picker window
  1033. $(document).bind('click.datepicker', function (evt) {
  1034. if (!IsOwnDatePickerClicked(evt, self[0])) {
  1035. if (box.is(':visible')) closeDatePicker();
  1036. }
  1037. });
  1038. box.find('.next').click(function () {
  1039. if (!opt.stickyMonths)
  1040. gotoNextMonth(this);
  1041. else
  1042. gotoNextMonth_stickily(this);
  1043. });
  1044. function gotoNextMonth(self) {
  1045. var isMonth2 = $(self).parents('table').hasClass('month2');
  1046. var month = isMonth2 ? opt.month2 : opt.month1;
  1047. month = nextMonth(month);
  1048. if (!opt.singleMonth && !opt.singleDate && !isMonth2 && compare_month(month, opt.month2) >= 0 || isMonthOutOfBounds(month)) return;
  1049. showMonth(month, isMonth2 ? 'month2' : 'month1');
  1050. showGap();
  1051. }
  1052. function gotoNextMonth_stickily(self) {
  1053. var nextMonth1 = nextMonth(opt.month1);
  1054. var nextMonth2 = nextMonth(opt.month2);
  1055. if (isMonthOutOfBounds(nextMonth2)) return;
  1056. if (!opt.singleDate && compare_month(nextMonth1, nextMonth2) >= 0) return;
  1057. showMonth(nextMonth1, 'month1');
  1058. showMonth(nextMonth2, 'month2');
  1059. showSelectedDays();
  1060. }
  1061. box.find('.prev').click(function () {
  1062. if (!opt.stickyMonths)
  1063. gotoPrevMonth(this);
  1064. else
  1065. gotoPrevMonth_stickily(this);
  1066. });
  1067. function gotoPrevMonth(self) {
  1068. var isMonth2 = $(self).parents('table').hasClass('month2');
  1069. var month = isMonth2 ? opt.month2 : opt.month1;
  1070. month = prevMonth(month);
  1071. if (isMonth2 && compare_month(month, opt.month1) <= 0 || isMonthOutOfBounds(month)) return;
  1072. showMonth(month, isMonth2 ? 'month2' : 'month1');
  1073. showGap();
  1074. }
  1075. function gotoPrevMonth_stickily(self) {
  1076. var prevMonth1 = prevMonth(opt.month1);
  1077. var prevMonth2 = prevMonth(opt.month2);
  1078. if (isMonthOutOfBounds(prevMonth1)) return;
  1079. if (!opt.singleDate && compare_month(prevMonth2, prevMonth1) <= 0) return;
  1080. showMonth(prevMonth2, 'month2');
  1081. showMonth(prevMonth1, 'month1');
  1082. showSelectedDays();
  1083. }
  1084. box.attr('unselectable', 'on')
  1085. .css('user-select', 'none')
  1086. .bind('selectstart', function (e) {
  1087. e.preventDefault();
  1088. return false;
  1089. });
  1090. box.find('.apply-btn').click(function () {
  1091. closeDatePicker();
  1092. var dateRange = getDateString(new Date(opt.start)) + opt.separator + getDateString(new Date(opt.end));
  1093. $(self).trigger('datepicker-apply', {
  1094. 'value': dateRange,
  1095. 'date1': new Date(opt.start),
  1096. 'date2': new Date(opt.end)
  1097. });
  1098. });
  1099. box.find('[custom]').click(function () {
  1100. var valueName = $(this).attr('custom');
  1101. opt.start = false;
  1102. opt.end = false;
  1103. box.find('.day.checked').removeClass('checked');
  1104. opt.setValue.call(selfDom, valueName);
  1105. checkSelectionValid();
  1106. showSelectedInfo(true);
  1107. showSelectedDays();
  1108. if (opt.autoClose) closeDatePicker();
  1109. });
  1110. box.find('[shortcut]').click(function () {
  1111. var shortcut = $(this).attr('shortcut');
  1112. var end = new Date(),
  1113. start = false;
  1114. var dir;
  1115. if (shortcut.indexOf('day') != -1) {
  1116. var day = parseInt(shortcut.split(',', 2)[1], 10);
  1117. start = new Date(new Date().getTime() + 86400000 * day);
  1118. end = new Date(end.getTime() + 86400000 * (day > 0 ? 1 : -1));
  1119. } else if (shortcut.indexOf('week') != -1) {
  1120. dir = shortcut.indexOf('prev,') != -1 ? -1 : 1;
  1121. var stopDay;
  1122. if (dir == 1)
  1123. stopDay = opt.startOfWeek == 'monday' ? 1 : 0;
  1124. else
  1125. stopDay = opt.startOfWeek == 'monday' ? 0 : 6;
  1126. end = new Date(end.getTime() - 86400000);
  1127. while (end.getDay() != stopDay) end = new Date(end.getTime() + dir * 86400000);
  1128. start = new Date(end.getTime() + dir * 86400000 * 6);
  1129. } else if (shortcut.indexOf('month') != -1) {
  1130. dir = shortcut.indexOf('prev,') != -1 ? -1 : 1;
  1131. if (dir == 1)
  1132. start = nextMonth(end);
  1133. else
  1134. start = prevMonth(end);
  1135. start.setDate(1);
  1136. end = nextMonth(start);
  1137. end.setDate(1);
  1138. end = new Date(end.getTime() - 86400000);
  1139. } else if (shortcut.indexOf('year') != -1) {
  1140. dir = shortcut.indexOf('prev,') != -1 ? -1 : 1;
  1141. start = new Date();
  1142. start.setFullYear(end.getFullYear() + dir);
  1143. start.setMonth(0);
  1144. start.setDate(1);
  1145. end.setFullYear(end.getFullYear() + dir);
  1146. end.setMonth(11);
  1147. end.setDate(31);
  1148. } else if (shortcut == 'custom') {
  1149. var name = $(this).html();
  1150. if (opt.customShortcuts && opt.customShortcuts.length > 0) {
  1151. for (var i = 0; i < opt.customShortcuts.length; i++) {
  1152. var sh = opt.customShortcuts[i];
  1153. if (sh.name == name) {
  1154. var data = [];
  1155. // try
  1156. // {
  1157. data = sh['dates'].call();
  1158. //}catch(e){}
  1159. if (data && data.length == 2) {
  1160. start = data[0];
  1161. end = data[1];
  1162. }
  1163. // if only one date is specified then just move calendars there
  1164. // move calendars to show this date's month and next months
  1165. if (data && data.length == 1) {
  1166. var movetodate = data[0];
  1167. showMonth(movetodate, 'month1');
  1168. showMonth(nextMonth(movetodate), 'month2');
  1169. showGap();
  1170. }
  1171. break;
  1172. }
  1173. }
  1174. }
  1175. }
  1176. if (start && end) {
  1177. setDateRange(start, end);
  1178. checkSelectionValid();
  1179. }
  1180. });
  1181. box.find('.time1 input[type=range]').bind('change touchmove', function (e) {
  1182. var target = e.target,
  1183. hour = target.name == 'hour' ? $(target).val().replace(/^(\d{1})$/, '0$1') : undefined,
  1184. min = target.name == 'minute' ? $(target).val().replace(/^(\d{1})$/, '0$1') : undefined;
  1185. setTime('time1', hour, min);
  1186. });
  1187. box.find('.time2 input[type=range]').bind('change touchmove', function (e) {
  1188. var target = e.target,
  1189. hour = target.name == 'hour' ? $(target).val().replace(/^(\d{1})$/, '0$1') : undefined,
  1190. min = target.name == 'minute' ? $(target).val().replace(/^(\d{1})$/, '0$1') : undefined;
  1191. setTime('time2', hour, min);
  1192. });
  1193. }
  1194. function calcPosition() {
  1195. if (!opt.inline) {
  1196. var offset = $(self).offset();
  1197. if ($(opt.container).css('position') == 'relative') {
  1198. var containerOffset = $(opt.container).offset();
  1199. box.css({
  1200. top: offset.top - containerOffset.top + $(self).outerHeight() + 4,
  1201. left: offset.left - containerOffset.left
  1202. });
  1203. } else {
  1204. if (offset.left < 460) //left to right
  1205. {
  1206. box.css({
  1207. top: offset.top + $(self).outerHeight() + parseInt($('body').css('border-top') || 0, 10),
  1208. left: offset.left
  1209. });
  1210. } else {
  1211. box.css({
  1212. top: offset.top + $(self).outerHeight() + parseInt($('body').css('border-top') || 0, 10),
  1213. left: offset.left + $(self).width() - box.width() - 16
  1214. });
  1215. }
  1216. }
  1217. }
  1218. }
  1219. // Return the date picker wrapper element
  1220. function getDatePicker() {
  1221. return box;
  1222. }
  1223. function open(animationTime) {
  1224. calcPosition();
  1225. redrawDatePicker();
  1226. checkAndSetDefaultValue();
  1227. if (opt.customOpenAnimation) {
  1228. opt.customOpenAnimation.call(box.get(0), function () {
  1229. $(self).trigger('datepicker-opened', {
  1230. relatedTarget: box
  1231. });
  1232. });
  1233. } else {
  1234. box.slideDown(animationTime, function () {
  1235. $(self).trigger('datepicker-opened', {
  1236. relatedTarget: box
  1237. });
  1238. });
  1239. }
  1240. $(self).trigger('datepicker-open', {
  1241. relatedTarget: box
  1242. });
  1243. showGap();
  1244. updateCalendarWidth();
  1245. }
  1246. function checkAndSetDefaultValue() {
  1247. var __default_string = opt.getValue.call(selfDom);
  1248. var defaults = __default_string ? __default_string.split(opt.separator) : '';
  1249. if (defaults && ((defaults.length == 1 && opt.singleDate) || defaults.length >= 2)) {
  1250. var ___format = opt.format;
  1251. if (___format.match(/Do/)) {
  1252. ___format = ___format.replace(/Do/, 'D');
  1253. defaults[0] = defaults[0].replace(/(\d+)(th|nd|st)/, '$1');
  1254. if (defaults.length >= 2) {
  1255. defaults[1] = defaults[1].replace(/(\d+)(th|nd|st)/, '$1');
  1256. }
  1257. }
  1258. // set initiated to avoid triggerring datepicker-change event
  1259. initiated = false;
  1260. if (defaults.length >= 2) {
  1261. setDateRange(getValidValue(defaults[0], ___format, moment.locale(opt.language)), getValidValue(defaults[1], ___format, moment.locale(opt.language)));
  1262. } else if (defaults.length == 1 && opt.singleDate) {
  1263. setSingleDate(getValidValue(defaults[0], ___format, moment.locale(opt.language)));
  1264. }
  1265. initiated = true;
  1266. }
  1267. }
  1268. function getValidValue(date, format, locale) {
  1269. if (moment(date, format, locale).isValid()) {
  1270. return moment(date, format, locale).toDate();
  1271. } else {
  1272. return moment().toDate();
  1273. }
  1274. }
  1275. function updateCalendarWidth() {
  1276. var gapMargin = box.find('.gap').css('margin-left');
  1277. if (gapMargin) gapMargin = parseInt(gapMargin);
  1278. var w1 = box.find('.month1').width();
  1279. var w2 = box.find('.gap').width() + (gapMargin ? gapMargin * 2 : 0);
  1280. var w3 = box.find('.month2').width();
  1281. box.find('.month-wrapper').width(w1 + w2 + w3);
  1282. }
  1283. function renderTime(name, date) {
  1284. box.find('.' + name + ' input[type=range].hour-range').val(moment(date).hours());
  1285. box.find('.' + name + ' input[type=range].minute-range').val(moment(date).minutes());
  1286. setTime(name, moment(date).format('HH'), moment(date).format('mm'));
  1287. }
  1288. function changeTime(name, date) {
  1289. opt[name] = parseInt(
  1290. moment(parseInt(date))
  1291. .startOf('day')
  1292. .add(moment(opt[name + 'Time']).format('HH'), 'h')
  1293. .add(moment(opt[name + 'Time']).format('mm'), 'm').valueOf()
  1294. );
  1295. }
  1296. function swapTime() {
  1297. renderTime('time1', opt.start);
  1298. renderTime('time2', opt.end);
  1299. }
  1300. function setTime(name, hour, minute) {
  1301. hour && (box.find('.' + name + ' .hour-val').text(hour));
  1302. minute && (box.find('.' + name + ' .minute-val').text(minute));
  1303. switch (name) {
  1304. case 'time1':
  1305. if (opt.start) {
  1306. setRange('start', moment(opt.start));
  1307. }
  1308. setRange('startTime', moment(opt.startTime || moment().valueOf()));
  1309. break;
  1310. case 'time2':
  1311. if (opt.end) {
  1312. setRange('end', moment(opt.end));
  1313. }
  1314. setRange('endTime', moment(opt.endTime || moment().valueOf()));
  1315. break;
  1316. }
  1317. function setRange(name, timePoint) {
  1318. var h = timePoint.format('HH'),
  1319. m = timePoint.format('mm');
  1320. opt[name] = timePoint
  1321. .startOf('day')
  1322. .add(hour || h, 'h')
  1323. .add(minute || m, 'm')
  1324. .valueOf();
  1325. }
  1326. checkSelectionValid();
  1327. showSelectedInfo();
  1328. showSelectedDays();
  1329. }
  1330. function clearSelection() {
  1331. opt.start = false;
  1332. opt.end = false;
  1333. box.find('.day.checked').removeClass('checked');
  1334. box.find('.day.last-date-selected').removeClass('last-date-selected');
  1335. box.find('.day.first-date-selected').removeClass('first-date-selected');
  1336. opt.setValue.call(selfDom, '');
  1337. checkSelectionValid();
  1338. showSelectedInfo();
  1339. showSelectedDays();
  1340. }
  1341. function handleStart(time) {
  1342. var r = time;
  1343. if (opt.batchMode === 'week-range') {
  1344. if (opt.startOfWeek === 'monday') {
  1345. r = moment(parseInt(time)).startOf('isoweek').valueOf();
  1346. } else {
  1347. r = moment(parseInt(time)).startOf('week').valueOf();
  1348. }
  1349. } else if (opt.batchMode === 'month-range') {
  1350. r = moment(parseInt(time)).startOf('month').valueOf();
  1351. }
  1352. return r;
  1353. }
  1354. function handleEnd(time) {
  1355. var r = time;
  1356. if (opt.batchMode === 'week-range') {
  1357. if (opt.startOfWeek === 'monday') {
  1358. r = moment(parseInt(time)).endOf('isoweek').valueOf();
  1359. } else {
  1360. r = moment(parseInt(time)).endOf('week').valueOf();
  1361. }
  1362. } else if (opt.batchMode === 'month-range') {
  1363. r = moment(parseInt(time)).endOf('month').valueOf();
  1364. }
  1365. return r;
  1366. }
  1367. function dayClicked(day) {
  1368. if (day.hasClass('invalid')) return;
  1369. var time = day.attr('time');
  1370. day.addClass('checked');
  1371. if (opt.singleDate) {
  1372. opt.start = time;
  1373. opt.end = false;
  1374. } else if (opt.batchMode === 'week') {
  1375. if (opt.startOfWeek === 'monday') {
  1376. opt.start = moment(parseInt(time)).startOf('isoweek').valueOf();
  1377. opt.end = moment(parseInt(time)).endOf('isoweek').valueOf();
  1378. } else {
  1379. opt.end = moment(parseInt(time)).endOf('week').valueOf();
  1380. opt.start = moment(parseInt(time)).startOf('week').valueOf();
  1381. }
  1382. } else if (opt.batchMode === 'workweek') {
  1383. opt.start = moment(parseInt(time)).day(1).valueOf();
  1384. opt.end = moment(parseInt(time)).day(5).valueOf();
  1385. } else if (opt.batchMode === 'weekend') {
  1386. opt.start = moment(parseInt(time)).day(6).valueOf();
  1387. opt.end = moment(parseInt(time)).day(7).valueOf();
  1388. } else if (opt.batchMode === 'month') {
  1389. opt.start = moment(parseInt(time)).startOf('month').valueOf();
  1390. opt.end = moment(parseInt(time)).endOf('month').valueOf();
  1391. } else if ((opt.start && opt.end) || (!opt.start && !opt.end)) {
  1392. opt.start = handleStart(time);
  1393. opt.end = false;
  1394. } else if (opt.start) {
  1395. opt.end = handleEnd(time);
  1396. if (opt.time.enabled) {
  1397. changeTime('end', opt.end);
  1398. }
  1399. }
  1400. //Update time in case it is enabled and timestamps are available
  1401. if (opt.time.enabled) {
  1402. if (opt.start) {
  1403. changeTime('start', opt.start);
  1404. }
  1405. if (opt.end) {
  1406. changeTime('end', opt.end);
  1407. }
  1408. }
  1409. //In case the start is after the end, swap the timestamps
  1410. if (!opt.singleDate && opt.start && opt.end && opt.start > opt.end) {
  1411. var tmp = opt.end;
  1412. opt.end = handleEnd(opt.start);
  1413. opt.start = handleStart(tmp);
  1414. if (opt.time.enabled && opt.swapTime) {
  1415. swapTime();
  1416. }
  1417. }
  1418. opt.start = parseInt(opt.start);
  1419. opt.end = parseInt(opt.end);
  1420. clearHovering();
  1421. if (opt.start && !opt.end) {
  1422. $(self).trigger('datepicker-first-date-selected', {
  1423. 'date1': new Date(opt.start)
  1424. });
  1425. dayHovering(day);
  1426. }
  1427. updateSelectableRange(time);
  1428. checkSelectionValid();
  1429. showSelectedInfo();
  1430. showSelectedDays();
  1431. autoclose();
  1432. }
  1433. function weekNumberClicked(weekNumberDom) {
  1434. var thisTime = parseInt(weekNumberDom.attr('data-start-time'), 10);
  1435. var date1, date2;
  1436. if (!opt.startWeek) {
  1437. opt.startWeek = thisTime;
  1438. weekNumberDom.addClass('week-number-selected');
  1439. date1 = new Date(thisTime);
  1440. opt.start = moment(date1).day(opt.startOfWeek == 'monday' ? 1 : 0).valueOf();
  1441. opt.end = moment(date1).day(opt.startOfWeek == 'monday' ? 7 : 6).valueOf();
  1442. } else {
  1443. box.find('.week-number-selected').removeClass('week-number-selected');
  1444. date1 = new Date(thisTime < opt.startWeek ? thisTime : opt.startWeek);
  1445. date2 = new Date(thisTime < opt.startWeek ? opt.startWeek : thisTime);
  1446. opt.startWeek = false;
  1447. opt.start = moment(date1).day(opt.startOfWeek == 'monday' ? 1 : 0).valueOf();
  1448. opt.end = moment(date2).day(opt.startOfWeek == 'monday' ? 7 : 6).valueOf();
  1449. }
  1450. updateSelectableRange();
  1451. checkSelectionValid();
  1452. showSelectedInfo();
  1453. showSelectedDays();
  1454. autoclose();
  1455. }
  1456. function isValidTime(time) {
  1457. time = parseInt(time, 10);
  1458. if (opt.startDate && compare_day(time, opt.startDate) < 0) return false;
  1459. if (opt.endDate && compare_day(time, opt.endDate) > 0) return false;
  1460. if (opt.start && !opt.end && !opt.singleDate) {
  1461. //check maxDays and minDays setting
  1462. if (opt.maxDays > 0 && countDays(time, opt.start) > opt.maxDays) return false;
  1463. if (opt.minDays > 0 && countDays(time, opt.start) < opt.minDays) return false;
  1464. //check selectForward and selectBackward
  1465. if (opt.selectForward && time < opt.start) return false;
  1466. if (opt.selectBackward && time > opt.start) return false;
  1467. //check disabled days
  1468. if (opt.beforeShowDay && typeof opt.beforeShowDay == 'function') {
  1469. var valid = true;
  1470. var timeTmp = time;
  1471. while (countDays(timeTmp, opt.start) > 1) {
  1472. var arr = opt.beforeShowDay(new Date(timeTmp));
  1473. if (!arr[0]) {
  1474. valid = false;
  1475. break;
  1476. }
  1477. if (Math.abs(timeTmp - opt.start) < 86400000) break;
  1478. if (timeTmp > opt.start) timeTmp -= 86400000;
  1479. if (timeTmp < opt.start) timeTmp += 86400000;
  1480. }
  1481. if (!valid) return false;
  1482. }
  1483. }
  1484. return true;
  1485. }
  1486. function updateSelectableRange() {
  1487. box.find('.day.invalid.tmp').removeClass('tmp invalid').addClass('valid');
  1488. if (opt.start && !opt.end) {
  1489. box.find('.day.toMonth.valid').each(function () {
  1490. var time = parseInt($(this).attr('time'), 10);
  1491. if (!isValidTime(time))
  1492. $(this).addClass('invalid tmp').removeClass('valid');
  1493. else
  1494. $(this).addClass('valid tmp').removeClass('invalid');
  1495. });
  1496. }
  1497. return true;
  1498. }
  1499. function dayHovering(day) {
  1500. var hoverTime = parseInt(day.attr('time'));
  1501. var tooltip = '';
  1502. if (day.hasClass('has-tooltip') && day.attr('data-tooltip')) {
  1503. tooltip = '<span style="white-space:nowrap">' + day.attr('data-tooltip') + '</span>';
  1504. } else if (!day.hasClass('invalid')) {
  1505. if (opt.singleDate) {
  1506. box.find('.day.hovering').removeClass('hovering');
  1507. day.addClass('hovering');
  1508. } else {
  1509. box.find('.day').each(function () {
  1510. var time = parseInt($(this).attr('time')),
  1511. start = opt.start,
  1512. end = opt.end;
  1513. if (time == hoverTime) {
  1514. $(this).addClass('hovering');
  1515. } else {
  1516. $(this).removeClass('hovering');
  1517. }
  1518. if (
  1519. (opt.start && !opt.end) &&
  1520. (
  1521. (opt.start < time && hoverTime >= time) ||
  1522. (opt.start > time && hoverTime <= time)
  1523. )
  1524. ) {
  1525. $(this).addClass('hovering');
  1526. } else {
  1527. $(this).removeClass('hovering');
  1528. }
  1529. });
  1530. if (opt.start && !opt.end) {
  1531. var days = countDays(hoverTime, opt.start);
  1532. if (opt.hoveringTooltip) {
  1533. if (typeof opt.hoveringTooltip == 'function') {
  1534. tooltip = opt.hoveringTooltip(days, opt.start, hoverTime);
  1535. } else if (opt.hoveringTooltip === true && days > 1) {
  1536. tooltip = days + ' ' + translate('days');
  1537. }
  1538. }
  1539. }
  1540. }
  1541. }
  1542. if (tooltip) {
  1543. var posDay = day.offset();
  1544. var posBox = box.offset();
  1545. var _left = posDay.left - posBox.left;
  1546. var _top = posDay.top - posBox.top;
  1547. _left += day.width() / 2;
  1548. var $tip = box.find('.date-range-length-tip');
  1549. var w = $tip.css({
  1550. 'visibility': 'hidden',
  1551. 'display': 'none'
  1552. }).html(tooltip).width();
  1553. var h = $tip.height();
  1554. _left -= w / 2;
  1555. _top -= h;
  1556. setTimeout(function () {
  1557. $tip.css({
  1558. left: _left,
  1559. top: _top,
  1560. display: 'block',
  1561. 'visibility': 'visible'
  1562. });
  1563. }, 10);
  1564. } else {
  1565. box.find('.date-range-length-tip').hide();
  1566. }
  1567. }
  1568. function clearHovering() {
  1569. box.find('.day.hovering').removeClass('hovering');
  1570. box.find('.date-range-length-tip').hide();
  1571. }
  1572. function autoclose() {
  1573. if (opt.singleDate === true) {
  1574. if (initiated && opt.start) {
  1575. if (opt.autoClose) closeDatePicker();
  1576. }
  1577. } else {
  1578. if (initiated && opt.start && opt.end) {
  1579. if (opt.autoClose) closeDatePicker();
  1580. }
  1581. }
  1582. }
  1583. function checkSelectionValid() {
  1584. var days = Math.ceil((opt.end - opt.start) / 86400000) + 1;
  1585. if (opt.singleDate) { // Validate if only start is there
  1586. if (opt.start && !opt.end)
  1587. box.find('.drp_top-bar').removeClass('error').addClass('normal');
  1588. else
  1589. box.find('.drp_top-bar').removeClass('error').removeClass('normal');
  1590. } else if (opt.maxDays && days > opt.maxDays) {
  1591. opt.start = false;
  1592. opt.end = false;
  1593. box.find('.day').removeClass('checked');
  1594. box.find('.drp_top-bar').removeClass('normal').addClass('error').find('.error-top').html(translate('less-than').replace('%d', opt.maxDays));
  1595. } else if (opt.minDays && days < opt.minDays) {
  1596. opt.start = false;
  1597. opt.end = false;
  1598. box.find('.day').removeClass('checked');
  1599. box.find('.drp_top-bar').removeClass('normal').addClass('error').find('.error-top').html(translate('more-than').replace('%d', opt.minDays));
  1600. } else {
  1601. if (opt.start || opt.end)
  1602. box.find('.drp_top-bar').removeClass('error').addClass('normal');
  1603. else
  1604. box.find('.drp_top-bar').removeClass('error').removeClass('normal');
  1605. }
  1606. if ((opt.singleDate && opt.start && !opt.end) || (!opt.singleDate && opt.start && opt.end)) {
  1607. box.find('.apply-btn').removeClass('disabled');
  1608. } else {
  1609. box.find('.apply-btn').addClass('disabled');
  1610. }
  1611. if (opt.batchMode) {
  1612. if (
  1613. (opt.start && opt.startDate && compare_day(opt.start, opt.startDate) < 0) ||
  1614. (opt.end && opt.endDate && compare_day(opt.end, opt.endDate) > 0)
  1615. ) {
  1616. opt.start = false;
  1617. opt.end = false;
  1618. box.find('.day').removeClass('checked');
  1619. }
  1620. }
  1621. }
  1622. function showSelectedInfo(forceValid, silent) {
  1623. box.find('.start-day').html('...');
  1624. box.find('.end-day').html('...');
  1625. box.find('.selected-days').hide();
  1626. if (opt.start) {
  1627. box.find('.start-day').html(getDateString(new Date(parseInt(opt.start))));
  1628. }
  1629. if (opt.end) {
  1630. box.find('.end-day').html(getDateString(new Date(parseInt(opt.end))));
  1631. }
  1632. var dateRange;
  1633. if (opt.start && opt.singleDate) {
  1634. box.find('.apply-btn').removeClass('disabled');
  1635. dateRange = getDateString(new Date(opt.start));
  1636. opt.setValue.call(selfDom, dateRange, getDateString(new Date(opt.start)), getDateString(new Date(opt.end)));
  1637. if (initiated && !silent) {
  1638. $(self).trigger('datepicker-change', {
  1639. 'value': dateRange,
  1640. 'date1': new Date(opt.start)
  1641. });
  1642. }
  1643. } else if (opt.start && opt.end) {
  1644. box.find('.selected-days').show().find('.selected-days-num').html(countDays(opt.end, opt.start));
  1645. box.find('.apply-btn').removeClass('disabled');
  1646. dateRange = getDateString(new Date(opt.start)) + opt.separator + getDateString(new Date(opt.end));
  1647. opt.setValue.call(selfDom, dateRange, getDateString(new Date(opt.start)), getDateString(new Date(opt.end)));
  1648. if (initiated && !silent) {
  1649. $(self).trigger('datepicker-change', {
  1650. 'value': dateRange,
  1651. 'date1': new Date(opt.start),
  1652. 'date2': new Date(opt.end)
  1653. });
  1654. }
  1655. } else if (forceValid) {
  1656. box.find('.apply-btn').removeClass('disabled');
  1657. } else {
  1658. box.find('.apply-btn').addClass('disabled');
  1659. }
  1660. }
  1661. function countDays(start, end) {
  1662. return Math.abs(daysFrom1970(start) - daysFrom1970(end)) + 1;
  1663. }
  1664. function setDateRange(date1, date2, silent) {
  1665. if (date1.getTime() > date2.getTime()) {
  1666. var tmp = date2;
  1667. date2 = date1;
  1668. date1 = tmp;
  1669. tmp = null;
  1670. }
  1671. var valid = true;
  1672. if (opt.startDate && compare_day(date1, opt.startDate) < 0) valid = false;
  1673. if (opt.endDate && compare_day(date2, opt.endDate) > 0) valid = false;
  1674. if (!valid) {
  1675. showMonth(opt.startDate, 'month1');
  1676. showMonth(nextMonth(opt.startDate), 'month2');
  1677. showGap();
  1678. return;
  1679. }
  1680. opt.start = date1.getTime();
  1681. opt.end = date2.getTime();
  1682. if (opt.time.enabled) {
  1683. renderTime('time1', date1);
  1684. renderTime('time2', date2);
  1685. }
  1686. if (opt.stickyMonths || (compare_day(date1, date2) > 0 && compare_month(date1, date2) === 0)) {
  1687. if (opt.lookBehind) {
  1688. date1 = prevMonth(date2);
  1689. } else {
  1690. date2 = nextMonth(date1);
  1691. }
  1692. }
  1693. if (opt.stickyMonths && opt.endDate !== false && compare_month(date2, opt.endDate) > 0) {
  1694. date1 = prevMonth(date1);
  1695. date2 = prevMonth(date2);
  1696. }
  1697. if (!opt.stickyMonths) {
  1698. if (compare_month(date1, date2) === 0) {
  1699. if (opt.lookBehind) {
  1700. date1 = prevMonth(date2);
  1701. } else {
  1702. date2 = nextMonth(date1);
  1703. }
  1704. }
  1705. }
  1706. showMonth(date1, 'month1');
  1707. showMonth(date2, 'month2');
  1708. showGap();
  1709. checkSelectionValid();
  1710. showSelectedInfo(false, silent);
  1711. autoclose();
  1712. }
  1713. function setSingleDate(date1) {
  1714. var valid = true;
  1715. if (opt.startDate && compare_day(date1, opt.startDate) < 0) valid = false;
  1716. if (opt.endDate && compare_day(date1, opt.endDate) > 0) valid = false;
  1717. if (!valid) {
  1718. showMonth(opt.startDate, 'month1');
  1719. return;
  1720. }
  1721. opt.start = date1.getTime();
  1722. if (opt.time.enabled) {
  1723. renderTime('time1', date1);
  1724. }
  1725. showMonth(date1, 'month1');
  1726. if (opt.singleMonth !== true) {
  1727. var date2 = nextMonth(date1);
  1728. showMonth(date2, 'month2');
  1729. }
  1730. showGap();
  1731. showSelectedInfo();
  1732. autoclose();
  1733. }
  1734. function showSelectedDays() {
  1735. if (!opt.start && !opt.end) return;
  1736. box.find('.day').each(function () {
  1737. var time = parseInt($(this).attr('time')),
  1738. start = opt.start,
  1739. end = opt.end;
  1740. if (opt.time.enabled) {
  1741. time = moment(time).startOf('day').valueOf();
  1742. start = moment(start || moment().valueOf()).startOf('day').valueOf();
  1743. end = moment(end || moment().valueOf()).startOf('day').valueOf();
  1744. }
  1745. if (
  1746. (opt.start && opt.end && end >= time && start <= time) ||
  1747. (opt.start && !opt.end && moment(start).format('YYYY-MM-DD') == moment(time).format('YYYY-MM-DD'))
  1748. ) {
  1749. $(this).addClass('checked');
  1750. } else {
  1751. $(this).removeClass('checked');
  1752. }
  1753. //add first-date-selected class name to the first date selected
  1754. if (opt.start && moment(start).format('YYYY-MM-DD') == moment(time).format('YYYY-MM-DD')) {
  1755. $(this).addClass('first-date-selected');
  1756. } else {
  1757. $(this).removeClass('first-date-selected');
  1758. }
  1759. //add last-date-selected
  1760. if (opt.end && moment(end).format('YYYY-MM-DD') == moment(time).format('YYYY-MM-DD')) {
  1761. $(this).addClass('last-date-selected');
  1762. } else {
  1763. $(this).removeClass('last-date-selected');
  1764. }
  1765. });
  1766. box.find('.week-number').each(function () {
  1767. if ($(this).attr('data-start-time') == opt.startWeek) {
  1768. $(this).addClass('week-number-selected');
  1769. }
  1770. });
  1771. }
  1772. function showMonth(date, month) {
  1773. date = moment(date).toDate();
  1774. var monthName = nameMonth(date.getMonth());
  1775. box.find('.' + month + ' .month-name').html(monthName + ' ' + date.getFullYear());
  1776. box.find('.' + month + ' tbody').html(createMonthHTML(date));
  1777. opt[month] = date;
  1778. updateSelectableRange();
  1779. bindDayEvents();
  1780. }
  1781. function bindDayEvents() {
  1782. box.find('.day').unbind("click").click(function (evt) {
  1783. dayClicked($(this));
  1784. });
  1785. box.find('.day').unbind("mouseenter").mouseenter(function (evt) {
  1786. dayHovering($(this));
  1787. });
  1788. box.find('.day').unbind("mouseleave").mouseleave(function (evt) {
  1789. box.find('.date-range-length-tip').hide();
  1790. if (opt.singleDate) {
  1791. clearHovering();
  1792. }
  1793. });
  1794. box.find('.week-number').unbind("click").click(function (evt) {
  1795. weekNumberClicked($(this));
  1796. });
  1797. }
  1798. function showTime(date, name) {
  1799. box.find('.' + name).append(getTimeHTML());
  1800. renderTime(name, date);
  1801. }
  1802. function nameMonth(m) {
  1803. return translate('month-name')[m];
  1804. }
  1805. function getDateString(d) {
  1806. return moment(d).format(opt.format);
  1807. }
  1808. function showGap() {
  1809. showSelectedDays();
  1810. var m1 = parseInt(moment(opt.month1).format('YYYYMM'));
  1811. var m2 = parseInt(moment(opt.month2).format('YYYYMM'));
  1812. var p = Math.abs(m1 - m2);
  1813. var shouldShow = (p > 1 && p != 89);
  1814. if (shouldShow) {
  1815. box.addClass('has-gap').removeClass('no-gap').find('.gap').css('visibility', 'visible');
  1816. } else {
  1817. box.removeClass('has-gap').addClass('no-gap').find('.gap').css('visibility', 'hidden');
  1818. }
  1819. var h1 = box.find('table.month1').height();
  1820. var h2 = box.find('table.month2').height();
  1821. box.find('.gap').height(Math.max(h1, h2) + 10);
  1822. }
  1823. function closeDatePicker() {
  1824. if (opt.alwaysOpen) return;
  1825. var afterAnim = function () {
  1826. $(self).data('date-picker-opened', false);
  1827. $(self).trigger('datepicker-closed', {
  1828. relatedTarget: box
  1829. });
  1830. };
  1831. if (opt.customCloseAnimation) {
  1832. opt.customCloseAnimation.call(box.get(0), afterAnim);
  1833. } else {
  1834. $(box).slideUp(opt.duration, afterAnim);
  1835. }
  1836. $(self).trigger('datepicker-close', {
  1837. relatedTarget: box
  1838. });
  1839. }
  1840. function redrawDatePicker() {
  1841. showMonth(opt.month1, 'month1');
  1842. showMonth(opt.month2, 'month2');
  1843. }
  1844. function compare_month(m1, m2) {
  1845. var p = parseInt(moment(m1).format('YYYYMM')) - parseInt(moment(m2).format('YYYYMM'));
  1846. if (p > 0) return 1;
  1847. if (p === 0) return 0;
  1848. return -1;
  1849. }
  1850. function compare_day(m1, m2) {
  1851. var p = parseInt(moment(m1).format('YYYYMMDD')) - parseInt(moment(m2).format('YYYYMMDD'));
  1852. if (p > 0) return 1;
  1853. if (p === 0) return 0;
  1854. return -1;
  1855. }
  1856. function nextMonth(month) {
  1857. return moment(month).add(1, 'months').toDate();
  1858. }
  1859. function prevMonth(month) {
  1860. return moment(month).add(-1, 'months').toDate();
  1861. }
  1862. function getTimeHTML() {
  1863. return '<div>' +
  1864. '<span>' + translate('Time') + ': <span class="hour-val">00</span>:<span class="minute-val">00</span></span>' +
  1865. '</div>' +
  1866. '<div class="hour">' +
  1867. '<label>' + translate('Hour') + ': <input type="range" class="hour-range" name="hour" min="0" max="23"></label>' +
  1868. '</div>' +
  1869. '<div class="minute">' +
  1870. '<label>' + translate('Minute') + ': <input type="range" class="minute-range" name="minute" min="0" max="59"></label>' +
  1871. '</div>';
  1872. }
  1873. function createDom() {
  1874. var html = '<div class="date-picker-wrapper';
  1875. if (opt.extraClass) html += ' ' + opt.extraClass + ' ';
  1876. if (opt.singleDate) html += ' single-date ';
  1877. if (!opt.showShortcuts) html += ' no-shortcuts ';
  1878. if (!opt.showTopbar) html += ' no-topbar ';
  1879. if (opt.customTopBar) html += ' custom-topbar ';
  1880. html += '">';
  1881. if (opt.showTopbar) {
  1882. html += '<div class="drp_top-bar">';
  1883. if (opt.customTopBar) {
  1884. if (typeof opt.customTopBar == 'function') opt.customTopBar = opt.customTopBar();
  1885. html += '<div class="custom-top">' + opt.customTopBar + '</div>';
  1886. } else {
  1887. html += '<div class="normal-top">' +
  1888. '<span style="color:#333">' + translate('selected') + ' </span> <b class="start-day">...</b>';
  1889. if (!opt.singleDate) {
  1890. html += ' <span class="separator-day">' + opt.separator + '</span> <b class="end-day">...</b> <i class="selected-days">(<span class="selected-days-num">3</span> ' + translate('days') + ')</i>';
  1891. }
  1892. html += '</div>';
  1893. html += '<div class="error-top">error</div>' +
  1894. '<div class="default-top">default</div>';
  1895. }
  1896. html += '<input type="button" class="apply-btn disabled' + getApplyBtnClass() + '" value="' + translate('apply') + '" />';
  1897. html += '</div>';
  1898. }
  1899. var _colspan = opt.showWeekNumbers ? 6 : 5;
  1900. var arrowPrev = '&lt;';
  1901. if (opt.customArrowPrevSymbol) arrowPrev = opt.customArrowPrevSymbol;
  1902. var arrowNext = '&gt;';
  1903. if (opt.customArrowNextSymbol) arrowNext = opt.customArrowNextSymbol;
  1904. html += '<div class="month-wrapper">' +
  1905. ' <table class="month1" cellspacing="0" border="0" cellpadding="0">' +
  1906. ' <thead>' +
  1907. ' <tr class="caption">' +
  1908. ' <th style="width:27px;">' +
  1909. ' <span class="prev">' +
  1910. arrowPrev +
  1911. ' </span>' +
  1912. ' </th>' +
  1913. ' <th colspan="' + _colspan + '" class="month-name">' +
  1914. ' </th>' +
  1915. ' <th style="width:27px;">' +
  1916. (opt.singleDate || !opt.stickyMonths ? '<span class="next">' + arrowNext + '</span>' : '') +
  1917. ' </th>' +
  1918. ' </tr>' +
  1919. ' <tr class="week-name">' + getWeekHead() +
  1920. ' </thead>' +
  1921. ' <tbody></tbody>' +
  1922. ' </table>';
  1923. if (hasMonth2()) {
  1924. html += '<div class="gap">' + getGapHTML() + '</div>' +
  1925. '<table class="month2" cellspacing="0" border="0" cellpadding="0">' +
  1926. ' <thead>' +
  1927. ' <tr class="caption">' +
  1928. ' <th style="width:27px;">' +
  1929. (!opt.stickyMonths ? '<span class="prev">' + arrowPrev + '</span>' : '') +
  1930. ' </th>' +
  1931. ' <th colspan="' + _colspan + '" class="month-name">' +
  1932. ' </th>' +
  1933. ' <th style="width:27px;">' +
  1934. ' <span class="next">' + arrowNext + '</span>' +
  1935. ' </th>' +
  1936. ' </tr>' +
  1937. ' <tr class="week-name">' + getWeekHead() +
  1938. ' </thead>' +
  1939. ' <tbody></tbody>' +
  1940. '</table>';
  1941. }
  1942. //+'</div>'
  1943. html += '<div style="clear:both;height:0;font-size:0;"></div>' +
  1944. '<div class="time">' +
  1945. '<div class="time1"></div>';
  1946. if (!opt.singleDate) {
  1947. html += '<div class="time2"></div>';
  1948. }
  1949. html += '</div>' +
  1950. '<div style="clear:both;height:0;font-size:0;"></div>' +
  1951. '</div>';
  1952. html += '<div class="footer">';
  1953. if (opt.showShortcuts) {
  1954. html += '<div class="shortcuts"><b>' + translate('shortcuts') + '</b>';
  1955. var data = opt.shortcuts;
  1956. if (data) {
  1957. var name;
  1958. if (data['prev-days'] && data['prev-days'].length > 0) {
  1959. html += '&nbsp;<span class="prev-days">' + translate('past');
  1960. for (var i = 0; i < data['prev-days'].length; i++) {
  1961. name = data['prev-days'][i];
  1962. name += (data['prev-days'][i] > 1) ? translate('days') : translate('day');
  1963. html += ' <a href="javascript:;" shortcut="day,-' + data['prev-days'][i] + '">' + name + '</a>';
  1964. }
  1965. html += '</span>';
  1966. }
  1967. if (data['next-days'] && data['next-days'].length > 0) {
  1968. html += '&nbsp;<span class="next-days">' + translate('following');
  1969. for (var i = 0; i < data['next-days'].length; i++) {
  1970. name = data['next-days'][i];
  1971. name += (data['next-days'][i] > 1) ? translate('days') : translate('day');
  1972. html += ' <a href="javascript:;" shortcut="day,' + data['next-days'][i] + '">' + name + '</a>';
  1973. }
  1974. html += '</span>';
  1975. }
  1976. if (data.prev && data.prev.length > 0) {
  1977. html += '&nbsp;<span class="prev-buttons">' + translate('previous');
  1978. for (var i = 0; i < data.prev.length; i++) {
  1979. name = translate('prev-' + data.prev[i]);
  1980. html += ' <a href="javascript:;" shortcut="prev,' + data.prev[i] + '">' + name + '</a>';
  1981. }
  1982. html += '</span>';
  1983. }
  1984. if (data.next && data.next.length > 0) {
  1985. html += '&nbsp;<span class="next-buttons">' + translate('next');
  1986. for (var i = 0; i < data.next.length; i++) {
  1987. name = translate('next-' + data.next[i]);
  1988. html += ' <a href="javascript:;" shortcut="next,' + data.next[i] + '">' + name + '</a>';
  1989. }
  1990. html += '</span>';
  1991. }
  1992. }
  1993. if (opt.customShortcuts) {
  1994. for (var i = 0; i < opt.customShortcuts.length; i++) {
  1995. var sh = opt.customShortcuts[i];
  1996. html += '&nbsp;<span class="custom-shortcut"><a href="javascript:;" shortcut="custom">' + sh.name + '</a></span>';
  1997. }
  1998. }
  1999. html += '</div>';
  2000. }
  2001. // Add Custom Values Dom
  2002. if (opt.showCustomValues) {
  2003. html += '<div class="customValues"><b>' + (opt.customValueLabel || translate('custom-values')) + '</b>';
  2004. if (opt.customValues) {
  2005. for (var i = 0; i < opt.customValues.length; i++) {
  2006. var val = opt.customValues[i];
  2007. html += '&nbsp;<span class="custom-value"><a href="javascript:;" custom="' + val.value + '">' + val.name + '</a></span>';
  2008. }
  2009. }
  2010. }
  2011. html += '</div></div>';
  2012. return $(html);
  2013. }
  2014. function getApplyBtnClass() {
  2015. var klass = '';
  2016. if (opt.autoClose === true) {
  2017. klass += ' hide';
  2018. }
  2019. if (opt.applyBtnClass !== '') {
  2020. klass += ' ' + opt.applyBtnClass;
  2021. }
  2022. return klass;
  2023. }
  2024. function getWeekHead() {
  2025. var prepend = opt.showWeekNumbers ? '<th>' + translate('week-number') + '</th>' : '';
  2026. if (opt.startOfWeek == 'monday') {
  2027. return prepend + '<th>' + translate('week-1') + '</th>' +
  2028. '<th>' + translate('week-2') + '</th>' +
  2029. '<th>' + translate('week-3') + '</th>' +
  2030. '<th>' + translate('week-4') + '</th>' +
  2031. '<th>' + translate('week-5') + '</th>' +
  2032. '<th>' + translate('week-6') + '</th>' +
  2033. '<th>' + translate('week-7') + '</th>';
  2034. } else {
  2035. return prepend + '<th>' + translate('week-7') + '</th>' +
  2036. '<th>' + translate('week-1') + '</th>' +
  2037. '<th>' + translate('week-2') + '</th>' +
  2038. '<th>' + translate('week-3') + '</th>' +
  2039. '<th>' + translate('week-4') + '</th>' +
  2040. '<th>' + translate('week-5') + '</th>' +
  2041. '<th>' + translate('week-6') + '</th>';
  2042. }
  2043. }
  2044. function isMonthOutOfBounds(month) {
  2045. month = moment(month);
  2046. if (opt.startDate && month.endOf('month').isBefore(opt.startDate)) {
  2047. return true;
  2048. }
  2049. if (opt.endDate && month.startOf('month').isAfter(opt.endDate)) {
  2050. return true;
  2051. }
  2052. return false;
  2053. }
  2054. function getGapHTML() {
  2055. var html = ['<div class="gap-top-mask"></div><div class="gap-bottom-mask"></div><div class="gap-lines">'];
  2056. for (var i = 0; i < 20; i++) {
  2057. html.push('<div class="gap-line">' +
  2058. '<div class="gap-1"></div>' +
  2059. '<div class="gap-2"></div>' +
  2060. '<div class="gap-3"></div>' +
  2061. '</div>');
  2062. }
  2063. html.push('</div>');
  2064. return html.join('');
  2065. }
  2066. function hasMonth2() {
  2067. return (!opt.singleMonth);
  2068. }
  2069. function attributesCallbacks(initialObject, callbacksArray, today) {
  2070. var resultObject = $.extend(true, {}, initialObject);
  2071. $.each(callbacksArray, function (cbAttrIndex, cbAttr) {
  2072. var addAttributes = cbAttr(today);
  2073. for (var attr in addAttributes) {
  2074. if (resultObject.hasOwnProperty(attr)) {
  2075. resultObject[attr] += addAttributes[attr];
  2076. } else {
  2077. resultObject[attr] = addAttributes[attr];
  2078. }
  2079. }
  2080. });
  2081. var attrString = '';
  2082. for (var attr in resultObject) {
  2083. if (resultObject.hasOwnProperty(attr)) {
  2084. attrString += attr + '="' + resultObject[attr] + '" ';
  2085. }
  2086. }
  2087. return attrString;
  2088. }
  2089. function daysFrom1970(t) {
  2090. return Math.floor(toLocalTimestamp(t) / 86400000);
  2091. }
  2092. function toLocalTimestamp(t) {
  2093. if (moment.isMoment(t)) t = t.toDate().getTime();
  2094. if (typeof t == 'object' && t.getTime) t = t.getTime();
  2095. if (typeof t == 'string' && !t.match(/\d{13}/)) t = moment(t, opt.format).toDate().getTime();
  2096. t = parseInt(t, 10) - new Date().getTimezoneOffset() * 60 * 1000;
  2097. return t;
  2098. }
  2099. function createMonthHTML(d) {
  2100. var days = [];
  2101. d.setDate(1);
  2102. var lastMonth = new Date(d.getTime() - 86400000);
  2103. var now = new Date();
  2104. var dayOfWeek = d.getDay();
  2105. if ((dayOfWeek === 0) && (opt.startOfWeek === 'monday')) {
  2106. // add one week
  2107. dayOfWeek = 7;
  2108. }
  2109. var today, valid;
  2110. if (dayOfWeek > 0) {
  2111. for (var i = dayOfWeek; i > 0; i--) {
  2112. var day = new Date(d.getTime() - 86400000 * i);
  2113. valid = isValidTime(day.getTime());
  2114. if (opt.startDate && compare_day(day, opt.startDate) < 0) valid = false;
  2115. if (opt.endDate && compare_day(day, opt.endDate) > 0) valid = false;
  2116. days.push({
  2117. date: day,
  2118. type: 'lastMonth',
  2119. day: day.getDate(),
  2120. time: day.getTime(),
  2121. valid: valid
  2122. });
  2123. }
  2124. }
  2125. var toMonth = d.getMonth();
  2126. for (var i = 0; i < 40; i++) {
  2127. today = moment(d).add(i, 'days').toDate();
  2128. valid = isValidTime(today.getTime());
  2129. if (opt.startDate && compare_day(today, opt.startDate) < 0) valid = false;
  2130. if (opt.endDate && compare_day(today, opt.endDate) > 0) valid = false;
  2131. days.push({
  2132. date: today,
  2133. type: today.getMonth() == toMonth ? 'toMonth' : 'nextMonth',
  2134. day: today.getDate(),
  2135. time: today.getTime(),
  2136. valid: valid
  2137. });
  2138. }
  2139. var html = [];
  2140. for (var week = 0; week < 6; week++) {
  2141. if (days[week * 7].type == 'nextMonth') break;
  2142. html.push('<tr>');
  2143. for (var day = 0; day < 7; day++) {
  2144. var _day = (opt.startOfWeek == 'monday') ? day + 1 : day;
  2145. today = days[week * 7 + _day];
  2146. var highlightToday = moment(today.time).format('L') == moment(now).format('L');
  2147. today.extraClass = '';
  2148. today.tooltip = '';
  2149. if (today.valid && opt.beforeShowDay && typeof opt.beforeShowDay == 'function') {
  2150. var _r = opt.beforeShowDay(moment(today.time).toDate());
  2151. today.valid = _r[0];
  2152. today.extraClass = _r[1] || '';
  2153. today.tooltip = _r[2] || '';
  2154. if (today.tooltip !== '') today.extraClass += ' has-tooltip ';
  2155. }
  2156. var todayDivAttr = {
  2157. time: today.time,
  2158. 'data-tooltip': today.tooltip,
  2159. 'class': 'day ' + today.type + ' ' + today.extraClass + ' ' + (today.valid ? 'valid' : 'invalid') + ' ' + (highlightToday ? 'real-today' : '')
  2160. };
  2161. if (day === 0 && opt.showWeekNumbers) {
  2162. html.push('<td><div class="week-number" data-start-time="' + today.time + '">' + opt.getWeekNumber(today.date) + '</div></td>');
  2163. }
  2164. html.push('<td ' + attributesCallbacks({}, opt.dayTdAttrs, today) + '><div ' + attributesCallbacks(todayDivAttr, opt.dayDivAttrs, today) + '>' + showDayHTML(today.time, today.day) + '</div></td>');
  2165. }
  2166. html.push('</tr>');
  2167. }
  2168. return html.join('');
  2169. }
  2170. function showDayHTML(time, date) {
  2171. if (opt.showDateFilter && typeof opt.showDateFilter == 'function') return opt.showDateFilter(time, date);
  2172. return date;
  2173. }
  2174. function getLanguages() {
  2175. if (opt.language == 'auto') {
  2176. var language = navigator.language ? navigator.language : navigator.browserLanguage;
  2177. if (!language) {
  2178. return $.dateRangePickerLanguages['default'];
  2179. }
  2180. language = language.toLowerCase();
  2181. if (language in $.dateRangePickerLanguages) {
  2182. return $.dateRangePickerLanguages[language];
  2183. }
  2184. return $.dateRangePickerLanguages['default'];
  2185. } else if (opt.language && opt.language in $.dateRangePickerLanguages) {
  2186. return $.dateRangePickerLanguages[opt.language];
  2187. } else {
  2188. return $.dateRangePickerLanguages['default'];
  2189. }
  2190. }
  2191. /**
  2192. * Translate language string, try both the provided translation key, as the lower case version
  2193. */
  2194. function translate(translationKey) {
  2195. var translationKeyLowerCase = translationKey.toLowerCase();
  2196. var result = (translationKey in languages) ? languages[translationKey] : (translationKeyLowerCase in languages) ? languages[translationKeyLowerCase] : null;
  2197. var defaultLanguage = $.dateRangePickerLanguages['default'];
  2198. if (result == null) result = (translationKey in defaultLanguage) ? defaultLanguage[translationKey] : (translationKeyLowerCase in defaultLanguage) ? defaultLanguage[translationKeyLowerCase] : '';
  2199. return result;
  2200. }
  2201. function getDefaultTime() {
  2202. var defaultTime = opt.defaultTime ? opt.defaultTime : new Date();
  2203. if (opt.lookBehind) {
  2204. if (opt.startDate && compare_month(defaultTime, opt.startDate) < 0) defaultTime = nextMonth(moment(opt.startDate).toDate());
  2205. if (opt.endDate && compare_month(defaultTime, opt.endDate) > 0) defaultTime = moment(opt.endDate).toDate();
  2206. } else {
  2207. if (opt.startDate && compare_month(defaultTime, opt.startDate) < 0) defaultTime = moment(opt.startDate).toDate();
  2208. if (opt.endDate && compare_month(nextMonth(defaultTime), opt.endDate) > 0) defaultTime = prevMonth(moment(opt.endDate).toDate());
  2209. }
  2210. if (opt.singleDate) {
  2211. if (opt.startDate && compare_month(defaultTime, opt.startDate) < 0) defaultTime = moment(opt.startDate).toDate();
  2212. if (opt.endDate && compare_month(defaultTime, opt.endDate) > 0) defaultTime = moment(opt.endDate).toDate();
  2213. }
  2214. return defaultTime;
  2215. }
  2216. function resetMonthsView(time) {
  2217. if (!time) {
  2218. time = getDefaultTime();
  2219. }
  2220. if (opt.lookBehind) {
  2221. showMonth(prevMonth(time), 'month1');
  2222. showMonth(time, 'month2');
  2223. } else {
  2224. showMonth(time, 'month1');
  2225. showMonth(nextMonth(time), 'month2');
  2226. }
  2227. if (opt.singleDate) {
  2228. showMonth(time, 'month1');
  2229. }
  2230. showSelectedDays();
  2231. showGap();
  2232. }
  2233. };
  2234. }));