ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ." ¤‡ú*õ'VŽ|¼´Úgllº¼klz[Æüï÷Aób‡Eÿ dÑ»Xx9ÃÜ£ÁT/`¼¸vI±Ýµ·Ë‚“G³þ*Ÿû´r|*}<¨îºœ @¦mÄ’M¹”.œ«Y–|6ÏU¤jç¥ÕÞqO ˜kDÆÁ¨5ÿ š;ÐЦ¦€GÙk \ –Þ=â¼=SͧµªS°ÚÍpÜãQűÀõ¬?ÃÁ1Ñ•õZà?hóœ€ L¦l{Y*K˜Ù›zc˜–ˆâ ø+¾ ­-Ök¥%ùEÜA'}ˆ><ÊIè“bpÍ/qÞâvoX€w,\úªò6Z[XdÒæ­@Ö—€$òJí#é>'°Ú ôª˜<)4ryÙ£|óAÅn5žêŸyÒäMÝ2{"}‰–¤l÷ûWX\l¾Á¸góÉOÔ /óñB¤f¸çñ[.P˜ZsÊË*ßT܈§QN¢’¡¨§V¼(Üù*eÕ“”5T¨‹Âê¥FŒã½Dü[8'Ò¥a…Ú¶k7a *•›¼'Ò·\8¨ª\@\õ¢¦íq+DÙrmÎ…_ªæ»ŠÓœ¡¯’Ré9MÅ×D™lælffc+ŒÑ,ý™ÿ ¯þǤ=Å’Á7µ÷ÚÛ/“Ü€ñýã¼àí¾ÕÑ+ƒ,uµMâÀÄbm:ÒÎPæ{˜Gz[ƒ¯«® KHà`ߨŠéí¯P8Aq.C‰ à€kòpj´kN¶qô€…Õ,ÜNŠª-­{Zö’æû44‰sŽè‰îVíRœÕm" 6?³D9¡ÇTíÅꋇ`4«¸ÝÁô ï’ýorqКÇZ«x4Žâéþuïf¹µö[P ,Q£éaX±`PÉÍZ ¸äYúg üAx ’6Lê‚xÝÓ*äQ  Ï’¨hÍ =²,6ï#rÃ<¯–£»ƒ‹,–ê•€ aÛsñ'%Æ"®ÛüìBᝠHÚ3ß°©$“XnœÖ’î2ËTeûìxîß ¦å¿çÉ ðK§þ{‘t‚Ϋ¬jéîZ[ ”š7L¥4VÚCE×]m¤Øy”ä4-dz£œ§¸x.*ãÊÊ b÷•h:©‡¦s`BTÁRû¾g⻩‹jø sF¢àJøFl‘È•Xᓁà~*j¯ +(ÚÕ6-£¯÷GŠØy‚<Ç’.F‹Hœw(+)ÜÜâÈzÄäT§FߘãÏ;DmVœ3Àu@mÚüXÝü•3B¨òÌÁÛ<·ÃÜ z,Ì@õÅ·d2]ü8s÷IôÞ¯^Ç9¢u„~ëAŸï4«M? K]­ÅàPl@s_ p:°¬ZR”´›JC[CS.h‹ƒïËœ«Æ]–÷ó‚wR×k7X‰k›‘´ù¦=¡«‰¨¨Â')—71ó’c‡Ðúµ `é.{§p¹ój\Ž{1h{o±Ý=áUÊïGÖŒõ–-BÄm+AZX¶¡ ïHðæ¥JmÙ;…䡟ˆ¦ ° äšiÉg«$üMk5¤L“’çÊvïâï ,=f“"íἊ5ô¬x6{ɏžID0e¸vçmi'︧ºð9$ò¹÷*£’9ÿ ²TÔ…×>JV¥}Œ}$p[bÔ®*[jzS*8 ”·T›Í–ñUîƒwo$áè=LT™ç—~ô·¤ÈÚ$榍q‰„+´kFm)ž‹©i–ËqÞŠ‰à¶ü( ‚•§ •°ò·‡#5ª•µÊ﯅¡X¨šÁ*F#TXJÊ ušJVÍ&=iÄs1‚3•'fý§5Ñ<=[íÞ­ PÚ;ѱÌ_~Ä££8rÞ ²w;’hDT°>ÈG¬8Á²ÚzŽ®ò®qZcqJêäÞ-ö[ܘbň±çb“ж31²n×iƒðÕ;1¶þÉ ªX‰,ßqÏ$>•î íZ¥Z 1{ç൵+ƒÕµ¥°T$§K]á»Ûï*·¤tMI’ÂZbŽÕiÒ˜}bÓ0£ª5›¨ [5Ž^ÝœWøÂÝh° ¢OWun£¤5 a2Z.G2³YL]jåtì”ä ÁÓ‘%"©<Ôúʰsº UZvä‡ÄiÆÒM .÷V·™ø#kèýiíÌ–ª)µT[)BˆõÑ xB¾B€ÖT¨.¥~ð@VĶr#¸ü*åZNDŽH;âi ],©£öØpù(šºãö¼T.uCê•4@ÿ GÕÛ)Cx›®0ø#:ÏðFÒbR\(€€Ä®fã4Þ‰Fä¯HXƒÅ,†öEÑÔÜ]Öv²?tLÃvBY£ú6Êu5ÅAQ³1‘’¬x–HŒÐ‡ ^ ¸KwJôÖŽ5×CÚ¨vÜ«/B0$×k°=ðbÇ(Ï)w±A†Á† 11Í=èQšµ626ŒÜ/`G«µ<}—-Ö7KEHÈÉðóȤmݱû±·ø«Snmá=“䫚mݱŸ¡¶~ó·“äUóJæúòB|E LêŽy´jDÔ$G¢þÐñ7óR8ýÒ…Ç› WVe#·Ÿ p·Fx~•ݤF÷0Èÿ K¯æS<6’¡WШ; ´ÿ ¥Êø\Òuî†åÝ–VNœkÒ7oòX¨Á­Ø÷FÎÑä±g÷ÿ M~Çî=p,X´ ÝÌÚÅ‹’ÃjÖ.ØöÏñ qïQ¤ÓZE†° =6·]܈ s¸>v•Ž^Ý\wq9r‰Î\¸¡kURÒ$­*‹Nq?Þª*!sŠÆ:TU_u±T+øX¡ ®¹¡,ÄâÃBTsÜ$Ø›4m椴zÜK]’’›Pƒ @€#â˜`é¹=I‡fiV•Ôî“nRm+µFPOhÍ0B£ €+¬5c v•:P'ÒyÎ ‰V~‚Ó†ÖuókDoh$å\*ö%Ю=£«…aȼ½÷Û.-½VŒŠ¼'lyî±1¬3ó#ÞE¿ÔS¤gV£m›=§\û"—WU¤ÚǼÿ ÂnÁGŒÃ ‚õN D³õNÚíŒÕ;HôyÄÈ©P¹Ä{:?R‘Ô¨âF÷ø£bÅó® JS|‚R÷ivýáâ€Æé¡è³´IئÑT!§˜•ت‚¬â@q€wnïCWÄ@JU€ê¯m6]Ï:£âx'+ÒðXvÓ¦Úm=–´7œ $ì“B£~p%ÕŸUþ« N@¼üï~w˜ñø5®—'Ôe»¤5ã//€ž~‰Tþ›Å7•#¤× Íö pÄ$ùeåì*«ÓŠEØWEÈsßg ¦ûvžSsLpºÊW–âµEWöˬH; ™!CYõZ ÃÄf æ#1W. \uWâ\,\Çf j’<qTbên›Î[vxx£ë 'ö¨1›˜ÀM¼Pÿ H)ƒêêŒA7s,|F“ 꺸k³9Ìö*ç®;Ö!Ö$Eiž•¹ÒÚ†ýóéÝû¾ÕS®ó$’NÝäŸz¤5r¦ãÄÃD÷Üø!°ø‡Ô&@m™Ì^Ãä­d q5Lnÿ N;.6½·N|#ä"1Nƒx“ã<3('&ñßt  ~ªu”1Tb㫨9ê–›–bìd$ߣ=#ÕãÒmU¯eí$EFù5ýYô櫨æì™Ç—±ssM]·á¿0ÕåJRÓªîiƒ+O58ÖñªŠÒx" \µâá¨i’¤i —Ö ” M+M¤ë9‚‰A¦°Qõ¾ßøK~¼Ã‘g…Ö´~÷Ï[3GUœÒ½#…kàÔ®Ò”‰³·dWV‰IP‰Ú8u¹”E ÖqLj¾êÕCBš{A^Âß;–¨`¯¬ìö ˼ ×tìø.tƐm*n¨y4o&Àx¥n¦×î‡aupáÛj8¿m›è¶ã!o½;ß0y^ý×^EÑ¿ÒjzŒ­)vÚÑnÄL …^ªô× ‡—‚3k Îý­hï]içå–îÏ*÷ñþ»Ô CÒjøjÍznˆ´ ¹#b'Fô‹ ‰v¥'’à'T´ƒHýÍ%M‰ ƒ&ÆÇŒï1 ‘ –Þ ‰i¬s žR-Ÿ kЬá¬7:þ 0ŒÅÒÕ/aÙ¬ÃÝ#Úøœ ©aiVc‰. ¹¦ãµ” ›Yg¦›ÆÎýº°f³7ƒhá·¸­}&D9¡ÂsÉÙÞèŠõØàC™¨ñbFC|´Ü(ŸƒÚÒ-%»'a Ì¿)ËÇn¿úÿ ÞŽX…4ÊÅH^ôΑí@ù¹Eh¶“L8Çjù ¼ÎåVªóR©Ï5uà V4lZß®=€xÖŸ–ÑÈ ÷”¨°¾__yM1tÉ?uÆþIkÄgæ@þ[¢†°XÃJ£j·:nkÅ¢u ‘}âGzö­/IµèЬ¼48q¦F°ŽR¼=ûì{´¯RýicS ÕÛ íNtÍÙï£,w4rêì®»~x(©Uñ§#Ñ&œÕ¤>ÎåÍÓ9’Ö{9eV­[Öjâ²ãu]˜å2›qÑšÕJç0€sÄ|Êëè0튔bÁ>“{×_F`Ø©ºê:µä,v¤ðfc1±"«ÔÍän1#=· Âøv~H½ÐßA¾¿Ü€Óš]Õ; I¾÷ç‚Qi†î¹9ywÔKG˜áñ zQY—§ÃÕZ07§X‚ Áh;ÁM)iÌCH-¯T‘ë|A0{Ò½LÚ–TâÖkÜ’dÀ“rmm»”جPF³ÖcbE§T€ÒxKºû’Ó®7±²(\4ŽÃ¸Uu@j™yĵ;³µ!Á¢b.W¤=mõ´êµK k ¸K^ÜÛ#p*Ü14qkZç5ïë †°5Ï%ÍÛ<Õ¤×Ô¥ê†C Õ´¼ú$ƒÖ“”]Ù¬qÞÚ[4©ý!ûÏ—Áb쳐XµA¬â~`›Çr¸8ìùÝ䫦<>ä÷«?xs´ÇÑ /á;¹øüÊÈÙà{"@Žïzâ¬[âß‚ U_<ÇŸ½4èN˜ú61®qŠu ¦þF£»äJ_ˆÙÎ~ ÞAã–݄ϗrŠD;xTž‘ô`É«…suãO`?³à™ô Lý#Íc5öoæØ‚y´´÷«ZR§<&JÇ+éâô´€i!Àˆ0æAoàðLèÖ-2ŸõW.’t^–(KÁmHµV@xÜÇy®Ñø­â^:Ú3w· 7½¹°ñ¸â¹®:',«Mœ—n­Á+Ãbš LÈ‘ÄnRÓÅœ%¦²‰¨ùQ:¤f‚ "PÕtô¸…cæl…&˜Ú˜Ôkv‹ž+vŠ,=¢v­6—Xy*¥t£«<™:“aîϲ=¦6rO]XI¿Œ÷¤zÚ­›¶ 6÷”w\d ü~v®ˆÌk«^m<ÿ ¢‰Õ\)ùºŽ;… lîÙÅEŠ®cѾ@vnMÏ,¼“ñ•ŽBxðÃzãÇç%3ˆ"}Ù•Åî> BÉú;Ò]V+P˜F_´ßé> Øše|ï‡ÄOmFæÇ ãqÞ$/xÐx­z`ï9"œÜij‚!7.\Td…9M‡•iŽ‹¾‘50ÞŽn¥ß4ÉôO ¹*í^QêËÜÇÌ8=ާs‰'ÂëÙ«á%Pú[O †ÅP¯Vsް.‰,kc¶ ¬A9n˜XÎ-ÞšN["¹QÕ‰ƒMýÁߺXJæÍaLj¾×Ãmã¾ãÚ uñÒþåQô¦¥ /ÄUx:‚ÍÜ’ Đ©ØÝ3V¨‰ÕnÐ6ó*óúK­«…c ¯U òhsý­jóÔj#,ímŒRµ«lbïUTŒÑ8†Ä0œÏr`ð¡¬É Ї ë"À² ™ 6¥ f¶ ¢ÚoܱԷ-<Àî)†a¶ž'Ú»¨TXqØæ¶÷YÄHy˜9ÈIW­YÀuMFë ºÏ’AqÌ4·/Ú †ô'i$øä­=Ä Ý|öK×40è|È6p‘0§)o¥ctî§H+CA-“ xØ|ÐXАç l8íºð3Ø:³¤¬KX¯UÿÙ /** * @copyright Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved. * @license GNU General Public License version 2 or later; see LICENSE.txt */ !(function(window, document){ 'use strict'; /** Method to convert numbers to local symbols. */ Date.convertNumbers = function(str) { var str = str.toString(); if (Object.prototype.toString.call(JoomlaCalLocale.localLangNumbers) === '[object Array]') { for (var i = 0; i < JoomlaCalLocale.localLangNumbers.length; i++) { str = str.replace(new RegExp(i, 'g'), JoomlaCalLocale.localLangNumbers[i]); } } return str; }; /** Translates to english numbers a string. */ Date.toEnglish = function(str) { str = this.toString(); var nums = [0,1,2,3,4,5,6,7,8,9]; for (var i = 0; i < 10; i++) { str = str.replace(new RegExp(nums[i], 'g'), i); } return str; }; var JoomlaCalendar = function (element) { // Initialize only if the element exists if (!element) { throw new Error("Calendar setup failed:\n No valid element found, Please check your code"); } if (typeof Date.parseFieldDate !== 'function') { throw new Error("Calendar setup failed:\n No valid date helper, Please check your code"); } if (element._joomlaCalendar) { throw new Error('JoomlaCalendar instance already exists for the element'); } element._joomlaCalendar = this; this.writable = true; this.hidden = true; this.params = {}; this.element = element; this.inputField = element.getElementsByTagName('input')[0]; this.button = element.getElementsByTagName('button')[0]; if (!this.inputField) { throw new Error("Calendar setup failed:\n No valid input found, Please check your code"); } // Prepare the parameters this.params = { debug: false, clicked: false, element: {style: {display: "none"}}, writable: true }; var self = this, btn = this.button, instanceParams = { inputField : this.inputField, dateType : JoomlaCalLocale.dateType ? JoomlaCalLocale.dateType : 'gregorian', direction : (document.dir !== undefined) ? document.dir : document.getElementsByTagName("html")[0].getAttribute("dir"), firstDayOfWeek : btn.getAttribute("data-firstday") ? parseInt(btn.getAttribute("data-firstday")) : 0, dateFormat : "%Y-%m-%d %H:%M:%S", weekend : JoomlaCalLocale.weekend ? JoomlaCalLocale.weekend : [0,6], minYear : JoomlaCalLocale.minYear ? JoomlaCalLocale.minYear : 1900, maxYear : JoomlaCalLocale.maxYear ? JoomlaCalLocale.maxYear : 2100, minYearTmp : btn.getAttribute("data-min-year"), maxYearTmp : btn.getAttribute("data-max-year"), weekendTmp : btn.getAttribute("data-weekend"), time24 : true, showsOthers : (parseInt(btn.getAttribute("data-show-others")) === 1) ? true : false, showsTime : true, weekNumbers : (parseInt(btn.getAttribute("data-week-numbers")) === 1) ? true : false, showsTodayBtn : true, compressedHeader: (parseInt(btn.getAttribute("data-only-months-nav")) === 1) ? true : false, }; // Keep B/C if (btn.getAttribute("data-dayformat")) { instanceParams.dateFormat = btn.getAttribute("data-dayformat") ? btn.getAttribute("data-dayformat") : "%Y-%m-%d %H:%M:%S"; } if (btn.getAttribute("data-time-24")) { instanceParams.time24 = parseInt(btn.getAttribute("data-time-24")) === 24 ? true : false; } if (btn.getAttribute("data-show-time")) { instanceParams.showsTime = parseInt(btn.getAttribute("data-show-time")) === 1 ? true : false; } if (btn.getAttribute("data-today-btn")) { instanceParams.showsTodayBtn = parseInt(btn.getAttribute("data-today-btn")) === 1 ? true : false; } // Merge the parameters for (var param in instanceParams) { this.params[param] = instanceParams[param]; } // Evaluate the min year if (isInt(self.params.minYearTmp)) { self.params.minYear = getBoundary(parseInt(self.params.minYearTmp), self.params.dateType); } // Evaluate the max year if (isInt(self.params.maxYearTmp)) { self.params.maxYear = getBoundary(parseInt(self.params.maxYearTmp), self.params.dateType); } // Evaluate the weekend days if (self.params.weekendTmp !== "undefined") { self.params.weekend = self.params.weekendTmp.split(',').map(function(item) { return parseInt(item, 10); }); } // Event handler need to define here, to be able access in current context this._dayMouseDown = function(event) { return self._handleDayMouseDown(event); }; this._calKeyEvent = function(event) { return self._handleCalKeyEvent(event); }; this._documentClick = function(event) { return self._handleDocumentClick(event); }; // Set it up this.checkInputs(); // For the fields with readonly tag calendar will not initiate fully if (this.inputField.getAttribute('readonly')) { return; } this._create(); this._bindEvents(); }; JoomlaCalendar.prototype.checkInputs = function () { // Get the date from the input var inputAltValueDate = Date.parseFieldDate(this.inputField.getAttribute('data-alt-value'), this.params.dateFormat, 'gregorian'); if (this.inputField.value !== '') { this.date = inputAltValueDate; this.inputField.value = inputAltValueDate.print(this.params.dateFormat, this.params.dateType, true); } else { this.date = new Date(); } }; /** Removes the calendar object from the DOM tree and destroys it and then recreates it. */ JoomlaCalendar.prototype.recreate = function () { var element = this.element, el = element.querySelector('.js-calendar'); if (el) { element._joomlaCalendar = null; el.parentNode.removeChild(el); new JoomlaCalendar(element); } }; /** Time Control */ JoomlaCalendar.prototype.updateTime = function (hours, mins, secs) { var self = this, date = self.date; var d = self.date.getLocalDate(self.params.dateType), m = self.date.getLocalMonth(self.params.dateType), y = self.date.getLocalFullYear(self.params.dateType), ampm = this.inputField.parentNode.parentNode.querySelectorAll('.time-ampm')[0]; if (!self.params.time24) { if (/pm/i.test(ampm.value) && hours < 12) { hours = parseInt(hours) + 12; } else if (/am/i.test(ampm.value) && hours == 12) { hours = 0; } } date.setHours(hours); date.setMinutes(parseInt(mins, 10)); date.setSeconds(date.getSeconds()); date.setLocalFullYear(self.params.dateType, y); date.setLocalMonth(self.params.dateType, m); date.setLocalDate(self.params.dateType, d); self.dateClicked = false; this.callHandler(); }; /** Method to set the date to the given date object */ JoomlaCalendar.prototype.setDate = function (date) { if (!date.equalsTo(this.date)) { this.date = date; this.processCalendar(this.params.firstDayOfWeek, date); } }; /** Method to set the current date by a number, step */ JoomlaCalendar.prototype.moveCursorBy = function (step) { var date = new Date(this.date); date.setDate(date.getDate() - step); this.setDate(date); }; /** Reset select element */ JoomlaCalendar.prototype.resetSelected = function (element) { var options = element.options; var i = options.length; while (i--) { var current = options[i]; if (current.selected) { current.selected = false; } } }; /** Method to set the value for the input field */ JoomlaCalendar.prototype.callHandler = function () { /** Output the date **/ this.inputField.setAttribute('data-alt-value', this.date.print(this.params.dateFormat, 'gregorian', false)); if (this.inputField.getAttribute('data-alt-value') && this.inputField.getAttribute('data-alt-value') !== '0000-00-00 00:00:00') { this.inputField.value = this.date.print(this.params.dateFormat, this.params.dateType, true); if (this.params.dateType !== 'gregorian') { this.inputField.setAttribute('data-local-value', this.date.print(this.params.dateFormat, this.params.dateType, true)); } } this.inputField.value = this.date.print(this.params.dateFormat, this.params.dateType, true); if (typeof this.inputField.onchange == "function") { this.inputField.onchange(); } if (this.dateClicked && typeof this.params.onUpdate === "function") { this.params.onUpdate(this); } if (this.dateClicked) { this.close(); } else { this.processCalendar(); } }; /** Method to close/hide the calendar */ JoomlaCalendar.prototype.close = function () { this.hide(); }; /** Method to show the calendar. */ JoomlaCalendar.prototype.show = function () { /** This is needed for IE8 */ if (navigator.appName.indexOf("Internet Explorer")!==-1) { var badBrowser = ( navigator.appVersion.indexOf("MSIE 9")===-1 && navigator.appVersion.indexOf("MSIE 1")===-1 ); if (badBrowser) { if (window.jQuery && jQuery().chosen) { var selItems = this.element.getElementsByTagName('select'); for (var i = 0; i < selItems.length; i++) { jQuery(selItems[i]).chosen('destroy'); } } } } this.checkInputs(); this.inputField.focus(); this.dropdownElement.style.display = "block"; this.hidden = false; document.addEventListener("keydown", this._calKeyEvent, true); document.addEventListener("keypress", this._calKeyEvent, true); document.addEventListener("mousedown", this._documentClick, true); /** Move the calendar to top position if it doesn't fit below. */ var containerTmp = this.element.querySelector('.js-calendar'); if ((window.innerHeight + window.scrollY) < containerTmp.getBoundingClientRect().bottom + 20) { containerTmp.style.marginTop = - (containerTmp.getBoundingClientRect().height + this.inputField.getBoundingClientRect().height) + "px"; } this.processCalendar(); }; /** Method to hide the calendar. */ JoomlaCalendar.prototype.hide = function () { document.removeEventListener("keydown", this._calKeyEvent, true); document.removeEventListener("keypress", this._calKeyEvent, true); document.removeEventListener("mousedown", this._documentClick, true); this.dropdownElement.style.display = "none"; this.hidden = true; }; /** Method to catch clicks outside of the calendar (used as close call) */ JoomlaCalendar.prototype._handleDocumentClick = function (ev) { var el = ev.target; if (el !== null && !el.classList.contains('time')) { for (; el !== null && el !== this.element; el = el.parentNode); } if (el === null) { document.activeElement.blur(); this.hide(); return stopCalEvent(ev); } }; /** Method to handle mouse click events (menus, buttons) **/ JoomlaCalendar.prototype._handleDayMouseDown = function (ev) { var self = this, el = ev.currentTarget, target = ev.target || ev.srcElement; if (target && target.hasAttribute('data-action')) { return; } if (el.nodeName !== 'TD') { // A bootstrap inner button was pressed? var testel = el.getParent('TD'); if (testel.nodeName === 'TD') { // Yes so use that element's td el = testel; } else { // No - try to find the table this way el = el.getParent('TD'); if (el.classList.contains('js-calendar')) { el = el.getElementsByTagName('table')[0]; } } } else { // Check that doesn't have a button and is not a day td if (!(target.classList.contains('js-btn')) && !el.classList.contains('day') && !el.classList.contains('title')) { return; } } if (!el || el.disabled) { return false; } if (typeof el.navtype === "undefined" || el.navtype !== 300) { if (el.navtype === 50) { el._current = el.innerHTML; } if (target === el || target.parentNode === el) { self.cellClick(el, ev); } var mon = null; if (typeof el.month !== "undefined") { mon = el; } if (typeof el.parentNode.month !== "undefined") { mon = el.parentNode; } var date = null; if (mon) { date = new Date(self.date); if (mon.month !== date.getLocalMonth(self.params.dateType)) { date.setLocalMonth(self.params.dateType, mon.month); self.setDate(date); self.dateClicked = false; this.callHandler(); } } else { var year = null; if (typeof el.year !== "undefined") { year = target; } if (typeof el.parentNode.year !== "undefined") { year = target.parentNode; } if (year) { date = new Date(self.date); if (year.year !== date.getLocalFullYear(self.params.dateType)) { date.setFullYear(self.params.dateType, year.year); self.setDate(date); self.dateClicked = false; this.callHandler(); } } } } return stopCalEvent(ev); }; /** Method to handle mouse click events (dates) **/ JoomlaCalendar.prototype.cellClick = function (el, ev) { var self = this, closing = false, newdate = false, date = null; if (typeof el.navtype === "undefined") { if (self.currentDateEl) { el.classList.add("selected"); self.currentDateEl = el.caldate; closing = (self.currentDateEl === el.caldate); if (!closing) { self.currentDateEl = el.caldate; } } self.date.setLocalDateOnly('gregorian', el.caldate); var other_month = !(self.dateClicked = !el.otherMonth); if (self.currentDateEl) { newdate = !el.disabled; } if (other_month) { this.processCalendar(); } } else { date = new Date(self.date); self.dateClicked = false; var year = date.getOtherFullYear(self.params.dateType), mon = date.getLocalMonth(self.params.dateType); switch (el.navtype) { case 400: break; case -2: // Prev year if (!self.params.compressedHeader) { if (year > self.params.minYear) { date.setOtherFullYear(self.params.dateType, year - 1); } } break; case -1: // Prev month var day = date.getLocalDate(self.params.dateType); if (mon > 0) { var max = date.getLocalMonthDays(self.params.dateType, mon - 1); if (day > max) { date.setLocalDate(self.params.dateType, max); } date.setLocalMonth(self.params.dateType, mon - 1); } else if (year-- > self.params.minYear) { date.setOtherFullYear(self.params.dateType, year); var max = date.getLocalMonthDays(self.params.dateType, 11); if (day > max) { date.setLocalDate(self.params.dateType, max); } date.setLocalMonth(self.params.dateType, 11); } break; case 1: // Next month var day = date.getLocalDate(self.params.dateType); if (mon < 11) { var max = date.getLocalMonthDays(self.params.dateType, mon + 1); if (day > max) { date.setLocalDate(self.params.dateType, max); } date.setLocalMonth(self.params.dateType, mon + 1); } else if (year < self.params.maxYear) { date.setOtherFullYear(self.params.dateType, year + 1); var max = date.getLocalMonthDays(self.params.dateType, 0); if (day > max) { date.setLocalDate(self.params.dateType, max); } date.setLocalMonth(self.params.dateType, 0); } break; case 2: // Next year if (!self.params.compressedHeader) if (year < self.params.maxYear) { date.setOtherFullYear(self.params.dateType, year + 1); } break; case 0: // Today break; } if (!date.equalsTo(self.date)) { this.setDate(date); newdate = true; } else if (el.navtype === 0) { newdate = closing = true; } } if (newdate) { if (self.params.showsTime) { this.dateClicked = false; } ev && this.callHandler(); } el.classList.remove("hilite"); if (closing && !self.params.showsTime) { self.dateClicked = false; ev && this.close(); } }; /** Method to handle keyboard click events **/ JoomlaCalendar.prototype._handleCalKeyEvent = function (ev) { var self = this, K = ev.keyCode; // Get value from input if (ev.target === this.inputField && (K === 13 || K === 9)) { this.close(); } if (self.params.direction === 'rtl') { if (K === 37) { K = 39; } else if (K === 39) { K = 37; } } if (K === 32) { // KEY Shift + space (now) if (ev.shiftKey) { ev.preventDefault(); this.cellClick(self._nav_now, ev); self.close(); } } if (K === 27) { // KEY esc (close); this.close(); } if (K === 38) { // KEY up (previous week) this.moveCursorBy(7); } if (K === 40) { // KEY down (next week) this.moveCursorBy( -7); } if (K === 37) { // KEY left (previous day) this.moveCursorBy(1); } if (K === 39) { // KEY right (next day) this.moveCursorBy( -1); } if (ev.target === this.inputField && !(K>48 || K<57 || K===186 || K===189 || K===190 || K===32)) { return stopCalEvent(ev); } }; /** Method to create the html structure of the calendar */ JoomlaCalendar.prototype._create = function () { var self = this, parent = this.element, table = createElement("table"), div = createElement("div"); this.table = table; table.className = 'table'; table.cellSpacing = 0; table.cellPadding = 0; table.style.marginBottom = 0; this.dropdownElement = div; parent.appendChild(div); if (this.params.direction) { div.style.direction = this.params.direction; } div.className = 'js-calendar'; div.style.position = "absolute"; div.style.boxShadow = "0px 0px 70px 0px rgba(0,0,0,0.67)"; div.style.minWidth = this.inputField.width; div.style.padding = '0'; div.style.display = "none"; div.style.left = "auto"; div.style.top = "auto"; div.style.zIndex = 1060; div.style.borderRadius = "20px"; this.wrapper = createElement('div'); this.wrapper.className = 'calendar-container'; div.appendChild(this.wrapper); this.wrapper.appendChild(table); var thead = createElement("thead", table); thead.className = 'calendar-header'; var cell = null, row = null, cal = this, hh = function (text, cs, navtype, node, styles, classes, attributes) { node = node ? node : "td"; styles = styles ? styles : {}; cell = createElement(node, row); if (cs) { classes = classes ? 'class="' + classes + '"' : ''; cell.colSpan = cs; } for (var key in styles) { cell.style[key] = styles[key]; } for (var key in attributes) { cell.setAttribute(key, attributes[key]); } if (navtype !== 0 && Math.abs(navtype) <= 2) { cell.className += " nav"; } if (cs) { cell.addEventListener("mousedown", self._dayMouseDown, true); } cell.calendar = cal; cell.navtype = navtype; if (navtype !== 0 && Math.abs(navtype) <= 2) { cell.innerHTML = "" + text + ""; } else { cell.innerHTML = cs ? "
" + text + "
" : text; if (!cs && classes) { cell.className = classes; } } return cell; }; if (this.params.compressedHeader === false) { // Head - year row = createElement("tr", thead); row.className = "calendar-head-row"; this._nav_py = hh("‹", 1, -2, '', {"text-align": "center", "font-size": "18px", "line-height": "18px"}, 'js-btn btn-prev-year'); // Previous year button this.title = hh('
', this.params.weekNumbers ? 6 : 5, 300); this.title.className = "title"; this._nav_ny = hh(" ›", 1, 2, '', {"text-align": "center", "font-size": "18px", "line-height": "18px"}, 'js-btn btn-next-year'); // Next year button } row = createElement("tr", thead); // Head - month row.className = "calendar-head-row"; this._nav_pm = hh("‹", 1, -1, '', {"text-align": "center", "font-size": "2em", "line-height": "1em"}, 'js-btn btn-prev-month'); // Previous month button this._nav_month = hh('
', this.params.weekNumbers ? 6 : 5, 888, 'td', {'textAlign': 'center'}); this._nav_month.className = "title"; this._nav_nm = hh(" ›", 1, 1, '', {"text-align": "center", "font-size": "2em", "line-height": "1em"}, 'js-btn btn-next-month'); // Next month button row = createElement("tr", thead); // day names row.className = self.params.weekNumbers ? "daynames wk" : "daynames"; if (this.params.weekNumbers) { cell = createElement("td", row); cell.className = "day-name wn"; cell.innerHTML = JoomlaCalLocale.wk; } for (var i = 7; i > 0; --i) { cell = createElement("td", row); if (!i) { cell.calendar = self; } } this.firstdayname = (this.params.weekNumbers) ? row.firstChild.nextSibling : row.firstChild; var fdow = this.params.firstDayOfWeek, cell = this.firstdayname, weekend = JoomlaCalLocale.weekend; for (var i = 0; i < 7; ++i) { var realday = (i + fdow) % 7; cell.classList.add("day-name"); this.params.weekNumbers ? cell.classList.add('day-name-week') : ''; if (i) { cell.calendar = self; cell.fdow = realday; } if (weekend.indexOf(weekend) !== -1) { cell.classList.add("weekend"); } cell.innerHTML = JoomlaCalLocale.shortDays[(i + fdow) % 7]; cell = cell.nextSibling; } var tbody = createElement("tbody", table); this.tbody = tbody; for (i = 6; i > 0; --i) { row = createElement("tr", tbody); if (this.params.weekNumbers) { cell = createElement("td", row); } for (var j = 7; j > 0; --j) { cell = createElement("td", row); cell.calendar = this; cell.addEventListener("mousedown", this._dayMouseDown, true); } } if (this.params.showsTime) { row = createElement("tr", tbody); row.className = "time"; cell = createElement("td", row); cell.className = "time time-title"; cell.colSpan = 1; cell.style.verticalAlign = 'middle'; cell.innerHTML = " "; var cell1 = createElement("td", row); cell1.className = "time hours-select"; cell1.colSpan = 2; var cell2 = createElement("td", row); cell2.className = "time minutes-select"; cell2.colSpan = 2; (function () { function makeTimePart(className, selected, range_start, range_end, cellTml) { var part = createElement("select", cellTml), num; part.calendar = self; part.className = className; part.setAttribute('data-chosen', true); // avoid Chosen, hack part.style.width = '100%'; part.navtype = 50; part._range = []; for (var i = range_start; i <= range_end; ++i) { var txt, selAttr = ''; if (i === selected) { selAttr = true; } if (i < 10 && range_end >= 10) { num = '0' + i; txt = Date.convertNumbers('0') + Date.convertNumbers(i); } else { num = '' + i; txt = '' + Date.convertNumbers(i); } part.options.add(new Option(txt, num, selAttr, selAttr)); } return part; } var hrs = self.date.getHours(), mins = self.date.getMinutes(), t12 = !self.params.time24, pm = (self.date.getHours() > 12); if (t12 && pm) { hrs -= 12; } var H = makeTimePart("time time-hours", hrs, t12 ? 1 : 0, t12 ? 12 : 23, cell1), M = makeTimePart("time time-minutes", mins, 0, 59, cell2), AP = null; cell = createElement("td", row); cell.className = "time ampm-select"; cell.colSpan = self.params.weekNumbers ? 1 : 2; if (t12) { var selAttr = true, altDate = Date.parseFieldDate(self.inputField.getAttribute('data-alt-value'), self.params.dateFormat, 'gregorian'); pm = (altDate.getHours() >= 12); var part = createElement("select", cell); part.className = "time-ampm"; part.style.width = '100%'; part.options.add(new Option(JoomlaCalLocale.PM, "pm", pm ? selAttr : '', pm ? selAttr : '')); part.options.add(new Option(JoomlaCalLocale.AM, "am", pm ? '' : selAttr, pm ? '' : selAttr)); AP = part; // Event listener for the am/pm select AP.addEventListener("change", function (event) { self.updateTime(event.target.parentNode.parentNode.childNodes[1].childNodes[0].value, event.target.parentNode.parentNode.childNodes[2].childNodes[0].value, event.target.parentNode.parentNode.childNodes[3].childNodes[0].value); }, false); } else { cell.innerHTML = " "; cell.colSpan = self.params.weekNumbers ? 3 : 2; } H.addEventListener("change", function (event) { self.updateTime(event.target.parentNode.parentNode.childNodes[1].childNodes[0].value, event.target.parentNode.parentNode.childNodes[2].childNodes[0].value, event.target.parentNode.parentNode.childNodes[3].childNodes[0].value); }, false); M.addEventListener("change", function (event) { self.updateTime(event.target.parentNode.parentNode.childNodes[1].childNodes[0].value, event.target.parentNode.parentNode.childNodes[2].childNodes[0].value, event.target.parentNode.parentNode.childNodes[3].childNodes[0].value); }, false); })(); } row = createElement("div", this.wrapper); row.className = "buttons-wrapper btn-group"; this._nav_clear = hh(JoomlaCalLocale.clear, '', 100, 'button', '', 'js-btn btn btn-clear', {"type": "button", "data-action": "clear"}); var cleara = row.querySelector('[data-action="clear"]'); cleara.addEventListener("click", function (e) { e.preventDefault(); var days = self.table.querySelectorAll('td'); for (var i = 0; i < days.length; i++) { if (days[i].classList.contains('selected')) { days[i].classList.remove('selected'); break; } } self.inputField.setAttribute('data-alt-value', "0000-00-00 00:00:00"); self.inputField.setAttribute('value', ''); self.inputField.value = ''; }); if (this.params.showsTodayBtn) { this._nav_now = hh(JoomlaCalLocale.today, '', 0, 'button', '', 'js-btn btn btn-today', {"type": "button", "data-action": "today"}); var todaya = this.wrapper.querySelector('[data-action="today"]'); todaya.addEventListener('click', function (e) { e.preventDefault(); self.date.setLocalDateOnly('gregorian', new Date()); // TODAY self.dateClicked = true; self.callHandler(); self.close(); }); } this._nav_exit = hh(JoomlaCalLocale.exit, '', 999, 'button', '', 'js-btn btn btn-exit', {"type": "button", "data-action": "exit"}); var exita = this.wrapper.querySelector('[data-action="exit"]'); exita.addEventListener('click', function (e) { e.preventDefault(); if (!self.dateClicked) { if (self.inputField.value) { if (self.params.dateType !== 'gregorian') { self.inputField.setAttribute('data-local-value', self.inputField.value); } if (typeof self.dateClicked === 'undefined') { // value needs to be validated self.inputField.setAttribute('data-alt-value', Date.parseFieldDate(self.inputField.value, self.params.dateFormat, self.params.dateType) .print(self.params.dateFormat, 'gregorian', false)); } else { self.inputField.setAttribute('data-alt-value', self.date.print(self.params.dateFormat, 'gregorian', false)); } } else { self.inputField.setAttribute('data-alt-value', '0000-00-00 00:00:00'); } self.date = Date.parseFieldDate(self.inputField.getAttribute('data-alt-value'), self.params.dateFormat, self.params.dateType); } self.close(); }); this.processCalendar(); }; /** Method to append numbers to the calendar table */ JoomlaCalendar.prototype.processCalendar = function () { this.table.style.visibility = "hidden"; var firstDayOfWeek = this.params.firstDayOfWeek, date = this.date, today = new Date(), TY = today.getLocalFullYear(this.params.dateType), TM = today.getLocalMonth(this.params.dateType), TD = today.getLocalDate(this.params.dateType), year = date.getOtherFullYear(this.params.dateType), hrs = date.getHours(), mins = date.getMinutes(), secs = date.getSeconds(), t12 = !this.params.time24; if (year < this.params.minYear) { // Check min,max year year = this.params.minYear; date.getOtherFullYear(this.params.dateType, year); } else if (year > this.params.maxYear) { year = this.params.maxYear; date.getOtherFullYear(this.params.dateType, year); } this.params.firstDayOfWeek = firstDayOfWeek; this.date = new Date(date); var month = date.getLocalMonth(this.params.dateType); var mday = date.getLocalDate(this.params.dateType); // Compute the first day that would actually be displayed in the calendar, even if it's from the previous month. date.setLocalDate(this.params.dateType, 1); var day1 = (date.getLocalDay(this.params.dateType) - this.params.firstDayOfWeek) % 7; if (day1 < 0) { day1 += 7; } date.setLocalDate(this.params.dateType, - day1); date.setLocalDate(this.params.dateType, date.getLocalDate(this.params.dateType) + 1); var row = this.tbody.firstChild, ar_days = this.ar_days = new Array(), weekend = JoomlaCalLocale.weekend, monthDays = parseInt(date.getLocalWeekDays(this.params.dateType)); /** Fill the table **/ for (var i = 0; i < monthDays; ++i, row = row.nextSibling) { var cell = row.firstChild; if (this.params.weekNumbers) { cell.className = "day wn"; cell.innerHTML = date.getLocalWeekNumber(this.params.dateType); //date.convertNumbers(); cell = cell.nextSibling; } row.className = this.params.weekNumbers ? "daysrow wk" : "daysrow"; var hasdays = false, iday, dpos = ar_days[i] = [], totalDays = monthDays + 1; for (var j = 0; j < totalDays; ++j, cell = cell.nextSibling, date.setLocalDate(this.params.dateType, iday + 1)) { cell.className = "day"; cell.style['textAlign'] = 'center'; iday = date.getLocalDate(this.params.dateType); var wday = date.getLocalDay(this.params.dateType); cell.pos = i << 4 | j; dpos[j] = cell; var current_month = (date.getLocalMonth(this.params.dateType) === month); if (!current_month) { if (this.params.showsOthers) { cell.className += " disabled othermonth "; cell.otherMonth = true; } else { cell.className += " emptycell"; cell.innerHTML = " "; cell.disabled = true; continue; } } else { cell.otherMonth = false; hasdays = true; cell.style.cursor = "pointer"; } cell.disabled = false; cell.innerHTML = this.params.debug ? iday : Date.convertNumbers(iday); // translated day number for each cell if (!cell.disabled) { cell.caldate = new Date(date); if (current_month && iday === mday) { cell.className += " selected"; this.currentDateEl = cell; } if (date.getLocalFullYear(this.params.dateType) === TY && date.getLocalMonth(this.params.dateType) === TM && iday === TD) { cell.className += " today"; } if (weekend.indexOf(wday) !== -1) cell.className += " weekend"; } } if (!(hasdays || this.params.showsOthers)) { row.style.display = 'none'; row.className = "emptyrow"; } else { row.style.display = ''; } } /* Set the time */ if (this.params.showsTime) { if (hrs > 12 && t12) { hrs -= 12; } hrs = (hrs < 10) ? "0" + hrs : hrs; mins = (mins < 10) ? "0" + mins : mins; var hoursEl = this.table.querySelector('.time-hours'), minsEl = this.table.querySelector('.time-minutes'); /* remove the selected class for the hours*/ this.resetSelected(hoursEl); if (!this.params.time24) { hoursEl.value = (hrs == "00") ? "12" : hrs; } else { hoursEl.value = hrs; } /* remove the selected class for the minutes*/ this.resetSelected(minsEl); minsEl.value = mins; if (!this.params.time24) { var dateAlt = new Date(this.inputField.getAttribute('data-alt-value')), ampmEl = this.table.querySelector('.time-ampm'), hrsAlt = dateAlt.getHours(); if (hrsAlt > 12) { /* remove the selected class for the am-pm*/ this.resetSelected(ampmEl); ampmEl.value = 'pm'; } } } if (!this.params.compressedHeader) { this._nav_month.getElementsByTagName('span')[0].innerHTML = this.params.debug ? month + ' ' + JoomlaCalLocale.months[month] : JoomlaCalLocale.months[month]; this.title.getElementsByTagName('span')[0].innerHTML = this.params.debug ? year + ' ' + Date.convertNumbers(year.toString()) : Date.convertNumbers(year.toString()); } else { var tmpYear = Date.convertNumbers(year.toString()); this._nav_month.getElementsByTagName('span')[0].innerHTML = !this.params.monthBefore ? JoomlaCalLocale.months[month] + ' - ' + tmpYear : tmpYear + ' - ' + JoomlaCalLocale.months[month] ; } this.table.style.visibility = "visible"; }; /** Method to listen for the click event on the input button. **/ JoomlaCalendar.prototype._bindEvents = function () { var self = this; this.inputField.addEventListener('blur', function(event) { var calObj = JoomlaCalendar.getCalObject(this)._joomlaCalendar; // If calendar is open we will handle the event elsewhere if (calObj.dropdownElement.style.display === 'block') { event.preventDefault(); return; } if (calObj) { if (calObj.inputField.value) { if (typeof calObj.params.dateClicked === 'undefined') { calObj.inputField.setAttribute('data-local-value', calObj.inputField.value); if (calObj.params.dateType !== 'gregorian') { // We need to transform the date for the data-alt-value var ndate, date = Date.parseFieldDate(calObj.inputField.value, calObj.params.dateFormat, calObj.params.dateType); ndate = Date.localCalToGregorian(date.getFullYear(), date.getMonth(), date.getDate()); date.setFullYear(ndate[0]); date.setMonth(ndate[1]); date.setDate(ndate[2]); calObj.inputField.setAttribute('data-alt-value', date.print(calObj.params.dateFormat, 'gregorian', false)); } else { calObj.inputField.setAttribute('data-alt-value', Date.parseFieldDate(calObj.inputField.value, calObj.params.dateFormat, calObj.params.dateType) .print(calObj.params.dateFormat, 'gregorian', false)); } } else { calObj.inputField.setAttribute('data-alt-value', calObj.date.print(calObj.params.dateFormat, 'gregorian', false)); } } else { calObj.inputField.setAttribute('data-alt-value', '0000-00-00 00:00:00'); } calObj.date = Date.parseFieldDate(calObj.inputField.getAttribute('data-alt-value'), calObj.params.dateFormat, calObj.params.dateType); } self.close(); }, true); this.button.addEventListener('click', function() { self.show(); }, false); }; /** Helpers **/ var stopCalEvent = function (ev) { ev || (ev = window.event); ev.preventDefault(); ev.stopPropagation(); return false; }; var createElement = function (type, parent) { var el = null; el = document.createElement(type); if (typeof parent !== "undefined") { parent.appendChild(el); } return el; }; var isInt = function (input) { return !isNaN(input) && (function(x) { return (x | 0) === x; })(parseFloat(input)) }; var getBoundary = function (input, type) { var date = new Date(); var y = date.getLocalFullYear(type); return y + input; }; /** * IE8 polyfill for indexOf() */ if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(elt) { var len = this.length >>> 0, from = Number(arguments[1]) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) { from += len; } for (; from < len; from++) { if (from in this && this[from] === elt) { return from; } } return -1; }; } /** Method to get the active calendar element through any descendant element. */ JoomlaCalendar.getCalObject = function(element) { if (!element) { return false; } while (element.parentNode) { element = element.parentNode; if (element.classList.contains('field-calendar')) { return element; } } return false; }; /** Method to change input values with the data-alt-value values. **/ JoomlaCalendar.prototype.setAltValue = function() { var input = this.inputField; if (input.getAttribute('disabled')) return; input.value = input.getAttribute('data-alt-value') ? input.getAttribute('data-alt-value') : ''; }; /** Method to change the inputs before submit. **/ JoomlaCalendar.onSubmit = function() { Joomla = window.Joomla || {}; if (!Joomla.calendarProcessed) { Joomla.calendarProcessed = true; var elements = document.querySelectorAll(".field-calendar"); for (var i = 0; i < elements.length; i++) { var element = elements[i], instance = element._joomlaCalendar; if (instance) { instance.setAltValue(); } } } }; /** * Init the Calendars on the page * * @param {Node} element The element node * @param {HTMLElement} container The field container (optional) */ JoomlaCalendar.init = function (element, container) { // Fall back for translation strings window.JoomlaCalLocale = window.JoomlaCalLocale ? JoomlaCalLocale : {}; JoomlaCalLocale.today = JoomlaCalLocale.today ? JoomlaCalLocale.today : 'today'; JoomlaCalLocale.weekend = JoomlaCalLocale.weekend ? JoomlaCalLocale.weekend : [0, 6]; JoomlaCalLocale.localLangNumbers = JoomlaCalLocale.localLangNumbers ? JoomlaCalLocale.localLangNumbers : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; JoomlaCalLocale.wk = JoomlaCalLocale.wk ? JoomlaCalLocale.wk : 'wk'; JoomlaCalLocale.AM = JoomlaCalLocale.AM ? JoomlaCalLocale.AM : 'AM'; JoomlaCalLocale.PM = JoomlaCalLocale.PM ? JoomlaCalLocale.PM : 'PM'; JoomlaCalLocale.am = JoomlaCalLocale.am ? JoomlaCalLocale.am : 'am'; JoomlaCalLocale.pm = JoomlaCalLocale.pm ? JoomlaCalLocale.pm : 'pm'; JoomlaCalLocale.dateType = JoomlaCalLocale.dateType ? JoomlaCalLocale.dateType : 'gregorian'; JoomlaCalLocale.time = JoomlaCalLocale.time ? JoomlaCalLocale.time : 'time'; JoomlaCalLocale.days = JoomlaCalLocale.days ? JoomlaCalLocale.days : '["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]'; JoomlaCalLocale.shortDays = JoomlaCalLocale.shortDays ? JoomlaCalLocale.shortDays : ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]; JoomlaCalLocale.months = JoomlaCalLocale.months ? JoomlaCalLocale.months : ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; JoomlaCalLocale.shortMonths = JoomlaCalLocale.shortMonths ? JoomlaCalLocale.shortMonths : ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; JoomlaCalLocale.minYear = JoomlaCalLocale.minYear ? JoomlaCalLocale.minYear : 1900; JoomlaCalLocale.maxYear = JoomlaCalLocale.maxYear ? JoomlaCalLocale.maxYear : 2100; JoomlaCalLocale.exit = JoomlaCalLocale.exit ? JoomlaCalLocale.exit : 'Cancel'; JoomlaCalLocale.clear = JoomlaCalLocale.clear ? JoomlaCalLocale.clear : 'Clear'; var instance = element._joomlaCalendar; if (!instance) { new JoomlaCalendar(element); } else { instance.recreate(); } if (element && element.getElementsByTagName('input')[0] && element.getElementsByTagName('input')[0].form && !element.getElementsByTagName('input')[0].disabled) { element.getElementsByTagName('input')[0].form.addEventListener('submit', JoomlaCalendar.onSubmit); } }; window.JoomlaCalendar = JoomlaCalendar; /** Instantiate all the calendar fields when the document is ready */ document.addEventListener("DOMContentLoaded", function() { var elements, i; elements = document.querySelectorAll(".field-calendar"); for (i = 0; i < elements.length; i++) { JoomlaCalendar.init(elements[i]); } window.jQuery && jQuery(document).on("subform-row-add", function (event, row) { elements = row.querySelectorAll(".field-calendar"); for (i = 0; i < elements.length; i++) { JoomlaCalendar.init(elements[i]); } }); /** B/C related code * @deprecated 4.0 */ window.Calendar = {}; /** B/C related code * @deprecated 4.0 */ Calendar.setup = function(obj) { if (obj.inputField && document.getElementById(obj.inputField)) { var element = document.getElementById(obj.inputField), cal = element.parentNode.querySelectorAll('button')[0]; for (var property in obj) { if (obj.hasOwnProperty(property)) { switch (property) { case 'ifFormat': if (cal) cal.setAttribute('data-dayformat', obj.ifFormat); break; case 'firstDay': if (cal) cal.setAttribute('data-firstday', parseInt(obj.firstDay)); break; case 'weekNumbers': if (cal) cal.setAttribute('data-week-numbers', (obj.weekNumbers === "true" || obj.weekNumbers === true) ? '1' : '0'); break; case 'showOthers': if (cal) cal.setAttribute('data-show-others', (obj.showOthers === "true" || obj.showOthers === true) ? '1' : '0'); break; case 'showsTime': if (cal) cal.setAttribute('data-show-time', (obj.showsTime === "true" || obj.showsTime === true) ? '1' : '0'); break; case 'timeFormat': if (cal) cal.setAttribute('data-time-24', parseInt(obj.timeFormat)); break; case 'displayArea': case 'inputField': case 'button': case 'eventName': case 'daFormat': case 'disableFunc': case 'dateStatusFunc': case 'dateTooltipFunc': case 'dateText': case 'align': case 'range': case 'flat': case 'flatCallback': case 'onSelect': case 'onClose': case 'onUpdate': case 'date': case 'electric': case 'step': case 'position': case 'cache': case 'multiple': break; } } } JoomlaCalendar.init(element.parentNode.parentNode); } return null; }; }); })(window, document);