/* * More info at: http://phpjs.org * * This is version: 3.18 * php.js is copyright 2010 Kevin van Zonneveld. * * Portions copyright Brett Zamir (http://brett-zamir.me), Kevin van Zonneveld * (http://kevin.vanzonneveld.net), Onno Marsman, Theriault, Michael White * (http://getsprink.com), Waldo Malqui Silva, Paulo Freitas, Jonas Raoni * Soares Silva (http://www.jsfromhell.com), Jack, Philip Peterson, Ates Goral * (http://magnetiq.com), Legaev Andrey, Ratheous, Alex, Martijn Wieringa, * Nate, lmeyrick (https://sourceforge.net/projects/bcmath-js/), Philippe * Baumann, Enrique Gonzalez, Webtoolkit.info (http://www.webtoolkit.info/), * Ash Searle (http://hexmen.com/blog/), travc, Jani Hartikainen, Carlos R. L. * Rodrigues (http://www.jsfromhell.com), Ole Vrijenhoek, WebDevHobo * (http://webdevhobo.blogspot.com/), T.Wild, * http://stackoverflow.com/questions/57803/how-to-convert-decimal-to-hex-in-javascript, * pilus, GeekFG (http://geekfg.blogspot.com), Rafał Kukawski * (http://blog.kukawski.pl), Johnny Mast (http://www.phpvrouwen.nl), Michael * Grier, Erkekjetter, d3x, marrtins, Andrea Giammarchi * (http://webreflection.blogspot.com), stag019, mdsjack * (http://www.mdsjack.bo.it), Chris, Steven Levithan * (http://blog.stevenlevithan.com), Arpad Ray (mailto:arpad@php.net), David, * Joris, Tim de Koning (http://www.kingsquare.nl), Marc Palau, Michael White, * Public Domain (http://www.json.org/json2.js), gettimeofday, felix, Aman * Gupta, Pellentesque Malesuada, Thunder.m, Tyler Akins (http://rumkin.com), * Karol Kowalski, Felix Geisendoerfer (http://www.debuggable.com/felix), * Alfonso Jimenez (http://www.alfonsojimenez.com), Diplom@t * (http://difane.com/), majak, Mirek Slugen, Mailfaker * (http://www.weedem.fr/), Breaking Par Consulting Inc * (http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CFB006C45F7), * Josh Fraser * (http://onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/), * Martin (http://www.erlenwiese.de/), Paul Smith, KELAN, Robin, saulius, AJ, * Oleg Eremeev, Steve Hilder, gorthaur, Kankrelune * (http://www.webfaktory.info/), Caio Ariede (http://caioariede.com), Lars * Fischer, Sakimori, Imgen Tata (http://www.myipdf.com/), uestla, Artur * Tchernychev, Wagner B. Soares, Christoph, nord_ua, class_exists, Der Simon * (http://innerdom.sourceforge.net/), echo is bad, XoraX * (http://www.xorax.info), Ozh, Alan C, Taras Bogach, Brad Touesnard, MeEtc * (http://yass.meetcweb.com), Peter-Paul Koch * (http://www.quirksmode.org/js/beat.html), T0bsn, Tim Wiel, Bryan Elliott, * jpfle, JT, Thomas Beaucourt (http://www.webapp.fr), David Randall, Frank * Forte, Eugene Bulkin (http://doubleaw.com/), noname, kenneth, Hyam Singer * (http://www.impact-computing.com/), Marco, Raphael (Ao RUDLER), Ole * Vrijenhoek (http://www.nervous.nl/), David James, Steve Clay, Jason Wong * (http://carrot.org/), T. Wild, Paul, J A R, LH, strcasecmp, strcmp, JB, * Daniel Esteban, strftime, madipta, Valentina De Rosa, Marc Jansen, * Francesco, Stoyan Kyosev (http://www.svest.org/), metjay, Soren Hansen, * 0m3r, Sanjoy Roy, Shingo, sankai, sowberry, hitwork, Rob, Norman "zEh" * Fuchs, Subhasis Deb, josh, Yves Sucaet, Ulrich, Scott Baker, ejsanders, * Nick Callen, Steven Levithan (stevenlevithan.com), Aidan Lister * (http://aidanlister.com/), Philippe Jausions * (http://pear.php.net/user/jausions), Zahlii, Denny Wardhana, Oskar Larsson * Högfeldt (http://oskar-lh.name/), Brian Tafoya * (http://www.premasolutions.com/), johnrembo, Gilbert, duncan, Thiago Mata * (http://thiagomata.blog.com), Alexander Ermolaev * (http://snippets.dzone.com/user/AlexanderErmolaev), Linuxworld, lmeyrick * (https://sourceforge.net/projects/bcmath-js/this.), Jon Hohle, Pyerre, * merabi, Saulo Vallory, HKM, ChaosNo1, djmix, Lincoln Ramsay, Adam Wallner * (http://web2.bitbaro.hu/), paulo kuong, jmweb, Orlando, kilops, dptr1988, * DxGx, Pedro Tainha (http://www.pedrotainha.com), Bayron Guevara, Le Torbi, * James, Douglas Crockford (http://javascript.crockford.com), Devan * Penner-Woelk, Jay Klehr, Kheang Hok Chin (http://www.distantia.ca/), Luke * Smith (http://lucassmith.name), Rival, Amir Habibi * (http://www.residence-mixte.com/), Blues (http://tech.bluesmoon.info/), Ben * Bryan, booeyOH, Dreamer, Cagri Ekin, Diogo Resende, Howard Yeend, Pul, * 3D-GRAF, jakes, Yannoo, Luke Godfrey, daniel airton wermann * (http://wermann.com.br), Allan Jensen (http://www.winternet.no), Benjamin * Lupton, davook, Atli Þór, Maximusya, Leslie Hoare, Bug?, setcookie, YUI * Library: http://developer.yahoo.com/yui/docs/YAHOO.util.DateLocale.html, * Blues at http://hacks.bluesmoon.info/strftime/strftime.js, Andreas, * Michael, Christian Doebler, Gabriel Paderni, Marco van Oort, Philipp * Lenssen, Arnout Kazemier (http://www.3rd-Eden.com), penutbutterjelly, Anton * Ongson, DtTvB (http://dt.in.th/2008-09-16.string-length-in-bytes.html), * meo, Greenseed, Yen-Wei Liu, mk.keck, William, rem, Jamie Beck * (http://www.terabit.ca/), Russell Walker (http://www.nbill.co.uk/), * Garagoth, Dino, Andrej Pavlovic, gabriel paderni, FGFEmperor, Scott Cariss, * Slawomir Kaniecki, ReverseSyntax, Mateusz "loonquawl" Zalega, Francois, * Kirk Strobeck, Billy, vlado houba, Jalal Berrami, date, Itsacon * (http://www.itsacon.net/), Martin Pool, Pierre-Luc Paour, ger, john * (http://www.jd-tech.net), mktime, Simon Willison * (http://simonwillison.net), Nick Kolosov (http://sammy.ru), marc andreu, * Arno, Nathan, Kristof Coomans (SCK-CEN Belgian Nucleair Research Centre), * Fox, nobbler, stensi, Matteo, Riddler (http://www.frontierwebdev.com/), * Tomasz Wesolowski, T.J. Leahy, rezna, Eric Nagel, Alexander M Beedie, baris * ozdil, Greg Frazier, Bobby Drake, Ryan W Tenney (http://ryan.10e.us), Tod * Gentille, Rafał Kukawski, FremyCompany, Manish, Cord, fearphage * (http://http/my.opera.com/fearphage/), Victor, Brant Messenger * (http://www.brantmessenger.com/), Matt Bradley, Luis Salazar * (http://www.freaky-media.com/), Tim de Koning, taith, Rick Waldron, Mick@el * * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL KEVIN VAN ZONNEVELD BE LIABLE FOR ANY CLAIM, DAMAGES * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ this.strtotime = function(str, now) { // http://kevin.vanzonneveld.net // + original by: Caio Ariede (http://caioariede.com) // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + input by: David // + improved by: Caio Ariede (http://caioariede.com) // + improved by: Brett Zamir (http://brett-zamir.me) // + bugfixed by: Wagner B. Soares // + bugfixed by: Artur Tchernychev // % note 1: Examples all have a fixed timestamp to prevent tests to fail because of variable time(zones) // * example 1: strtotime('+1 day', 1129633200); // * returns 1: 1129719600 // * example 2: strtotime('+1 week 2 days 4 hours 2 seconds', 1129633200); // * returns 2: 1130425202 // * example 3: strtotime('last month', 1129633200); // * returns 3: 1127041200 // * example 4: strtotime('2009-05-04 08:30:00'); // * returns 4: 1241418600 var i, match, s, strTmp = '', parse = ''; strTmp = str; strTmp = strTmp.replace(/\s{2,}|^\s|\s$/g, ' '); // unecessary spaces strTmp = strTmp.replace(/[ \r\n]/g, ''); // unecessary chars if (strTmp == 'now') { return (new Date()).getTime()/1000; // Return seconds, not milli-seconds } else if (!isNaN(parse = Date.parse(strTmp))) { return (parse/1000); } else if (now) { now = new Date(now*1000); // Accept PHP-style seconds } else { now = new Date(); } strTmp = strTmp.toLowerCase(); var __is = { day: { 'sun': 0, 'mon': 1, 'tue': 2, 'wed': 3, 'thu': 4, 'fri': 5, 'sat': 6 }, mon: { 'jan': 0, 'feb': 1, 'mar': 2, 'apr': 3, 'may': 4, 'jun': 5, 'jul': 6, 'aug': 7, 'sep': 8, 'oct': 9, 'nov': 10, 'dec': 11 } }; var process = function (m) { var ago = (m[2] && m[2] == 'ago'); var num = (num = m[0] == 'last' ? -1 : 1) * (ago ? -1 : 1); switch (m[0]) { case 'last': case 'next': switch (m[1].substring(0, 3)) { case 'yea': now.setFullYear(now.getFullYear() + num); break; case 'mon': now.setMonth(now.getMonth() + num); break; case 'wee': now.setDate(now.getDate() + (num * 7)); break; case 'day': now.setDate(now.getDate() + num); break; case 'hou': now.setHours(now.getHours() + num); break; case 'min': now.setMinutes(now.getMinutes() + num); break; case 'sec': now.setSeconds(now.getSeconds() + num); break; default: var day; if (typeof (day = __is.day[m[1].substring(0, 3)]) != 'undefined') { var diff = day - now.getDay(); if (diff == 0) { diff = 7 * num; } else if (diff > 0) { if (m[0] == 'last') {diff -= 7;} } else { if (m[0] == 'next') {diff += 7;} } now.setDate(now.getDate() + diff); } } break; default: if (/\d+/.test(m[0])) { num *= parseInt(m[0], 10); switch (m[1].substring(0, 3)) { case 'yea': now.setFullYear(now.getFullYear() + num); break; case 'mon': now.setMonth(now.getMonth() + num); break; case 'wee': now.setDate(now.getDate() + (num * 7)); break; case 'day': now.setDate(now.getDate() + num); break; case 'hou': now.setHours(now.getHours() + num); break; case 'min': now.setMinutes(now.getMinutes() + num); break; case 'sec': now.setSeconds(now.getSeconds() + num); break; } } else { return false; } break; } return true; }; match = strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/); if (match != null) { if (!match[2]) { match[2] = '00:00:00'; } else if (!match[3]) { match[2] += ':00'; } s = match[1].split(/-/g); for (i in __is.mon) { if (__is.mon[i] == s[1] - 1) { s[1] = i; } } s[0] = parseInt(s[0], 10); s[0] = (s[0] >= 0 && s[0] <= 69) ? '20'+(s[0] < 10 ? '0'+s[0] : s[0]+'') : (s[0] >= 70 && s[0] <= 99) ? '19'+s[0] : s[0]+''; return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2])+(match[4] ? match[4]/1000 : ''), 10); } var regex = '([+-]?\\d+\\s'+ '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+ '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday'+ '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday)'+ '|(last|next)\\s'+ '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+ '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday'+ '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday))'+ '(\\sago)?'; match = strTmp.match(new RegExp(regex, 'gi')); // Brett: seems should be case insensitive per docs, so added 'i' if (match == null) { return false; } for (i = 0; i < match.length; i++) { if (!process(match[i].split(' '))) { return false; } } return (now.getTime()/1000); }