{"version":3,"file":"vendors-f965fe12.b149463909b5e91f4e75.bundle.js","mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AACA;AAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","sources":["webpack://app/./node_modules/eonasdan-bootstrap-datetimepicker/src/js/bootstrap-datetimepicker.js"],"sourcesContent":["/*!\r\n * Bootstrap Datetime Picker v4.17.49\r\n * Copyright 2015-2020 Jonathan Peterson\r\n * Licensed under MIT (https://github.com/Eonasdan/bootstrap-datetimepicker/blob/master/LICENSE)\r\n */\r\n/*global define:false */\r\n/*global exports:false */\r\n/*global require:false */\r\n/*global jQuery:false */\r\n/*global moment:false */\r\n(function (factory) {\r\n 'use strict';\r\n if (typeof define === 'function' && define.amd) {\r\n // AMD is used - Register as an anonymous module.\r\n define(['jquery', 'moment'], factory);\r\n } else if (typeof exports === 'object') {\r\n module.exports = factory(require('jquery'), require('moment'));\r\n } else {\r\n // Neither AMD nor CommonJS used. Use global variables.\r\n if (typeof jQuery === 'undefined') {\r\n throw 'bootstrap-datetimepicker requires jQuery to be loaded first';\r\n }\r\n if (typeof moment === 'undefined') {\r\n throw 'bootstrap-datetimepicker requires Moment.js to be loaded first';\r\n }\r\n factory(jQuery, moment);\r\n }\r\n}(function ($, moment) {\r\n 'use strict';\r\n if (!moment) {\r\n throw new Error('bootstrap-datetimepicker requires Moment.js to be loaded first');\r\n }\r\n\r\n var dateTimePicker = function (element, options) {\r\n var picker = {},\r\n date,\r\n viewDate,\r\n unset = true,\r\n input,\r\n component = false,\r\n widget = false,\r\n use24Hours,\r\n minViewModeNumber = 0,\r\n actualFormat,\r\n parseFormats,\r\n currentViewMode,\r\n datePickerModes = [\r\n {\r\n clsName: 'days',\r\n navFnc: 'M',\r\n navStep: 1\r\n },\r\n {\r\n clsName: 'months',\r\n navFnc: 'y',\r\n navStep: 1\r\n },\r\n {\r\n clsName: 'years',\r\n navFnc: 'y',\r\n navStep: 10\r\n },\r\n {\r\n clsName: 'decades',\r\n navFnc: 'y',\r\n navStep: 100\r\n }\r\n ],\r\n viewModes = ['days', 'months', 'years', 'decades'],\r\n verticalModes = ['top', 'bottom', 'auto'],\r\n horizontalModes = ['left', 'right', 'auto'],\r\n toolbarPlacements = ['default', 'top', 'bottom'],\r\n keyMap = {\r\n 'up': 38,\r\n 38: 'up',\r\n 'down': 40,\r\n 40: 'down',\r\n 'left': 37,\r\n 37: 'left',\r\n 'right': 39,\r\n 39: 'right',\r\n 'tab': 9,\r\n 9: 'tab',\r\n 'escape': 27,\r\n 27: 'escape',\r\n 'enter': 13,\r\n 13: 'enter',\r\n 'pageUp': 33,\r\n 33: 'pageUp',\r\n 'pageDown': 34,\r\n 34: 'pageDown',\r\n 'shift': 16,\r\n 16: 'shift',\r\n 'control': 17,\r\n 17: 'control',\r\n 'space': 32,\r\n 32: 'space',\r\n 't': 84,\r\n 84: 't',\r\n 'delete': 46,\r\n 46: 'delete'\r\n },\r\n keyState = {},\r\n\r\n /********************************************************************************\r\n *\r\n * Private functions\r\n *\r\n ********************************************************************************/\r\n\r\n hasTimeZone = function () {\r\n return moment.tz !== undefined && options.timeZone !== undefined && options.timeZone !== null && options.timeZone !== '';\r\n },\r\n\r\n getMoment = function (d) {\r\n var returnMoment;\r\n\r\n if (d === undefined || d === null) {\r\n returnMoment = moment(); //TODO should this use format? and locale?\r\n } else if (moment.isDate(d) || moment.isMoment(d)) {\r\n // If the date that is passed in is already a Date() or moment() object,\r\n // pass it directly to moment.\r\n returnMoment = moment(d);\r\n } else if (hasTimeZone()) { // There is a string to parse and a default time zone\r\n // parse with the tz function which takes a default time zone if it is not in the format string\r\n returnMoment = moment.tz(d, parseFormats, options.useStrict, options.timeZone);\r\n } else {\r\n returnMoment = moment(d, parseFormats, options.useStrict);\r\n }\r\n\r\n if (hasTimeZone()) {\r\n returnMoment.tz(options.timeZone);\r\n }\r\n\r\n return returnMoment;\r\n },\r\n\r\n isEnabled = function (granularity) {\r\n if (typeof granularity !== 'string' || granularity.length > 1) {\r\n throw new TypeError('isEnabled expects a single character string parameter');\r\n }\r\n switch (granularity) {\r\n case 'y':\r\n return actualFormat.indexOf('Y') !== -1;\r\n case 'M':\r\n return actualFormat.indexOf('M') !== -1;\r\n case 'd':\r\n return actualFormat.toLowerCase().indexOf('d') !== -1;\r\n case 'h':\r\n case 'H':\r\n return actualFormat.toLowerCase().indexOf('h') !== -1;\r\n case 'm':\r\n return actualFormat.indexOf('m') !== -1;\r\n case 's':\r\n return actualFormat.indexOf('s') !== -1;\r\n default:\r\n return false;\r\n }\r\n },\r\n\r\n hasTime = function () {\r\n return (isEnabled('h') || isEnabled('m') || isEnabled('s'));\r\n },\r\n\r\n hasDate = function () {\r\n return (isEnabled('y') || isEnabled('M') || isEnabled('d'));\r\n },\r\n\r\n getDatePickerTemplate = function () {\r\n var headTemplate = $('')\r\n .append($('')\r\n .append($('').addClass('prev').attr('data-action', 'previous')\r\n .append($('').addClass(options.icons.previous))\r\n )\r\n .append($('').addClass('picker-switch').attr('data-action', 'pickerSwitch').attr('colspan', (options.calendarWeeks ? '6' : '5')))\r\n .append($('').addClass('next').attr('data-action', 'next')\r\n .append($('').addClass(options.icons.next))\r\n )\r\n ),\r\n contTemplate = $('')\r\n .append($('')\r\n .append($('').attr('colspan', (options.calendarWeeks ? '8' : '7')))\r\n );\r\n\r\n return [\r\n $('
').addClass('datepicker-days')\r\n .append($('').addClass('table-condensed')\r\n .append(headTemplate)\r\n .append($(''))\r\n ),\r\n $('
').addClass('datepicker-months')\r\n .append($('
').addClass('table-condensed')\r\n .append(headTemplate.clone())\r\n .append(contTemplate.clone())\r\n ),\r\n $('
').addClass('datepicker-years')\r\n .append($('
').addClass('table-condensed')\r\n .append(headTemplate.clone())\r\n .append(contTemplate.clone())\r\n ),\r\n $('
').addClass('datepicker-decades')\r\n .append($('
').addClass('table-condensed')\r\n .append(headTemplate.clone())\r\n .append(contTemplate.clone())\r\n )\r\n ];\r\n },\r\n\r\n getTimePickerMainTemplate = function () {\r\n var topRow = $(''),\r\n middleRow = $(''),\r\n bottomRow = $('');\r\n\r\n if (isEnabled('h')) {\r\n topRow.append($('
')\r\n .append($('').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.incrementHour }).addClass('btn').attr('data-action', 'incrementHours').append($('').addClass(options.icons.up))));\r\n middleRow.append($('')\r\n .append($('').addClass('timepicker-hour').attr({ 'data-time-component': 'hours', 'title': options.tooltips.pickHour }).attr('data-action', 'showHours')));\r\n bottomRow.append($('')\r\n .append($('').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.decrementHour }).addClass('btn').attr('data-action', 'decrementHours').append($('').addClass(options.icons.down))));\r\n }\r\n if (isEnabled('m')) {\r\n if (isEnabled('h')) {\r\n topRow.append($('').addClass('separator'));\r\n middleRow.append($('').addClass('separator').html(':'));\r\n bottomRow.append($('').addClass('separator'));\r\n }\r\n topRow.append($('')\r\n .append($('').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.incrementMinute }).addClass('btn').attr('data-action', 'incrementMinutes')\r\n .append($('').addClass(options.icons.up))));\r\n middleRow.append($('')\r\n .append($('').addClass('timepicker-minute').attr({ 'data-time-component': 'minutes', 'title': options.tooltips.pickMinute }).attr('data-action', 'showMinutes')));\r\n bottomRow.append($('')\r\n .append($('').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.decrementMinute }).addClass('btn').attr('data-action', 'decrementMinutes')\r\n .append($('').addClass(options.icons.down))));\r\n }\r\n if (isEnabled('s')) {\r\n if (isEnabled('m')) {\r\n topRow.append($('').addClass('separator'));\r\n middleRow.append($('').addClass('separator').html(':'));\r\n bottomRow.append($('').addClass('separator'));\r\n }\r\n topRow.append($('')\r\n .append($('').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.incrementSecond }).addClass('btn').attr('data-action', 'incrementSeconds')\r\n .append($('').addClass(options.icons.up))));\r\n middleRow.append($('')\r\n .append($('').addClass('timepicker-second').attr({ 'data-time-component': 'seconds', 'title': options.tooltips.pickSecond }).attr('data-action', 'showSeconds')));\r\n bottomRow.append($('')\r\n .append($('').attr({ href: '#', tabindex: '-1', 'title': options.tooltips.decrementSecond }).addClass('btn').attr('data-action', 'decrementSeconds')\r\n .append($('').addClass(options.icons.down))));\r\n }\r\n\r\n if (!use24Hours) {\r\n topRow.append($('').addClass('separator'));\r\n middleRow.append($('')\r\n .append($('').addClass('separator'));\r\n }\r\n\r\n return $('
').addClass('timepicker-picker')\r\n .append($('').addClass('table-condensed')\r\n .append([topRow, middleRow, bottomRow]));\r\n },\r\n\r\n getTimePickerTemplate = function () {\r\n var hoursView = $('
').addClass('timepicker-hours')\r\n .append($('
').addClass('table-condensed')),\r\n minutesView = $('
').addClass('timepicker-minutes')\r\n .append($('
').addClass('table-condensed')),\r\n secondsView = $('
').addClass('timepicker-seconds')\r\n .append($('
').addClass('table-condensed')),\r\n ret = [getTimePickerMainTemplate()];\r\n\r\n if (isEnabled('h')) {\r\n ret.push(hoursView);\r\n }\r\n if (isEnabled('m')) {\r\n ret.push(minutesView);\r\n }\r\n if (isEnabled('s')) {\r\n ret.push(secondsView);\r\n }\r\n\r\n return ret;\r\n },\r\n\r\n getToolbar = function () {\r\n var row = [];\r\n if (options.showTodayButton) {\r\n row.push($('
').append($('').attr({ 'data-action': 'today', 'title': options.tooltips.today }).append($('').addClass(options.icons.today))));\r\n }\r\n if (!options.sideBySide && hasDate() && hasTime()) {\r\n row.push($('').append($('').attr({ 'data-action': 'togglePicker', 'title': options.tooltips.selectTime }).append($('').addClass(options.icons.time))));\r\n }\r\n if (options.showClear) {\r\n row.push($('').append($('').attr({ 'data-action': 'clear', 'title': options.tooltips.clear }).append($('').addClass(options.icons.clear))));\r\n }\r\n if (options.showClose) {\r\n row.push($('').append($('').attr({ 'data-action': 'close', 'title': options.tooltips.close }).append($('').addClass(options.icons.close))));\r\n }\r\n return $('').addClass('table-condensed').append($('').append($('').append(row)));\r\n },\r\n\r\n getTemplate = function () {\r\n var template = $('
').addClass('bootstrap-datetimepicker-widget dropdown-menu'),\r\n dateView = $('
').addClass('datepicker').append(getDatePickerTemplate()),\r\n timeView = $('
').addClass('timepicker').append(getTimePickerTemplate()),\r\n content = $('
    ').addClass('list-unstyled'),\r\n toolbar = $('
  • ').addClass('picker-switch' + (options.collapse ? ' accordion-toggle' : '')).append(getToolbar());\r\n\r\n if (options.inline) {\r\n template.removeClass('dropdown-menu');\r\n }\r\n\r\n if (use24Hours) {\r\n template.addClass('usetwentyfour');\r\n }\r\n\r\n if (isEnabled('s') && !use24Hours) {\r\n template.addClass('wider');\r\n }\r\n\r\n if (options.sideBySide && hasDate() && hasTime()) {\r\n template.addClass('timepicker-sbs');\r\n if (options.toolbarPlacement === 'top') {\r\n template.append(toolbar);\r\n }\r\n template.append(\r\n $('
    ').addClass('row')\r\n .append(dateView.addClass('col-md-6'))\r\n .append(timeView.addClass('col-md-6'))\r\n );\r\n if (options.toolbarPlacement === 'bottom') {\r\n template.append(toolbar);\r\n }\r\n return template;\r\n }\r\n\r\n if (options.toolbarPlacement === 'top') {\r\n content.append(toolbar);\r\n }\r\n if (hasDate()) {\r\n content.append($('
  • ').addClass((options.collapse && hasTime() ? 'collapse in' : '')).append(dateView));\r\n }\r\n if (options.toolbarPlacement === 'default') {\r\n content.append(toolbar);\r\n }\r\n if (hasTime()) {\r\n content.append($('
  • ').addClass((options.collapse && hasDate() ? 'collapse' : '')).append(timeView));\r\n }\r\n if (options.toolbarPlacement === 'bottom') {\r\n content.append(toolbar);\r\n }\r\n return template.append(content);\r\n },\r\n\r\n dataToOptions = function () {\r\n var eData,\r\n dataOptions = {};\r\n\r\n if (element.is('input') || options.inline) {\r\n eData = element.data();\r\n } else {\r\n eData = element.find('input').data();\r\n }\r\n\r\n if (eData.dateOptions && eData.dateOptions instanceof Object) {\r\n dataOptions = $.extend(true, dataOptions, eData.dateOptions);\r\n }\r\n\r\n $.each(options, function (key) {\r\n var attributeName = 'date' + key.charAt(0).toUpperCase() + key.slice(1);\r\n if (eData[attributeName] !== undefined) {\r\n dataOptions[key] = eData[attributeName];\r\n }\r\n });\r\n return dataOptions;\r\n },\r\n\r\n place = function () {\r\n var position = (component || element).position(),\r\n offset = (component || element).offset(),\r\n vertical = options.widgetPositioning.vertical,\r\n horizontal = options.widgetPositioning.horizontal,\r\n parent;\r\n\r\n if (options.widgetParent) {\r\n parent = options.widgetParent.append(widget);\r\n } else if (element.is('input')) {\r\n parent = element.after(widget).parent();\r\n } else if (options.inline) {\r\n parent = element.append(widget);\r\n return;\r\n } else {\r\n parent = element;\r\n element.children().first().after(widget);\r\n }\r\n\r\n // Top and bottom logic\r\n if (vertical === 'auto') {\r\n if (offset.top + widget.height() * 1.5 >= $(window).height() + $(window).scrollTop() &&\r\n widget.height() + element.outerHeight() < offset.top) {\r\n vertical = 'top';\r\n } else {\r\n vertical = 'bottom';\r\n }\r\n }\r\n\r\n // Left and right logic\r\n if (horizontal === 'auto') {\r\n if (parent.width() < offset.left + widget.outerWidth() / 2 &&\r\n offset.left + widget.outerWidth() > $(window).width()) {\r\n horizontal = 'right';\r\n } else {\r\n horizontal = 'left';\r\n }\r\n }\r\n\r\n if (vertical === 'top') {\r\n widget.addClass('top').removeClass('bottom');\r\n } else {\r\n widget.addClass('bottom').removeClass('top');\r\n }\r\n\r\n if (horizontal === 'right') {\r\n widget.addClass('pull-right');\r\n } else {\r\n widget.removeClass('pull-right');\r\n }\r\n\r\n // find the first parent element that has a non-static css positioning\r\n if (parent.css('position') === 'static') {\r\n parent = parent.parents().filter(function () {\r\n return $(this).css('position') !== 'static';\r\n }).first();\r\n }\r\n\r\n if (parent.length === 0) {\r\n throw new Error('datetimepicker component should be placed within a non-static positioned container');\r\n }\r\n\r\n widget.css({\r\n top: vertical === 'top' ? 'auto' : position.top + element.outerHeight(),\r\n bottom: vertical === 'top' ? parent.outerHeight() - (parent === element ? 0 : position.top) : 'auto',\r\n left: horizontal === 'left' ? (parent === element ? 0 : position.left) : 'auto',\r\n right: horizontal === 'left' ? 'auto' : parent.outerWidth() - element.outerWidth() - (parent === element ? 0 : position.left)\r\n });\r\n },\r\n\r\n notifyEvent = function (e) {\r\n if (e.type === 'dp.change' && ((e.date && e.date.isSame(e.oldDate)) || (!e.date && !e.oldDate))) {\r\n return;\r\n }\r\n element.trigger(e);\r\n },\r\n\r\n viewUpdate = function (e) {\r\n if (e === 'y') {\r\n e = 'YYYY';\r\n }\r\n notifyEvent({\r\n type: 'dp.update',\r\n change: e,\r\n viewDate: viewDate.clone()\r\n });\r\n },\r\n\r\n showMode = function (dir) {\r\n if (!widget) {\r\n return;\r\n }\r\n if (dir) {\r\n currentViewMode = Math.max(minViewModeNumber, Math.min(3, currentViewMode + dir));\r\n }\r\n widget.find('.datepicker > div').hide().filter('.datepicker-' + datePickerModes[currentViewMode].clsName).show();\r\n },\r\n\r\n fillDow = function () {\r\n var row = $('
'),\r\n currentDate = viewDate.clone().startOf('w').startOf('d');\r\n\r\n if (options.calendarWeeks === true) {\r\n row.append($('');\r\n if (options.calendarWeeks) {\r\n row.append('');\r\n }\r\n html.push(row);\r\n }\r\n clsNames = ['day'];\r\n if (currentDate.isBefore(viewDate, 'M')) {\r\n clsNames.push('old');\r\n }\r\n if (currentDate.isAfter(viewDate, 'M')) {\r\n clsNames.push('new');\r\n }\r\n if (currentDate.isSame(date, 'd') && !unset) {\r\n clsNames.push('active');\r\n }\r\n if (!isValid(currentDate, 'd')) {\r\n clsNames.push('disabled');\r\n }\r\n if (currentDate.isSame(getMoment(), 'd')) {\r\n clsNames.push('today');\r\n }\r\n if (currentDate.day() === 0 || currentDate.day() === 6) {\r\n clsNames.push('weekend');\r\n }\r\n notifyEvent({\r\n type: 'dp.classify',\r\n date: currentDate,\r\n classNames: clsNames\r\n });\r\n row.append('');\r\n currentDate.add(1, 'd');\r\n }\r\n\r\n daysView.find('tbody').empty().append(html);\r\n\r\n updateMonths();\r\n\r\n updateYears();\r\n\r\n updateDecades();\r\n },\r\n\r\n fillHours = function () {\r\n var table = widget.find('.timepicker-hours table'),\r\n currentHour = viewDate.clone().startOf('d'),\r\n html = [],\r\n row = $('');\r\n\r\n if (viewDate.hour() > 11 && !use24Hours) {\r\n currentHour.hour(12);\r\n }\r\n while (currentHour.isSame(viewDate, 'd') && (use24Hours || (viewDate.hour() < 12 && currentHour.hour() < 12) || viewDate.hour() > 11)) {\r\n if (currentHour.hour() % 4 === 0) {\r\n row = $('');\r\n html.push(row);\r\n }\r\n row.append('');\r\n currentHour.add(1, 'h');\r\n }\r\n table.empty().append(html);\r\n },\r\n\r\n fillMinutes = function () {\r\n var table = widget.find('.timepicker-minutes table'),\r\n currentMinute = viewDate.clone().startOf('h'),\r\n html = [],\r\n row = $(''),\r\n step = options.stepping === 1 ? 5 : options.stepping;\r\n\r\n while (viewDate.isSame(currentMinute, 'h')) {\r\n if (currentMinute.minute() % (step * 4) === 0) {\r\n row = $('');\r\n html.push(row);\r\n }\r\n row.append('');\r\n currentMinute.add(step, 'm');\r\n }\r\n table.empty().append(html);\r\n },\r\n\r\n fillSeconds = function () {\r\n var table = widget.find('.timepicker-seconds table'),\r\n currentSecond = viewDate.clone().startOf('m'),\r\n html = [],\r\n row = $('');\r\n\r\n while (viewDate.isSame(currentSecond, 'm')) {\r\n if (currentSecond.second() % 20 === 0) {\r\n row = $('');\r\n html.push(row);\r\n }\r\n row.append('');\r\n currentSecond.add(5, 's');\r\n }\r\n\r\n table.empty().append(html);\r\n },\r\n\r\n fillTime = function () {\r\n var toggle, newDate, timeComponents = widget.find('.timepicker span[data-time-component]');\r\n\r\n if (!use24Hours) {\r\n toggle = widget.find('.timepicker [data-action=togglePeriod]');\r\n newDate = date.clone().add((date.hours() >= 12) ? -12 : 12, 'h');\r\n\r\n toggle.text(date.format('A'));\r\n\r\n if (isValid(newDate, 'h')) {\r\n toggle.removeClass('disabled');\r\n } else {\r\n toggle.addClass('disabled');\r\n }\r\n }\r\n timeComponents.filter('[data-time-component=hours]').text(date.format(use24Hours ? 'HH' : 'hh'));\r\n timeComponents.filter('[data-time-component=minutes]').text(date.format('mm'));\r\n timeComponents.filter('[data-time-component=seconds]').text(date.format('ss'));\r\n\r\n fillHours();\r\n fillMinutes();\r\n fillSeconds();\r\n },\r\n\r\n update = function () {\r\n if (!widget) {\r\n return;\r\n }\r\n fillDate();\r\n fillTime();\r\n },\r\n\r\n setValue = function (targetMoment) {\r\n var oldDate = unset ? null : date;\r\n\r\n // case of calling setValue(null or false)\r\n if (!targetMoment) {\r\n unset = true;\r\n input.val('');\r\n element.data('date', '');\r\n notifyEvent({\r\n type: 'dp.change',\r\n date: false,\r\n oldDate: oldDate\r\n });\r\n update();\r\n return;\r\n }\r\n\r\n targetMoment = targetMoment.clone().locale(options.locale);\r\n\r\n if (hasTimeZone()) {\r\n targetMoment.tz(options.timeZone);\r\n }\r\n\r\n if (options.stepping !== 1) {\r\n targetMoment.minutes((Math.round(targetMoment.minutes() / options.stepping) * options.stepping)).seconds(0);\r\n\r\n while (options.minDate && targetMoment.isBefore(options.minDate)) {\r\n targetMoment.add(options.stepping, 'minutes');\r\n }\r\n }\r\n\r\n if (isValid(targetMoment)) {\r\n date = targetMoment;\r\n viewDate = date.clone();\r\n input.val(date.format(actualFormat));\r\n element.data('date', date.format(actualFormat));\r\n unset = false;\r\n update();\r\n notifyEvent({\r\n type: 'dp.change',\r\n date: date.clone(),\r\n oldDate: oldDate\r\n });\r\n } else {\r\n if (!options.keepInvalid) {\r\n input.val(unset ? '' : date.format(actualFormat));\r\n } else {\r\n notifyEvent({\r\n type: 'dp.change',\r\n date: targetMoment,\r\n oldDate: oldDate\r\n });\r\n }\r\n notifyEvent({\r\n type: 'dp.error',\r\n date: targetMoment,\r\n oldDate: oldDate\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * Hides the widget. Possibly will emit dp.hide\r\n */\r\n hide = function () {\r\n var transitioning = false;\r\n if (!widget) {\r\n return picker;\r\n }\r\n // Ignore event if in the middle of a picker transition\r\n widget.find('.collapse').each(function () {\r\n var collapseData = $(this).data('collapse');\r\n if (collapseData && collapseData.transitioning) {\r\n transitioning = true;\r\n return false;\r\n }\r\n return true;\r\n });\r\n if (transitioning) {\r\n return picker;\r\n }\r\n if (component && component.hasClass('btn')) {\r\n component.toggleClass('active');\r\n }\r\n widget.hide();\r\n\r\n $(window).off('resize', place);\r\n widget.off('click', '[data-action]');\r\n widget.off('mousedown', false);\r\n\r\n widget.remove();\r\n widget = false;\r\n\r\n notifyEvent({\r\n type: 'dp.hide',\r\n date: date.clone()\r\n });\r\n\r\n input.blur();\r\n\r\n viewDate = date.clone();\r\n\r\n return picker;\r\n },\r\n\r\n clear = function () {\r\n setValue(null);\r\n },\r\n\r\n parseInputDate = function (inputDate) {\r\n if (options.parseInputDate === undefined) {\r\n if (!moment.isMoment(inputDate) || inputDate instanceof Date) {\r\n inputDate = getMoment(inputDate);\r\n }\r\n } else {\r\n inputDate = options.parseInputDate(inputDate);\r\n }\r\n //inputDate.locale(options.locale);\r\n return inputDate;\r\n },\r\n\r\n /********************************************************************************\r\n *\r\n * Widget UI interaction functions\r\n *\r\n ********************************************************************************/\r\n actions = {\r\n next: function () {\r\n var navFnc = datePickerModes[currentViewMode].navFnc;\r\n viewDate.add(datePickerModes[currentViewMode].navStep, navFnc);\r\n fillDate();\r\n viewUpdate(navFnc);\r\n },\r\n\r\n previous: function () {\r\n var navFnc = datePickerModes[currentViewMode].navFnc;\r\n viewDate.subtract(datePickerModes[currentViewMode].navStep, navFnc);\r\n fillDate();\r\n viewUpdate(navFnc);\r\n },\r\n\r\n pickerSwitch: function () {\r\n showMode(1);\r\n },\r\n\r\n selectMonth: function (e) {\r\n var month = $(e.target).closest('tbody').find('span').index($(e.target));\r\n viewDate.month(month);\r\n if (currentViewMode === minViewModeNumber) {\r\n setValue(date.clone().year(viewDate.year()).month(viewDate.month()));\r\n if (!options.inline) {\r\n hide();\r\n }\r\n } else {\r\n showMode(-1);\r\n fillDate();\r\n }\r\n viewUpdate('M');\r\n },\r\n\r\n selectYear: function (e) {\r\n var year = parseInt($(e.target).text(), 10) || 0;\r\n viewDate.year(year);\r\n if (currentViewMode === minViewModeNumber) {\r\n setValue(date.clone().year(viewDate.year()));\r\n if (!options.inline) {\r\n hide();\r\n }\r\n } else {\r\n showMode(-1);\r\n fillDate();\r\n }\r\n viewUpdate('YYYY');\r\n },\r\n\r\n selectDecade: function (e) {\r\n var year = parseInt($(e.target).data('selection'), 10) || 0;\r\n viewDate.year(year);\r\n if (currentViewMode === minViewModeNumber) {\r\n setValue(date.clone().year(viewDate.year()));\r\n if (!options.inline) {\r\n hide();\r\n }\r\n } else {\r\n showMode(-1);\r\n fillDate();\r\n }\r\n viewUpdate('YYYY');\r\n },\r\n\r\n selectDay: function (e) {\r\n var day = viewDate.clone();\r\n if ($(e.target).is('.old')) {\r\n day.subtract(1, 'M');\r\n }\r\n if ($(e.target).is('.new')) {\r\n day.add(1, 'M');\r\n }\r\n setValue(day.date(parseInt($(e.target).text(), 10)));\r\n if (!hasTime() && !options.keepOpen && !options.inline) {\r\n hide();\r\n }\r\n },\r\n\r\n incrementHours: function () {\r\n var newDate = date.clone().add(1, 'h');\r\n if (isValid(newDate, 'h')) {\r\n setValue(newDate);\r\n }\r\n },\r\n\r\n incrementMinutes: function () {\r\n var newDate = date.clone().add(options.stepping, 'm');\r\n if (isValid(newDate, 'm')) {\r\n setValue(newDate);\r\n }\r\n },\r\n\r\n incrementSeconds: function () {\r\n var newDate = date.clone().add(1, 's');\r\n if (isValid(newDate, 's')) {\r\n setValue(newDate);\r\n }\r\n },\r\n\r\n decrementHours: function () {\r\n var newDate = date.clone().subtract(1, 'h');\r\n if (isValid(newDate, 'h')) {\r\n setValue(newDate);\r\n }\r\n },\r\n\r\n decrementMinutes: function () {\r\n var newDate = date.clone().subtract(options.stepping, 'm');\r\n if (isValid(newDate, 'm')) {\r\n setValue(newDate);\r\n }\r\n },\r\n\r\n decrementSeconds: function () {\r\n var newDate = date.clone().subtract(1, 's');\r\n if (isValid(newDate, 's')) {\r\n setValue(newDate);\r\n }\r\n },\r\n\r\n togglePeriod: function () {\r\n setValue(date.clone().add((date.hours() >= 12) ? -12 : 12, 'h'));\r\n },\r\n\r\n togglePicker: function (e) {\r\n var $this = $(e.target),\r\n $parent = $this.closest('ul'),\r\n expanded = $parent.find('.in'),\r\n closed = $parent.find('.collapse:not(.in)'),\r\n collapseData;\r\n\r\n if (expanded && expanded.length) {\r\n collapseData = expanded.data('collapse');\r\n if (collapseData && collapseData.transitioning) {\r\n return;\r\n }\r\n if (expanded.collapse) { // if collapse plugin is available through bootstrap.js then use it\r\n expanded.collapse('hide');\r\n closed.collapse('show');\r\n } else { // otherwise just toggle in class on the two views\r\n expanded.removeClass('in');\r\n closed.addClass('in');\r\n }\r\n if ($this.is('span')) {\r\n $this.toggleClass(options.icons.time + ' ' + options.icons.date);\r\n } else {\r\n $this.find('span').toggleClass(options.icons.time + ' ' + options.icons.date);\r\n }\r\n\r\n // NOTE: uncomment if toggled state will be restored in show()\r\n //if (component) {\r\n // component.find('span').toggleClass(options.icons.time + ' ' + options.icons.date);\r\n //}\r\n }\r\n },\r\n\r\n showPicker: function () {\r\n widget.find('.timepicker > div:not(.timepicker-picker)').hide();\r\n widget.find('.timepicker .timepicker-picker').show();\r\n },\r\n\r\n showHours: function () {\r\n widget.find('.timepicker .timepicker-picker').hide();\r\n widget.find('.timepicker .timepicker-hours').show();\r\n },\r\n\r\n showMinutes: function () {\r\n widget.find('.timepicker .timepicker-picker').hide();\r\n widget.find('.timepicker .timepicker-minutes').show();\r\n },\r\n\r\n showSeconds: function () {\r\n widget.find('.timepicker .timepicker-picker').hide();\r\n widget.find('.timepicker .timepicker-seconds').show();\r\n },\r\n\r\n selectHour: function (e) {\r\n var hour = parseInt($(e.target).text(), 10);\r\n\r\n if (!use24Hours) {\r\n if (date.hours() >= 12) {\r\n if (hour !== 12) {\r\n hour += 12;\r\n }\r\n } else {\r\n if (hour === 12) {\r\n hour = 0;\r\n }\r\n }\r\n }\r\n setValue(date.clone().hours(hour));\r\n actions.showPicker.call(picker);\r\n },\r\n\r\n selectMinute: function (e) {\r\n setValue(date.clone().minutes(parseInt($(e.target).text(), 10)));\r\n actions.showPicker.call(picker);\r\n },\r\n\r\n selectSecond: function (e) {\r\n setValue(date.clone().seconds(parseInt($(e.target).text(), 10)));\r\n actions.showPicker.call(picker);\r\n },\r\n\r\n clear: clear,\r\n\r\n today: function () {\r\n var todaysDate = getMoment();\r\n if (isValid(todaysDate, 'd')) {\r\n setValue(todaysDate);\r\n }\r\n },\r\n\r\n close: hide\r\n },\r\n\r\n doAction = function (e) {\r\n if ($(e.currentTarget).is('.disabled')) {\r\n return false;\r\n }\r\n actions[$(e.currentTarget).data('action')].apply(picker, arguments);\r\n return false;\r\n },\r\n\r\n /**\r\n * Shows the widget. Possibly will emit dp.show and dp.change\r\n */\r\n show = function () {\r\n var currentMoment,\r\n useCurrentGranularity = {\r\n 'year': function (m) {\r\n return m.month(0).date(1).hours(0).seconds(0).minutes(0);\r\n },\r\n 'month': function (m) {\r\n return m.date(1).hours(0).seconds(0).minutes(0);\r\n },\r\n 'day': function (m) {\r\n return m.hours(0).seconds(0).minutes(0);\r\n },\r\n 'hour': function (m) {\r\n return m.seconds(0).minutes(0);\r\n },\r\n 'minute': function (m) {\r\n return m.seconds(0);\r\n }\r\n };\r\n\r\n if (input.prop('disabled') || (!options.ignoreReadonly && input.prop('readonly')) || widget) {\r\n return picker;\r\n }\r\n if (input.val() !== undefined && input.val().trim().length !== 0) {\r\n setValue(parseInputDate(input.val().trim()));\r\n } else if (unset && options.useCurrent && (options.inline || (input.is('input') && input.val().trim().length === 0))) {\r\n currentMoment = getMoment();\r\n if (typeof options.useCurrent === 'string') {\r\n currentMoment = useCurrentGranularity[options.useCurrent](currentMoment);\r\n }\r\n setValue(currentMoment);\r\n }\r\n widget = getTemplate();\r\n\r\n fillDow();\r\n fillMonths();\r\n\r\n widget.find('.timepicker-hours').hide();\r\n widget.find('.timepicker-minutes').hide();\r\n widget.find('.timepicker-seconds').hide();\r\n\r\n update();\r\n showMode();\r\n\r\n $(window).on('resize', place);\r\n widget.on('click', '[data-action]', doAction); // this handles clicks on the widget\r\n widget.on('mousedown', false);\r\n\r\n if (component && component.hasClass('btn')) {\r\n component.toggleClass('active');\r\n }\r\n place();\r\n widget.show();\r\n if (options.focusOnShow && !input.is(':focus')) {\r\n input.focus();\r\n }\r\n\r\n notifyEvent({\r\n type: 'dp.show'\r\n });\r\n return picker;\r\n },\r\n\r\n /**\r\n * Shows or hides the widget\r\n */\r\n toggle = function () {\r\n return (widget ? hide() : show());\r\n },\r\n\r\n keydown = function (e) {\r\n var handler = null,\r\n index,\r\n index2,\r\n pressedKeys = [],\r\n pressedModifiers = {},\r\n currentKey = e.which,\r\n keyBindKeys,\r\n allModifiersPressed,\r\n pressed = 'p';\r\n\r\n keyState[currentKey] = pressed;\r\n\r\n for (index in keyState) {\r\n if (keyState.hasOwnProperty(index) && keyState[index] === pressed) {\r\n pressedKeys.push(index);\r\n if (parseInt(index, 10) !== currentKey) {\r\n pressedModifiers[index] = true;\r\n }\r\n }\r\n }\r\n\r\n for (index in options.keyBinds) {\r\n if (options.keyBinds.hasOwnProperty(index) && typeof (options.keyBinds[index]) === 'function') {\r\n keyBindKeys = index.split(' ');\r\n if (keyBindKeys.length === pressedKeys.length && keyMap[currentKey] === keyBindKeys[keyBindKeys.length - 1]) {\r\n allModifiersPressed = true;\r\n for (index2 = keyBindKeys.length - 2; index2 >= 0; index2--) {\r\n if (!(keyMap[keyBindKeys[index2]] in pressedModifiers)) {\r\n allModifiersPressed = false;\r\n break;\r\n }\r\n }\r\n if (allModifiersPressed) {\r\n handler = options.keyBinds[index];\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (handler) {\r\n handler.call(picker, widget);\r\n e.stopPropagation();\r\n e.preventDefault();\r\n }\r\n },\r\n\r\n keyup = function (e) {\r\n keyState[e.which] = 'r';\r\n e.stopPropagation();\r\n e.preventDefault();\r\n },\r\n\r\n change = function (e) {\r\n var val = $(e.target).val().trim(),\r\n parsedDate = val ? parseInputDate(val) : null;\r\n setValue(parsedDate);\r\n e.stopImmediatePropagation();\r\n return false;\r\n },\r\n\r\n attachDatePickerElementEvents = function () {\r\n input.on({\r\n 'change': change,\r\n 'blur': options.debug ? '' : hide,\r\n 'keydown': keydown,\r\n 'keyup': keyup,\r\n 'focus': options.allowInputToggle ? show : ''\r\n });\r\n\r\n if (element.is('input')) {\r\n input.on({\r\n 'focus': show\r\n });\r\n } else if (component) {\r\n component.on('click', toggle);\r\n component.on('mousedown', false);\r\n }\r\n },\r\n\r\n detachDatePickerElementEvents = function () {\r\n input.off({\r\n 'change': change,\r\n 'blur': blur,\r\n 'keydown': keydown,\r\n 'keyup': keyup,\r\n 'focus': options.allowInputToggle ? hide : ''\r\n });\r\n\r\n if (element.is('input')) {\r\n input.off({\r\n 'focus': show\r\n });\r\n } else if (component) {\r\n component.off('click', toggle);\r\n component.off('mousedown', false);\r\n }\r\n },\r\n\r\n indexGivenDates = function (givenDatesArray) {\r\n // Store given enabledDates and disabledDates as keys.\r\n // This way we can check their existence in O(1) time instead of looping through whole array.\r\n // (for example: options.enabledDates['2014-02-27'] === true)\r\n var givenDatesIndexed = {};\r\n $.each(givenDatesArray, function () {\r\n var dDate = parseInputDate(this);\r\n if (dDate.isValid()) {\r\n givenDatesIndexed[dDate.format('YYYY-MM-DD')] = true;\r\n }\r\n });\r\n return (Object.keys(givenDatesIndexed).length) ? givenDatesIndexed : false;\r\n },\r\n\r\n indexGivenHours = function (givenHoursArray) {\r\n // Store given enabledHours and disabledHours as keys.\r\n // This way we can check their existence in O(1) time instead of looping through whole array.\r\n // (for example: options.enabledHours['2014-02-27'] === true)\r\n var givenHoursIndexed = {};\r\n $.each(givenHoursArray, function () {\r\n givenHoursIndexed[this] = true;\r\n });\r\n return (Object.keys(givenHoursIndexed).length) ? givenHoursIndexed : false;\r\n },\r\n\r\n initFormatting = function () {\r\n var format = options.format || 'L LT';\r\n\r\n actualFormat = format.replace(/(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g, function (formatInput) {\r\n var newinput = date.localeData().longDateFormat(formatInput) || formatInput;\r\n return newinput.replace(/(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g, function (formatInput2) { //temp fix for #740\r\n return date.localeData().longDateFormat(formatInput2) || formatInput2;\r\n });\r\n });\r\n\r\n\r\n parseFormats = options.extraFormats ? options.extraFormats.slice() : [];\r\n if (parseFormats.indexOf(format) < 0 && parseFormats.indexOf(actualFormat) < 0) {\r\n parseFormats.push(actualFormat);\r\n }\r\n\r\n use24Hours = (actualFormat.toLowerCase().indexOf('a') < 1 && actualFormat.replace(/\\[.*?\\]/g, '').indexOf('h') < 1);\r\n\r\n if (isEnabled('y')) {\r\n minViewModeNumber = 2;\r\n }\r\n if (isEnabled('M')) {\r\n minViewModeNumber = 1;\r\n }\r\n if (isEnabled('d')) {\r\n minViewModeNumber = 0;\r\n }\r\n\r\n currentViewMode = Math.max(minViewModeNumber, currentViewMode);\r\n\r\n if (!unset) {\r\n setValue(date);\r\n }\r\n };\r\n\r\n /********************************************************************************\r\n *\r\n * Public API functions\r\n * =====================\r\n *\r\n * Important: Do not expose direct references to private objects or the options\r\n * object to the outer world. Always return a clone when returning values or make\r\n * a clone when setting a private variable.\r\n *\r\n ********************************************************************************/\r\n picker.destroy = function () {\r\n ///Destroys the widget and removes all attached event listeners\r\n hide();\r\n detachDatePickerElementEvents();\r\n element.removeData('DateTimePicker');\r\n element.removeData('date');\r\n };\r\n\r\n picker.toggle = toggle;\r\n\r\n picker.show = show;\r\n\r\n picker.hide = hide;\r\n\r\n picker.disable = function () {\r\n ///Disables the input element, the component is attached to, by adding a disabled=\"true\" attribute to it.\r\n ///If the widget was visible before that call it is hidden. Possibly emits dp.hide\r\n hide();\r\n if (component && component.hasClass('btn')) {\r\n component.addClass('disabled');\r\n }\r\n input.prop('disabled', true);\r\n return picker;\r\n };\r\n\r\n picker.enable = function () {\r\n ///Enables the input element, the component is attached to, by removing disabled attribute from it.\r\n if (component && component.hasClass('btn')) {\r\n component.removeClass('disabled');\r\n }\r\n input.prop('disabled', false);\r\n return picker;\r\n };\r\n\r\n picker.ignoreReadonly = function (ignoreReadonly) {\r\n if (arguments.length === 0) {\r\n return options.ignoreReadonly;\r\n }\r\n if (typeof ignoreReadonly !== 'boolean') {\r\n throw new TypeError('ignoreReadonly () expects a boolean parameter');\r\n }\r\n options.ignoreReadonly = ignoreReadonly;\r\n return picker;\r\n };\r\n\r\n picker.options = function (newOptions) {\r\n if (arguments.length === 0) {\r\n return $.extend(true, {}, options);\r\n }\r\n\r\n if (!(newOptions instanceof Object)) {\r\n throw new TypeError('options() options parameter should be an object');\r\n }\r\n $.extend(true, options, newOptions);\r\n $.each(options, function (key, value) {\r\n if (picker[key] !== undefined) {\r\n picker[key](value);\r\n } else {\r\n throw new TypeError('option ' + key + ' is not recognized!');\r\n }\r\n });\r\n return picker;\r\n };\r\n\r\n picker.date = function (newDate) {\r\n ///\r\n ///Returns the component's model current date, a moment object or null if not set.\r\n ///date.clone()\r\n ///\r\n ///\r\n ///Sets the components model current moment to it. Passing a null value unsets the components model current moment. Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration.\r\n ///Takes string, Date, moment, null parameter.\r\n ///\r\n if (arguments.length === 0) {\r\n if (unset) {\r\n return null;\r\n }\r\n return date.clone();\r\n }\r\n\r\n if (newDate !== null && typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) {\r\n throw new TypeError('date() parameter must be one of [null, string, moment or Date]');\r\n }\r\n\r\n setValue(newDate === null ? null : parseInputDate(newDate));\r\n return picker;\r\n };\r\n\r\n picker.format = function (newFormat) {\r\n ///test su\r\n ///info about para\r\n ///returns foo\r\n if (arguments.length === 0) {\r\n return options.format;\r\n }\r\n\r\n if ((typeof newFormat !== 'string') && ((typeof newFormat !== 'boolean') || (newFormat !== false))) {\r\n throw new TypeError('format() expects a string or boolean:false parameter ' + newFormat);\r\n }\r\n\r\n options.format = newFormat;\r\n if (actualFormat) {\r\n initFormatting(); // reinit formatting\r\n }\r\n return picker;\r\n };\r\n\r\n picker.timeZone = function (newZone) {\r\n if (arguments.length === 0) {\r\n return options.timeZone;\r\n }\r\n\r\n if (typeof newZone !== 'string') {\r\n throw new TypeError('newZone() expects a string parameter');\r\n }\r\n\r\n options.timeZone = newZone;\r\n\r\n return picker;\r\n };\r\n\r\n picker.dayViewHeaderFormat = function (newFormat) {\r\n if (arguments.length === 0) {\r\n return options.dayViewHeaderFormat;\r\n }\r\n\r\n if (typeof newFormat !== 'string') {\r\n throw new TypeError('dayViewHeaderFormat() expects a string parameter');\r\n }\r\n\r\n options.dayViewHeaderFormat = newFormat;\r\n return picker;\r\n };\r\n\r\n picker.extraFormats = function (formats) {\r\n if (arguments.length === 0) {\r\n return options.extraFormats;\r\n }\r\n\r\n if (formats !== false && !(formats instanceof Array)) {\r\n throw new TypeError('extraFormats() expects an array or false parameter');\r\n }\r\n\r\n options.extraFormats = formats;\r\n if (parseFormats) {\r\n initFormatting(); // reinit formatting\r\n }\r\n return picker;\r\n };\r\n\r\n picker.disabledDates = function (dates) {\r\n ///\r\n ///Returns an array with the currently set disabled dates on the component.\r\n ///options.disabledDates\r\n ///\r\n ///\r\n ///Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of\r\n ///options.enabledDates if such exist.\r\n ///Takes an [ string or Date or moment ] of values and allows the user to select only from those days.\r\n ///\r\n if (arguments.length === 0) {\r\n return (options.disabledDates ? $.extend({}, options.disabledDates) : options.disabledDates);\r\n }\r\n\r\n if (!dates) {\r\n options.disabledDates = false;\r\n update();\r\n return picker;\r\n }\r\n if (!(dates instanceof Array)) {\r\n throw new TypeError('disabledDates() expects an array parameter');\r\n }\r\n options.disabledDates = indexGivenDates(dates);\r\n options.enabledDates = false;\r\n update();\r\n return picker;\r\n };\r\n\r\n picker.enabledDates = function (dates) {\r\n ///\r\n ///Returns an array with the currently set enabled dates on the component.\r\n ///options.enabledDates\r\n ///\r\n ///\r\n ///Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of options.disabledDates if such exist.\r\n ///Takes an [ string or Date or moment ] of values and allows the user to select only from those days.\r\n ///\r\n if (arguments.length === 0) {\r\n return (options.enabledDates ? $.extend({}, options.enabledDates) : options.enabledDates);\r\n }\r\n\r\n if (!dates) {\r\n options.enabledDates = false;\r\n update();\r\n return picker;\r\n }\r\n if (!(dates instanceof Array)) {\r\n throw new TypeError('enabledDates() expects an array parameter');\r\n }\r\n options.enabledDates = indexGivenDates(dates);\r\n options.disabledDates = false;\r\n update();\r\n return picker;\r\n };\r\n\r\n picker.daysOfWeekDisabled = function (daysOfWeekDisabled) {\r\n if (arguments.length === 0) {\r\n return options.daysOfWeekDisabled.splice(0);\r\n }\r\n\r\n if ((typeof daysOfWeekDisabled === 'boolean') && !daysOfWeekDisabled) {\r\n options.daysOfWeekDisabled = false;\r\n update();\r\n return picker;\r\n }\r\n\r\n if (!(daysOfWeekDisabled instanceof Array)) {\r\n throw new TypeError('daysOfWeekDisabled() expects an array parameter');\r\n }\r\n options.daysOfWeekDisabled = daysOfWeekDisabled.reduce(function (previousValue, currentValue) {\r\n currentValue = parseInt(currentValue, 10);\r\n if (currentValue > 6 || currentValue < 0 || isNaN(currentValue)) {\r\n return previousValue;\r\n }\r\n if (previousValue.indexOf(currentValue) === -1) {\r\n previousValue.push(currentValue);\r\n }\r\n return previousValue;\r\n }, []).sort();\r\n if (options.useCurrent && !options.keepInvalid) {\r\n var tries = 0;\r\n while (!isValid(date, 'd')) {\r\n date.add(1, 'd');\r\n if (tries === 31) {\r\n throw 'Tried 31 times to find a valid date';\r\n }\r\n tries++;\r\n }\r\n setValue(date);\r\n }\r\n update();\r\n return picker;\r\n };\r\n\r\n picker.maxDate = function (maxDate) {\r\n if (arguments.length === 0) {\r\n return options.maxDate ? options.maxDate.clone() : options.maxDate;\r\n }\r\n\r\n if ((typeof maxDate === 'boolean') && maxDate === false) {\r\n options.maxDate = false;\r\n update();\r\n return picker;\r\n }\r\n\r\n if (typeof maxDate === 'string') {\r\n if (maxDate === 'now' || maxDate === 'moment') {\r\n maxDate = getMoment();\r\n }\r\n }\r\n\r\n var parsedDate = parseInputDate(maxDate);\r\n\r\n if (!parsedDate.isValid()) {\r\n throw new TypeError('maxDate() Could not parse date parameter: ' + maxDate);\r\n }\r\n if (options.minDate && parsedDate.isBefore(options.minDate)) {\r\n throw new TypeError('maxDate() date parameter is before options.minDate: ' + parsedDate.format(actualFormat));\r\n }\r\n options.maxDate = parsedDate;\r\n if (options.useCurrent && !options.keepInvalid && date.isAfter(maxDate)) {\r\n setValue(options.maxDate);\r\n }\r\n if (viewDate.isAfter(parsedDate)) {\r\n viewDate = parsedDate.clone().subtract(options.stepping, 'm');\r\n }\r\n update();\r\n return picker;\r\n };\r\n\r\n picker.minDate = function (minDate) {\r\n if (arguments.length === 0) {\r\n return options.minDate ? options.minDate.clone() : options.minDate;\r\n }\r\n\r\n if ((typeof minDate === 'boolean') && minDate === false) {\r\n options.minDate = false;\r\n update();\r\n return picker;\r\n }\r\n\r\n if (typeof minDate === 'string') {\r\n if (minDate === 'now' || minDate === 'moment') {\r\n minDate = getMoment();\r\n }\r\n }\r\n\r\n var parsedDate = parseInputDate(minDate);\r\n\r\n if (!parsedDate.isValid()) {\r\n throw new TypeError('minDate() Could not parse date parameter: ' + minDate);\r\n }\r\n if (options.maxDate && parsedDate.isAfter(options.maxDate)) {\r\n throw new TypeError('minDate() date parameter is after options.maxDate: ' + parsedDate.format(actualFormat));\r\n }\r\n options.minDate = parsedDate;\r\n if (options.useCurrent && !options.keepInvalid && date.isBefore(minDate)) {\r\n setValue(options.minDate);\r\n }\r\n if (viewDate.isBefore(parsedDate)) {\r\n viewDate = parsedDate.clone().add(options.stepping, 'm');\r\n }\r\n update();\r\n return picker;\r\n };\r\n\r\n picker.defaultDate = function (defaultDate) {\r\n ///\r\n ///Returns a moment with the options.defaultDate option configuration or false if not set\r\n ///date.clone()\r\n ///\r\n ///\r\n ///Will set the picker's inital date. If a boolean:false value is passed the options.defaultDate parameter is cleared.\r\n ///Takes a string, Date, moment, boolean:false\r\n ///\r\n if (arguments.length === 0) {\r\n return options.defaultDate ? options.defaultDate.clone() : options.defaultDate;\r\n }\r\n if (!defaultDate) {\r\n options.defaultDate = false;\r\n return picker;\r\n }\r\n\r\n if (typeof defaultDate === 'string') {\r\n if (defaultDate === 'now' || defaultDate === 'moment') {\r\n defaultDate = getMoment();\r\n } else {\r\n defaultDate = getMoment(defaultDate);\r\n }\r\n }\r\n\r\n var parsedDate = parseInputDate(defaultDate);\r\n if (!parsedDate.isValid()) {\r\n throw new TypeError('defaultDate() Could not parse date parameter: ' + defaultDate);\r\n }\r\n if (!isValid(parsedDate)) {\r\n throw new TypeError('defaultDate() date passed is invalid according to component setup validations');\r\n }\r\n\r\n options.defaultDate = parsedDate;\r\n\r\n if ((options.defaultDate && options.inline) || input.val().trim() === '') {\r\n setValue(options.defaultDate);\r\n }\r\n return picker;\r\n };\r\n\r\n picker.locale = function (locale) {\r\n if (arguments.length === 0) {\r\n return options.locale;\r\n }\r\n\r\n if (!moment.localeData(locale)) {\r\n throw new TypeError('locale() locale ' + locale + ' is not loaded from moment locales!');\r\n }\r\n\r\n options.locale = locale;\r\n date.locale(options.locale);\r\n viewDate.locale(options.locale);\r\n\r\n if (actualFormat) {\r\n initFormatting(); // reinit formatting\r\n }\r\n if (widget) {\r\n hide();\r\n show();\r\n }\r\n return picker;\r\n };\r\n\r\n picker.stepping = function (stepping) {\r\n if (arguments.length === 0) {\r\n return options.stepping;\r\n }\r\n\r\n stepping = parseInt(stepping, 10);\r\n if (isNaN(stepping) || stepping < 1) {\r\n stepping = 1;\r\n }\r\n options.stepping = stepping;\r\n return picker;\r\n };\r\n\r\n picker.useCurrent = function (useCurrent) {\r\n var useCurrentOptions = ['year', 'month', 'day', 'hour', 'minute'];\r\n if (arguments.length === 0) {\r\n return options.useCurrent;\r\n }\r\n\r\n if ((typeof useCurrent !== 'boolean') && (typeof useCurrent !== 'string')) {\r\n throw new TypeError('useCurrent() expects a boolean or string parameter');\r\n }\r\n if (typeof useCurrent === 'string' && useCurrentOptions.indexOf(useCurrent.toLowerCase()) === -1) {\r\n throw new TypeError('useCurrent() expects a string parameter of ' + useCurrentOptions.join(', '));\r\n }\r\n options.useCurrent = useCurrent;\r\n return picker;\r\n };\r\n\r\n picker.collapse = function (collapse) {\r\n if (arguments.length === 0) {\r\n return options.collapse;\r\n }\r\n\r\n if (typeof collapse !== 'boolean') {\r\n throw new TypeError('collapse() expects a boolean parameter');\r\n }\r\n if (options.collapse === collapse) {\r\n return picker;\r\n }\r\n options.collapse = collapse;\r\n if (widget) {\r\n hide();\r\n show();\r\n }\r\n return picker;\r\n };\r\n\r\n picker.icons = function (icons) {\r\n if (arguments.length === 0) {\r\n return $.extend({}, options.icons);\r\n }\r\n\r\n if (!(icons instanceof Object)) {\r\n throw new TypeError('icons() expects parameter to be an Object');\r\n }\r\n $.extend(options.icons, icons);\r\n if (widget) {\r\n hide();\r\n show();\r\n }\r\n return picker;\r\n };\r\n\r\n picker.tooltips = function (tooltips) {\r\n if (arguments.length === 0) {\r\n return $.extend({}, options.tooltips);\r\n }\r\n\r\n if (!(tooltips instanceof Object)) {\r\n throw new TypeError('tooltips() expects parameter to be an Object');\r\n }\r\n $.extend(options.tooltips, tooltips);\r\n if (widget) {\r\n hide();\r\n show();\r\n }\r\n return picker;\r\n };\r\n\r\n picker.useStrict = function (useStrict) {\r\n if (arguments.length === 0) {\r\n return options.useStrict;\r\n }\r\n\r\n if (typeof useStrict !== 'boolean') {\r\n throw new TypeError('useStrict() expects a boolean parameter');\r\n }\r\n options.useStrict = useStrict;\r\n return picker;\r\n };\r\n\r\n picker.sideBySide = function (sideBySide) {\r\n if (arguments.length === 0) {\r\n return options.sideBySide;\r\n }\r\n\r\n if (typeof sideBySide !== 'boolean') {\r\n throw new TypeError('sideBySide() expects a boolean parameter');\r\n }\r\n options.sideBySide = sideBySide;\r\n if (widget) {\r\n hide();\r\n show();\r\n }\r\n return picker;\r\n };\r\n\r\n picker.viewMode = function (viewMode) {\r\n if (arguments.length === 0) {\r\n return options.viewMode;\r\n }\r\n\r\n if (typeof viewMode !== 'string') {\r\n throw new TypeError('viewMode() expects a string parameter');\r\n }\r\n\r\n if (viewModes.indexOf(viewMode) === -1) {\r\n throw new TypeError('viewMode() parameter must be one of (' + viewModes.join(', ') + ') value');\r\n }\r\n\r\n options.viewMode = viewMode;\r\n currentViewMode = Math.max(viewModes.indexOf(viewMode), minViewModeNumber);\r\n\r\n showMode();\r\n return picker;\r\n };\r\n\r\n picker.toolbarPlacement = function (toolbarPlacement) {\r\n if (arguments.length === 0) {\r\n return options.toolbarPlacement;\r\n }\r\n\r\n if (typeof toolbarPlacement !== 'string') {\r\n throw new TypeError('toolbarPlacement() expects a string parameter');\r\n }\r\n if (toolbarPlacements.indexOf(toolbarPlacement) === -1) {\r\n throw new TypeError('toolbarPlacement() parameter must be one of (' + toolbarPlacements.join(', ') + ') value');\r\n }\r\n options.toolbarPlacement = toolbarPlacement;\r\n\r\n if (widget) {\r\n hide();\r\n show();\r\n }\r\n return picker;\r\n };\r\n\r\n picker.widgetPositioning = function (widgetPositioning) {\r\n if (arguments.length === 0) {\r\n return $.extend({}, options.widgetPositioning);\r\n }\r\n\r\n if (({}).toString.call(widgetPositioning) !== '[object Object]') {\r\n throw new TypeError('widgetPositioning() expects an object variable');\r\n }\r\n if (widgetPositioning.horizontal) {\r\n if (typeof widgetPositioning.horizontal !== 'string') {\r\n throw new TypeError('widgetPositioning() horizontal variable must be a string');\r\n }\r\n widgetPositioning.horizontal = widgetPositioning.horizontal.toLowerCase();\r\n if (horizontalModes.indexOf(widgetPositioning.horizontal) === -1) {\r\n throw new TypeError('widgetPositioning() expects horizontal parameter to be one of (' + horizontalModes.join(', ') + ')');\r\n }\r\n options.widgetPositioning.horizontal = widgetPositioning.horizontal;\r\n }\r\n if (widgetPositioning.vertical) {\r\n if (typeof widgetPositioning.vertical !== 'string') {\r\n throw new TypeError('widgetPositioning() vertical variable must be a string');\r\n }\r\n widgetPositioning.vertical = widgetPositioning.vertical.toLowerCase();\r\n if (verticalModes.indexOf(widgetPositioning.vertical) === -1) {\r\n throw new TypeError('widgetPositioning() expects vertical parameter to be one of (' + verticalModes.join(', ') + ')');\r\n }\r\n options.widgetPositioning.vertical = widgetPositioning.vertical;\r\n }\r\n update();\r\n return picker;\r\n };\r\n\r\n picker.calendarWeeks = function (calendarWeeks) {\r\n if (arguments.length === 0) {\r\n return options.calendarWeeks;\r\n }\r\n\r\n if (typeof calendarWeeks !== 'boolean') {\r\n throw new TypeError('calendarWeeks() expects parameter to be a boolean value');\r\n }\r\n\r\n options.calendarWeeks = calendarWeeks;\r\n update();\r\n return picker;\r\n };\r\n\r\n picker.showTodayButton = function (showTodayButton) {\r\n if (arguments.length === 0) {\r\n return options.showTodayButton;\r\n }\r\n\r\n if (typeof showTodayButton !== 'boolean') {\r\n throw new TypeError('showTodayButton() expects a boolean parameter');\r\n }\r\n\r\n options.showTodayButton = showTodayButton;\r\n if (widget) {\r\n hide();\r\n show();\r\n }\r\n return picker;\r\n };\r\n\r\n picker.showClear = function (showClear) {\r\n if (arguments.length === 0) {\r\n return options.showClear;\r\n }\r\n\r\n if (typeof showClear !== 'boolean') {\r\n throw new TypeError('showClear() expects a boolean parameter');\r\n }\r\n\r\n options.showClear = showClear;\r\n if (widget) {\r\n hide();\r\n show();\r\n }\r\n return picker;\r\n };\r\n\r\n picker.widgetParent = function (widgetParent) {\r\n if (arguments.length === 0) {\r\n return options.widgetParent;\r\n }\r\n\r\n if (typeof widgetParent === 'string') {\r\n widgetParent = $(widgetParent);\r\n }\r\n\r\n if (widgetParent !== null && (typeof widgetParent !== 'string' && !(widgetParent instanceof $))) {\r\n throw new TypeError('widgetParent() expects a string or a jQuery object parameter');\r\n }\r\n\r\n options.widgetParent = widgetParent;\r\n if (widget) {\r\n hide();\r\n show();\r\n }\r\n return picker;\r\n };\r\n\r\n picker.keepOpen = function (keepOpen) {\r\n if (arguments.length === 0) {\r\n return options.keepOpen;\r\n }\r\n\r\n if (typeof keepOpen !== 'boolean') {\r\n throw new TypeError('keepOpen() expects a boolean parameter');\r\n }\r\n\r\n options.keepOpen = keepOpen;\r\n return picker;\r\n };\r\n\r\n picker.focusOnShow = function (focusOnShow) {\r\n if (arguments.length === 0) {\r\n return options.focusOnShow;\r\n }\r\n\r\n if (typeof focusOnShow !== 'boolean') {\r\n throw new TypeError('focusOnShow() expects a boolean parameter');\r\n }\r\n\r\n options.focusOnShow = focusOnShow;\r\n return picker;\r\n };\r\n\r\n picker.inline = function (inline) {\r\n if (arguments.length === 0) {\r\n return options.inline;\r\n }\r\n\r\n if (typeof inline !== 'boolean') {\r\n throw new TypeError('inline() expects a boolean parameter');\r\n }\r\n\r\n options.inline = inline;\r\n return picker;\r\n };\r\n\r\n picker.clear = function () {\r\n clear();\r\n return picker;\r\n };\r\n\r\n picker.keyBinds = function (keyBinds) {\r\n if (arguments.length === 0) {\r\n return options.keyBinds;\r\n }\r\n\r\n options.keyBinds = keyBinds;\r\n return picker;\r\n };\r\n\r\n picker.getMoment = function (d) {\r\n return getMoment(d);\r\n };\r\n\r\n picker.debug = function (debug) {\r\n if (typeof debug !== 'boolean') {\r\n throw new TypeError('debug() expects a boolean parameter');\r\n }\r\n\r\n options.debug = debug;\r\n return picker;\r\n };\r\n\r\n picker.allowInputToggle = function (allowInputToggle) {\r\n if (arguments.length === 0) {\r\n return options.allowInputToggle;\r\n }\r\n\r\n if (typeof allowInputToggle !== 'boolean') {\r\n throw new TypeError('allowInputToggle() expects a boolean parameter');\r\n }\r\n\r\n options.allowInputToggle = allowInputToggle;\r\n return picker;\r\n };\r\n\r\n picker.showClose = function (showClose) {\r\n if (arguments.length === 0) {\r\n return options.showClose;\r\n }\r\n\r\n if (typeof showClose !== 'boolean') {\r\n throw new TypeError('showClose() expects a boolean parameter');\r\n }\r\n\r\n options.showClose = showClose;\r\n return picker;\r\n };\r\n\r\n picker.keepInvalid = function (keepInvalid) {\r\n if (arguments.length === 0) {\r\n return options.keepInvalid;\r\n }\r\n\r\n if (typeof keepInvalid !== 'boolean') {\r\n throw new TypeError('keepInvalid() expects a boolean parameter');\r\n }\r\n options.keepInvalid = keepInvalid;\r\n return picker;\r\n };\r\n\r\n picker.datepickerInput = function (datepickerInput) {\r\n if (arguments.length === 0) {\r\n return options.datepickerInput;\r\n }\r\n\r\n if (typeof datepickerInput !== 'string') {\r\n throw new TypeError('datepickerInput() expects a string parameter');\r\n }\r\n\r\n options.datepickerInput = datepickerInput;\r\n return picker;\r\n };\r\n\r\n picker.parseInputDate = function (parseInputDate) {\r\n if (arguments.length === 0) {\r\n return options.parseInputDate;\r\n }\r\n\r\n if (typeof parseInputDate !== 'function') {\r\n throw new TypeError('parseInputDate() sholud be as function');\r\n }\r\n\r\n options.parseInputDate = parseInputDate;\r\n\r\n return picker;\r\n };\r\n\r\n picker.disabledTimeIntervals = function (disabledTimeIntervals) {\r\n ///\r\n ///Returns an array with the currently set disabled dates on the component.\r\n ///options.disabledTimeIntervals\r\n ///\r\n ///\r\n ///Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of\r\n ///options.enabledDates if such exist.\r\n ///Takes an [ string or Date or moment ] of values and allows the user to select only from those days.\r\n ///\r\n if (arguments.length === 0) {\r\n return (options.disabledTimeIntervals ? $.extend({}, options.disabledTimeIntervals) : options.disabledTimeIntervals);\r\n }\r\n\r\n if (!disabledTimeIntervals) {\r\n options.disabledTimeIntervals = false;\r\n update();\r\n return picker;\r\n }\r\n if (!(disabledTimeIntervals instanceof Array)) {\r\n throw new TypeError('disabledTimeIntervals() expects an array parameter');\r\n }\r\n options.disabledTimeIntervals = disabledTimeIntervals;\r\n update();\r\n return picker;\r\n };\r\n\r\n picker.disabledHours = function (hours) {\r\n ///\r\n ///Returns an array with the currently set disabled hours on the component.\r\n ///options.disabledHours\r\n ///\r\n ///\r\n ///Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of\r\n ///options.enabledHours if such exist.\r\n ///Takes an [ int ] of values and disallows the user to select only from those hours.\r\n ///\r\n if (arguments.length === 0) {\r\n return (options.disabledHours ? $.extend({}, options.disabledHours) : options.disabledHours);\r\n }\r\n\r\n if (!hours) {\r\n options.disabledHours = false;\r\n update();\r\n return picker;\r\n }\r\n if (!(hours instanceof Array)) {\r\n throw new TypeError('disabledHours() expects an array parameter');\r\n }\r\n options.disabledHours = indexGivenHours(hours);\r\n options.enabledHours = false;\r\n if (options.useCurrent && !options.keepInvalid) {\r\n var tries = 0;\r\n while (!isValid(date, 'h')) {\r\n date.add(1, 'h');\r\n if (tries === 24) {\r\n throw 'Tried 24 times to find a valid date';\r\n }\r\n tries++;\r\n }\r\n setValue(date);\r\n }\r\n update();\r\n return picker;\r\n };\r\n\r\n picker.enabledHours = function (hours) {\r\n ///\r\n ///Returns an array with the currently set enabled hours on the component.\r\n ///options.enabledHours\r\n ///\r\n ///\r\n ///Setting this takes precedence over options.minDate, options.maxDate configuration. Also calling this function removes the configuration of options.disabledHours if such exist.\r\n ///Takes an [ int ] of values and allows the user to select only from those hours.\r\n ///\r\n if (arguments.length === 0) {\r\n return (options.enabledHours ? $.extend({}, options.enabledHours) : options.enabledHours);\r\n }\r\n\r\n if (!hours) {\r\n options.enabledHours = false;\r\n update();\r\n return picker;\r\n }\r\n if (!(hours instanceof Array)) {\r\n throw new TypeError('enabledHours() expects an array parameter');\r\n }\r\n options.enabledHours = indexGivenHours(hours);\r\n options.disabledHours = false;\r\n if (options.useCurrent && !options.keepInvalid) {\r\n var tries = 0;\r\n while (!isValid(date, 'h')) {\r\n date.add(1, 'h');\r\n if (tries === 24) {\r\n throw 'Tried 24 times to find a valid date';\r\n }\r\n tries++;\r\n }\r\n setValue(date);\r\n }\r\n update();\r\n return picker;\r\n };\r\n /**\r\n * Returns the component's model current viewDate, a moment object or null if not set. Passing a null value unsets the components model current moment. Parsing of the newDate parameter is made using moment library with the options.format and options.useStrict components configuration.\r\n * @param {Takes string, viewDate, moment, null parameter.} newDate\r\n * @returns {viewDate.clone()}\r\n */\r\n picker.viewDate = function (newDate) {\r\n if (arguments.length === 0) {\r\n return viewDate.clone();\r\n }\r\n\r\n if (!newDate) {\r\n viewDate = date.clone();\r\n return picker;\r\n }\r\n\r\n if (typeof newDate !== 'string' && !moment.isMoment(newDate) && !(newDate instanceof Date)) {\r\n throw new TypeError('viewDate() parameter must be one of [string, moment or Date]');\r\n }\r\n\r\n viewDate = parseInputDate(newDate);\r\n viewUpdate();\r\n return picker;\r\n };\r\n\r\n // initializing element and component attributes\r\n if (element.is('input')) {\r\n input = element;\r\n } else {\r\n input = element.find(options.datepickerInput);\r\n if (input.length === 0) {\r\n input = element.find('input');\r\n } else if (!input.is('input')) {\r\n throw new Error('CSS class \"' + options.datepickerInput + '\" cannot be applied to non input element');\r\n }\r\n }\r\n\r\n if (element.hasClass('input-group')) {\r\n // in case there is more then one 'input-group-addon' Issue #48\r\n if (element.find('.datepickerbutton').length === 0) {\r\n component = element.find('.input-group-addon');\r\n } else {\r\n component = element.find('.datepickerbutton');\r\n }\r\n }\r\n\r\n if (!options.inline && !input.is('input')) {\r\n throw new Error('Could not initialize DateTimePicker without an input element');\r\n }\r\n\r\n // Set defaults for date here now instead of in var declaration\r\n date = getMoment();\r\n viewDate = date.clone();\r\n\r\n $.extend(true, options, dataToOptions());\r\n\r\n picker.options(options);\r\n\r\n initFormatting();\r\n\r\n attachDatePickerElementEvents();\r\n\r\n if (input.prop('disabled')) {\r\n picker.disable();\r\n }\r\n if (input.is('input') && input.val().trim().length !== 0) {\r\n setValue(parseInputDate(input.val().trim()));\r\n }\r\n else if (options.defaultDate && input.attr('placeholder') === undefined) {\r\n setValue(options.defaultDate);\r\n }\r\n if (options.inline) {\r\n show();\r\n }\r\n return picker;\r\n };\r\n\r\n /********************************************************************************\r\n *\r\n * jQuery plugin constructor and defaults object\r\n *\r\n ********************************************************************************/\r\n\r\n /**\r\n * See (http://jquery.com/).\r\n * @name jQuery\r\n * @class\r\n * See the jQuery Library (http://jquery.com/) for full details. This just\r\n * documents the function and classes that are added to jQuery by this plug-in.\r\n */\r\n /**\r\n * See (http://jquery.com/)\r\n * @name fn\r\n * @class\r\n * See the jQuery Library (http://jquery.com/) for full details. This just\r\n * documents the function and classes that are added to jQuery by this plug-in.\r\n * @memberOf jQuery\r\n */\r\n /**\r\n * Show comments\r\n * @class datetimepicker\r\n * @memberOf jQuery.fn\r\n */\r\n $.fn.datetimepicker = function (options) {\r\n options = options || {};\r\n\r\n var args = Array.prototype.slice.call(arguments, 1),\r\n isInstance = true,\r\n thisMethods = ['destroy', 'hide', 'show', 'toggle'],\r\n returnValue;\r\n\r\n if (typeof options === 'object') {\r\n return this.each(function () {\r\n var $this = $(this),\r\n _options;\r\n if (!$this.data('DateTimePicker')) {\r\n // create a private copy of the defaults object\r\n _options = $.extend(true, {}, $.fn.datetimepicker.defaults, options);\r\n $this.data('DateTimePicker', dateTimePicker($this, _options));\r\n }\r\n });\r\n } else if (typeof options === 'string') {\r\n this.each(function () {\r\n var $this = $(this),\r\n instance = $this.data('DateTimePicker');\r\n if (!instance) {\r\n throw new Error('bootstrap-datetimepicker(\"' + options + '\") method was called on an element that is not using DateTimePicker');\r\n }\r\n\r\n returnValue = instance[options].apply(instance, args);\r\n isInstance = returnValue === instance;\r\n });\r\n\r\n if (isInstance || $.inArray(options, thisMethods) > -1) {\r\n return this;\r\n }\r\n\r\n return returnValue;\r\n }\r\n\r\n throw new TypeError('Invalid arguments for DateTimePicker: ' + options);\r\n };\r\n\r\n $.fn.datetimepicker.defaults = {\r\n timeZone: '',\r\n format: false,\r\n dayViewHeaderFormat: 'MMMM YYYY',\r\n extraFormats: false,\r\n stepping: 1,\r\n minDate: false,\r\n maxDate: false,\r\n useCurrent: true,\r\n collapse: true,\r\n locale: moment.locale(),\r\n defaultDate: false,\r\n disabledDates: false,\r\n enabledDates: false,\r\n icons: {\r\n time: 'glyphicon glyphicon-time',\r\n date: 'glyphicon glyphicon-calendar',\r\n up: 'glyphicon glyphicon-chevron-up',\r\n down: 'glyphicon glyphicon-chevron-down',\r\n previous: 'glyphicon glyphicon-chevron-left',\r\n next: 'glyphicon glyphicon-chevron-right',\r\n today: 'glyphicon glyphicon-screenshot',\r\n clear: 'glyphicon glyphicon-trash',\r\n close: 'glyphicon glyphicon-remove'\r\n },\r\n tooltips: {\r\n today: 'Go to today',\r\n clear: 'Clear selection',\r\n close: 'Close the picker',\r\n selectMonth: 'Select Month',\r\n prevMonth: 'Previous Month',\r\n nextMonth: 'Next Month',\r\n selectYear: 'Select Year',\r\n prevYear: 'Previous Year',\r\n nextYear: 'Next Year',\r\n selectDecade: 'Select Decade',\r\n prevDecade: 'Previous Decade',\r\n nextDecade: 'Next Decade',\r\n prevCentury: 'Previous Century',\r\n nextCentury: 'Next Century',\r\n pickHour: 'Pick Hour',\r\n incrementHour: 'Increment Hour',\r\n decrementHour: 'Decrement Hour',\r\n pickMinute: 'Pick Minute',\r\n incrementMinute: 'Increment Minute',\r\n decrementMinute: 'Decrement Minute',\r\n pickSecond: 'Pick Second',\r\n incrementSecond: 'Increment Second',\r\n decrementSecond: 'Decrement Second',\r\n togglePeriod: 'Toggle Period',\r\n selectTime: 'Select Time'\r\n },\r\n useStrict: false,\r\n sideBySide: false,\r\n daysOfWeekDisabled: false,\r\n calendarWeeks: false,\r\n viewMode: 'days',\r\n toolbarPlacement: 'default',\r\n showTodayButton: false,\r\n showClear: false,\r\n showClose: false,\r\n widgetPositioning: {\r\n horizontal: 'auto',\r\n vertical: 'auto'\r\n },\r\n widgetParent: null,\r\n ignoreReadonly: false,\r\n keepOpen: false,\r\n focusOnShow: true,\r\n inline: false,\r\n keepInvalid: false,\r\n datepickerInput: '.datepickerinput',\r\n keyBinds: {\r\n up: function (widget) {\r\n if (!widget) {\r\n return;\r\n }\r\n var d = this.date() || this.getMoment();\r\n if (widget.find('.datepicker').is(':visible')) {\r\n this.date(d.clone().subtract(7, 'd'));\r\n } else {\r\n this.date(d.clone().add(this.stepping(), 'm'));\r\n }\r\n },\r\n down: function (widget) {\r\n if (!widget) {\r\n this.show();\r\n return;\r\n }\r\n var d = this.date() || this.getMoment();\r\n if (widget.find('.datepicker').is(':visible')) {\r\n this.date(d.clone().add(7, 'd'));\r\n } else {\r\n this.date(d.clone().subtract(this.stepping(), 'm'));\r\n }\r\n },\r\n 'control up': function (widget) {\r\n if (!widget) {\r\n return;\r\n }\r\n var d = this.date() || this.getMoment();\r\n if (widget.find('.datepicker').is(':visible')) {\r\n this.date(d.clone().subtract(1, 'y'));\r\n } else {\r\n this.date(d.clone().add(1, 'h'));\r\n }\r\n },\r\n 'control down': function (widget) {\r\n if (!widget) {\r\n return;\r\n }\r\n var d = this.date() || this.getMoment();\r\n if (widget.find('.datepicker').is(':visible')) {\r\n this.date(d.clone().add(1, 'y'));\r\n } else {\r\n this.date(d.clone().subtract(1, 'h'));\r\n }\r\n },\r\n left: function (widget) {\r\n if (!widget) {\r\n return;\r\n }\r\n var d = this.date() || this.getMoment();\r\n if (widget.find('.datepicker').is(':visible')) {\r\n this.date(d.clone().subtract(1, 'd'));\r\n }\r\n },\r\n right: function (widget) {\r\n if (!widget) {\r\n return;\r\n }\r\n var d = this.date() || this.getMoment();\r\n if (widget.find('.datepicker').is(':visible')) {\r\n this.date(d.clone().add(1, 'd'));\r\n }\r\n },\r\n pageUp: function (widget) {\r\n if (!widget) {\r\n return;\r\n }\r\n var d = this.date() || this.getMoment();\r\n if (widget.find('.datepicker').is(':visible')) {\r\n this.date(d.clone().subtract(1, 'M'));\r\n }\r\n },\r\n pageDown: function (widget) {\r\n if (!widget) {\r\n return;\r\n }\r\n var d = this.date() || this.getMoment();\r\n if (widget.find('.datepicker').is(':visible')) {\r\n this.date(d.clone().add(1, 'M'));\r\n }\r\n },\r\n enter: function () {\r\n this.hide();\r\n },\r\n escape: function () {\r\n this.hide();\r\n },\r\n //tab: function (widget) { //this break the flow of the form. disabling for now\r\n // var toggle = widget.find('.picker-switch a[data-action=\"togglePicker\"]');\r\n // if(toggle.length > 0) toggle.click();\r\n //},\r\n 'control space': function (widget) {\r\n if (!widget) {\r\n return;\r\n }\r\n if (widget.find('.timepicker').is(':visible')) {\r\n widget.find('.btn[data-action=\"togglePeriod\"]').click();\r\n }\r\n },\r\n t: function () {\r\n this.date(this.getMoment());\r\n },\r\n 'delete': function () {\r\n this.clear();\r\n }\r\n },\r\n debug: false,\r\n allowInputToggle: false,\r\n disabledTimeIntervals: false,\r\n disabledHours: false,\r\n enabledHours: false,\r\n viewDate: false\r\n };\r\n\r\n return $.fn.datetimepicker;\r\n}));\r\n"],"names":[],"sourceRoot":""}
').addClass('cw').text('#'));\r\n }\r\n\r\n while (currentDate.isBefore(viewDate.clone().endOf('w'))) {\r\n row.append($('').addClass('dow').text(currentDate.format('dd')));\r\n currentDate.add(1, 'd');\r\n }\r\n widget.find('.datepicker-days thead').append(row);\r\n },\r\n\r\n isInDisabledDates = function (testDate) {\r\n return options.disabledDates[testDate.format('YYYY-MM-DD')] === true;\r\n },\r\n\r\n isInEnabledDates = function (testDate) {\r\n return options.enabledDates[testDate.format('YYYY-MM-DD')] === true;\r\n },\r\n\r\n isInDisabledHours = function (testDate) {\r\n return options.disabledHours[testDate.format('H')] === true;\r\n },\r\n\r\n isInEnabledHours = function (testDate) {\r\n return options.enabledHours[testDate.format('H')] === true;\r\n },\r\n\r\n isValid = function (targetMoment, granularity) {\r\n if (!targetMoment.isValid()) {\r\n return false;\r\n }\r\n if (options.disabledDates && granularity === 'd' && isInDisabledDates(targetMoment)) {\r\n return false;\r\n }\r\n if (options.enabledDates && granularity === 'd' && !isInEnabledDates(targetMoment)) {\r\n return false;\r\n }\r\n if (options.minDate && targetMoment.isBefore(options.minDate, granularity)) {\r\n return false;\r\n }\r\n if (options.maxDate && targetMoment.isAfter(options.maxDate, granularity)) {\r\n return false;\r\n }\r\n if (options.daysOfWeekDisabled && granularity === 'd' && options.daysOfWeekDisabled.indexOf(targetMoment.day()) !== -1) {\r\n return false;\r\n }\r\n if (options.disabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && isInDisabledHours(targetMoment)) {\r\n return false;\r\n }\r\n if (options.enabledHours && (granularity === 'h' || granularity === 'm' || granularity === 's') && !isInEnabledHours(targetMoment)) {\r\n return false;\r\n }\r\n if (options.disabledTimeIntervals && (granularity === 'h' || granularity === 'm' || granularity === 's')) {\r\n var found = false;\r\n $.each(options.disabledTimeIntervals, function () {\r\n if (targetMoment.isBetween(this[0], this[1])) {\r\n found = true;\r\n return false;\r\n }\r\n });\r\n if (found) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n },\r\n\r\n fillMonths = function () {\r\n var spans = [],\r\n monthsShort = viewDate.clone().startOf('y').startOf('d');\r\n while (monthsShort.isSame(viewDate, 'y')) {\r\n spans.push($('').attr('data-action', 'selectMonth').addClass('month').text(monthsShort.format('MMM')));\r\n monthsShort.add(1, 'M');\r\n }\r\n widget.find('.datepicker-months td').empty().append(spans);\r\n },\r\n\r\n updateMonths = function () {\r\n var monthsView = widget.find('.datepicker-months'),\r\n monthsViewHeader = monthsView.find('th'),\r\n months = monthsView.find('tbody').find('span');\r\n\r\n monthsViewHeader.eq(0).find('span').attr('title', options.tooltips.prevYear);\r\n monthsViewHeader.eq(1).attr('title', options.tooltips.selectYear);\r\n monthsViewHeader.eq(2).find('span').attr('title', options.tooltips.nextYear);\r\n\r\n monthsView.find('.disabled').removeClass('disabled');\r\n\r\n if (!isValid(viewDate.clone().subtract(1, 'y'), 'y')) {\r\n monthsViewHeader.eq(0).addClass('disabled');\r\n }\r\n\r\n monthsViewHeader.eq(1).text(viewDate.year());\r\n\r\n if (!isValid(viewDate.clone().add(1, 'y'), 'y')) {\r\n monthsViewHeader.eq(2).addClass('disabled');\r\n }\r\n\r\n months.removeClass('active');\r\n if (date.isSame(viewDate, 'y') && !unset) {\r\n months.eq(date.month()).addClass('active');\r\n }\r\n\r\n months.each(function (index) {\r\n if (!isValid(viewDate.clone().month(index), 'M')) {\r\n $(this).addClass('disabled');\r\n }\r\n });\r\n },\r\n\r\n updateYears = function () {\r\n var yearsView = widget.find('.datepicker-years'),\r\n yearsViewHeader = yearsView.find('th'),\r\n startYear = viewDate.clone().subtract(5, 'y'),\r\n endYear = viewDate.clone().add(6, 'y'),\r\n html = '';\r\n\r\n yearsViewHeader.eq(0).find('span').attr('title', options.tooltips.prevDecade);\r\n yearsViewHeader.eq(1).attr('title', options.tooltips.selectDecade);\r\n yearsViewHeader.eq(2).find('span').attr('title', options.tooltips.nextDecade);\r\n\r\n yearsView.find('.disabled').removeClass('disabled');\r\n\r\n if (options.minDate && options.minDate.isAfter(startYear, 'y')) {\r\n yearsViewHeader.eq(0).addClass('disabled');\r\n }\r\n\r\n yearsViewHeader.eq(1).text(startYear.year() + '-' + endYear.year());\r\n\r\n if (options.maxDate && options.maxDate.isBefore(endYear, 'y')) {\r\n yearsViewHeader.eq(2).addClass('disabled');\r\n }\r\n\r\n while (!startYear.isAfter(endYear, 'y')) {\r\n html += '' + startYear.year() + '';\r\n startYear.add(1, 'y');\r\n }\r\n\r\n yearsView.find('td').html(html);\r\n },\r\n\r\n updateDecades = function () {\r\n var decadesView = widget.find('.datepicker-decades'),\r\n decadesViewHeader = decadesView.find('th'),\r\n startDecade = moment({ y: viewDate.year() - (viewDate.year() % 100) - 1 }),\r\n endDecade = startDecade.clone().add(100, 'y'),\r\n startedAt = startDecade.clone(),\r\n minDateDecade = false,\r\n maxDateDecade = false,\r\n endDecadeYear,\r\n html = '';\r\n\r\n decadesViewHeader.eq(0).find('span').attr('title', options.tooltips.prevCentury);\r\n decadesViewHeader.eq(2).find('span').attr('title', options.tooltips.nextCentury);\r\n\r\n decadesView.find('.disabled').removeClass('disabled');\r\n\r\n if (startDecade.isSame(moment({ y: 1900 })) || (options.minDate && options.minDate.isAfter(startDecade, 'y'))) {\r\n decadesViewHeader.eq(0).addClass('disabled');\r\n }\r\n\r\n decadesViewHeader.eq(1).text(startDecade.year() + '-' + endDecade.year());\r\n\r\n if (startDecade.isSame(moment({ y: 2000 })) || (options.maxDate && options.maxDate.isBefore(endDecade, 'y'))) {\r\n decadesViewHeader.eq(2).addClass('disabled');\r\n }\r\n\r\n while (!startDecade.isAfter(endDecade, 'y')) {\r\n endDecadeYear = startDecade.year() + 12;\r\n minDateDecade = options.minDate && options.minDate.isAfter(startDecade, 'y') && options.minDate.year() <= endDecadeYear;\r\n maxDateDecade = options.maxDate && options.maxDate.isAfter(startDecade, 'y') && options.maxDate.year() <= endDecadeYear;\r\n html += '' + (startDecade.year() + 1) + ' - ' + (startDecade.year() + 12) + '';\r\n startDecade.add(12, 'y');\r\n }\r\n html += ''; //push the dangling block over, at least this way it's even\r\n\r\n decadesView.find('td').html(html);\r\n decadesViewHeader.eq(1).text((startedAt.year() + 1) + '-' + (startDecade.year()));\r\n },\r\n\r\n fillDate = function () {\r\n var daysView = widget.find('.datepicker-days'),\r\n daysViewHeader = daysView.find('th'),\r\n currentDate,\r\n html = [],\r\n row,\r\n clsNames = [],\r\n i;\r\n\r\n if (!hasDate()) {\r\n return;\r\n }\r\n\r\n daysViewHeader.eq(0).find('span').attr('title', options.tooltips.prevMonth);\r\n daysViewHeader.eq(1).attr('title', options.tooltips.selectMonth);\r\n daysViewHeader.eq(2).find('span').attr('title', options.tooltips.nextMonth);\r\n\r\n daysView.find('.disabled').removeClass('disabled');\r\n daysViewHeader.eq(1).text(viewDate.format(options.dayViewHeaderFormat));\r\n\r\n if (!isValid(viewDate.clone().subtract(1, 'M'), 'M')) {\r\n daysViewHeader.eq(0).addClass('disabled');\r\n }\r\n if (!isValid(viewDate.clone().add(1, 'M'), 'M')) {\r\n daysViewHeader.eq(2).addClass('disabled');\r\n }\r\n\r\n currentDate = viewDate.clone().startOf('M').startOf('w').startOf('d');\r\n\r\n for (i = 0; i < 42; i++) { //always display 42 days (should show 6 weeks)\r\n if (currentDate.weekday() === 0) {\r\n row = $('
' + currentDate.week() + '' + currentDate.date() + '
' + currentHour.format(use24Hours ? 'HH' : 'hh') + '
' + currentMinute.format('mm') + '
' + currentSecond.format('ss') + '