jquery.daterangepicker.js 63 KB

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