/* 
 * More info at: http://phpjs.org
 * 
 * This is version: 2.71
 * php.js is copyright 2009 Kevin van Zonneveld.
 * 
 * Portions copyright Brett Zamir (http://brett-zamir.me), Kevin van Zonneveld
 * (http://kevin.vanzonneveld.net), Onno Marsman, Michael White
 * (http://getsprink.com), Waldo Malqui Silva, Paulo Ricardo F. Santos, Jack,
 * Philip Peterson, Jonas Raoni Soares Silva (http://www.jsfromhell.com),
 * Legaev Andrey, Ates Goral (http://magnetiq.com), Martijn Wieringa, Nate,
 * Enrique Gonzalez, Philippe Baumann, Webtoolkit.info
 * (http://www.webtoolkit.info/), Theriault, Jani Hartikainen, Ash Searle
 * (http://hexmen.com/blog/), Carlos R. L. Rodrigues
 * (http://www.jsfromhell.com), Ole Vrijenhoek, travc, Michael Grier, GeekFG
 * (http://geekfg.blogspot.com), Johnny Mast (http://www.phpvrouwen.nl), Alex,
 * d3x, stag019, Andrea Giammarchi (http://webreflection.blogspot.com),
 * marrtins, Erkekjetter, Steve Hilder, Oleg Eremeev, David, Marc Palau,
 * Steven Levithan (http://blog.stevenlevithan.com), gorthaur, Arpad Ray
 * (mailto:arpad@php.net), Public Domain (http://www.json.org/json2.js),
 * gettimeofday, mdsjack (http://www.mdsjack.bo.it), Thunder.m, Alfonso
 * Jimenez (http://www.alfonsojimenez.com), KELAN, Tyler Akins
 * (http://rumkin.com), Mirek Slugen, Kankrelune
 * (http://www.webfaktory.info/), Karol Kowalski, AJ, Lars Fischer, Caio
 * Ariede (http://caioariede.com), Aman Gupta, Sakimori, Pellentesque
 * Malesuada, 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/),
 * Paul, madipta, Douglas Crockford (http://javascript.crockford.com), Ole
 * Vrijenhoek (http://www.nervous.nl/), Hyam Singer
 * (http://www.impact-computing.com/), Raphael (Ao RUDLER), kenneth, T. Wild,
 * nobbler, class_exists, noname, Marco, David James, Steve Clay, marc andreu,
 * ger, john (http://www.jd-tech.net), mktime, Brad Touesnard, J A R, djmix,
 * Lincoln Ramsay, Linuxworld, Thiago Mata (http://thiagomata.blog.com),
 * Pyerre, Jon Hohle, Bayron Guevara, duncan, Sanjoy Roy, sankai, 0m3r, Felix
 * Geisendoerfer (http://www.debuggable.com/felix), Gilbert, Subhasis Deb,
 * Soren Hansen, T0bsn, Eugene Bulkin (http://doubleaw.com/), Der Simon
 * (http://innerdom.sourceforge.net/), JB, LH, Marc Jansen, Francesco, echo is
 * bad, XoraX (http://www.xorax.info), MeEtc (http://yass.meetcweb.com),
 * Peter-Paul Koch (http://www.quirksmode.org/js/beat.html), Nathan, Tim Wiel,
 * Ozh, David Randall, Bryan Elliott, Jalal Berrami, Arno, Rick Waldron,
 * Mick@el, rezna, Kirk Strobeck, Martin Pool, Daniel Esteban, Saulo Vallory,
 * Kristof Coomans (SCK-CEN Belgian Nucleair Research Centre), Pierre-Luc
 * Paour, Eric Nagel, Bobby Drake, penutbutterjelly, Christian Doebler,
 * setcookie, Gabriel Paderni, Simon Willison (http://simonwillison.net), Pul,
 * Luke Godfrey, Blues (http://tech.bluesmoon.info/), Anton Ongson, Jason Wong
 * (http://carrot.org/), Valentina De Rosa, sowberry, hitwork, Norman "zEh"
 * Fuchs, Yves Sucaet, johnrembo, Nick Callen, ejsanders, Aidan Lister
 * (http://aidanlister.com/), Philippe Jausions
 * (http://pear.php.net/user/jausions), dptr1988, Pedro Tainha
 * (http://www.pedrotainha.com), Alan C, uestla, Wagner B. Soares, T.Wild,
 * strcasecmp, strcmp, DxGx, Alexander Ermolaev
 * (http://snippets.dzone.com/user/AlexanderErmolaev), ChaosNo1, metjay, YUI
 * Library: http://developer.yahoo.com/yui/docs/YAHOO.util.DateLocale.html,
 * Blues at http://hacks.bluesmoon.info/strftime/strftime.js, taith, Robin,
 * Matt Bradley, Tim de Koning, Luis Salazar (http://www.freaky-media.com/),
 * FGFEmperor, baris ozdil, Tod Gentille, FremyCompany, Manish, Cord, Slawomir
 * Kaniecki, ReverseSyntax, Mateusz "loonquawl" Zalega, Scott Cariss,
 * Francois, Victor, stensi, vlado houba, date, gabriel paderni, Yannoo,
 * mk.keck, Leslie Hoare, Ben Bryan, Dino, Andrej Pavlovic, Andreas, DtTvB
 * (http://dt.in.th/2008-09-16.string-length-in-bytes.html), Russell Walker,
 * Garagoth, booeyOH, Cagri Ekin, Benjamin Lupton, davook, Atli Þór, jakes,
 * Allan Jensen (http://www.winternet.no), Howard Yeend, Kheang Hok Chin
 * (http://www.distantia.ca/), Luke Smith (http://lucassmith.name), Rival,
 * Diogo Resende
 * 
 * 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.
 */ 
 
 if ("undefined" == typeof PHPJS) {

	PHPJS = 1;


	function date(format, timestamp) {
		// http://kevin.vanzonneveld.net
		// +   original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
		// +      parts by: Peter-Paul Koch (http://www.quirksmode.org/js/beat.html)
		// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// +   improved by: MeEtc (http://yass.meetcweb.com)
		// +   improved by: Brad Touesnard
		// +   improved by: Tim Wiel
		// +   improved by: Bryan Elliott
		//
		// +   improved by: Brett Zamir (http://brett-zamir.me)
		// +   improved by: David Randall
		// +      input by: Brett Zamir (http://brett-zamir.me)
		// +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// +   improved by: Brett Zamir (http://brett-zamir.me)
		// +   improved by: Brett Zamir (http://brett-zamir.me)
		// +   improved by: Theriault
		// +  derived from: gettimeofday
		// +      input by: majak
		// +   bugfixed by: majak
		// +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// +      input by: Alex
		// +   bugfixed by: Brett Zamir (http://brett-zamir.me)
		// +   improved by: Theriault
		// +   improved by: Brett Zamir (http://brett-zamir.me)
		// +   improved by: Theriault
		// +   improved by: Thomas Beaucourt (http://www.webapp.fr)
		// +   improved by: JT
		// +   improved by: Theriault
		// +   improved by: Rafał Kukawski (http://blog.kukawski.pl)
		// %        note 1: Uses global: php_js to store the default timezone
		// %        note 2: Although the function potentially allows timezone info (see notes), it currently does not set
		// %        note 2: per a timezone specified by date_default_timezone_set(). Implementers might use
		// %        note 2: this.php_js.currentTimezoneOffset and this.php_js.currentTimezoneDST set by that function
		// %        note 2: in order to adjust the dates in this function (or our other date functions!) accordingly
		// *     example 1: date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400);
		// *     returns 1: '09:09:40 m is month'
		// *     example 2: date('F j, Y, g:i a', 1062462400);
		// *     returns 2: 'September 2, 2003, 2:26 am'
		// *     example 3: date('Y W o', 1062462400);
		// *     returns 3: '2003 36 2003'
		// *     example 4: x = date('Y m d', (new Date()).getTime()/1000); 
		// *     example 4: (x+'').length == 10 // 2009 01 09
		// *     returns 4: true
		// *     example 5: date('W', 1104534000);
		// *     returns 5: '53'
		// *     example 6: date('B t', 1104534000);
		// *     returns 6: '999 31'
		// *     example 7: date('W U', 1293750000.82); // 2010-12-31
		// *     returns 7: '52 1293750000'
		// *     example 8: date('W', 1293836400); // 2011-01-01
		// *     returns 8: '52'
		// *     example 9: date('W Y-m-d', 1293974054); // 2011-01-02
		// *     returns 9: '52 2011-01-02'
		var that = this,
			jsdate, f, formatChr = /\\?([a-z])/gi, formatChrCb,
			// Keep this here (works, but for code commented-out
			// below for file size reasons)
			//, tal= [],
			_pad = function (n, c) {
				if ((n = n + "").length < c) {
					return new Array((++c) - n.length).join("0") + n;
				} else {
					return n;
				}
			},
			txt_words = ["Sun", "Mon", "Tues", "Wednes", "Thurs", "Fri", "Satur",
			"January", "February", "March", "April", "May", "June", "July",
			"August", "September", "October", "November", "December"],
			txt_ordin = {
				1: "st",
				2: "nd",
				3: "rd",
				21: "st", 
				22: "nd",
				23: "rd",
				31: "st"
			};
		formatChrCb = function (t, s) {
			return f[t] ? f[t]() : s;
		};
		f = {
		// Day
			d: function () { // Day of month w/leading 0; 01..31
				return _pad(f.j(), 2);
			},
			D: function () { // Shorthand day name; Mon...Sun
				return f.l().slice(0, 3);
			},
			j: function () { // Day of month; 1..31
				return jsdate.getDate();
			},
			l: function () { // Full day name; Monday...Sunday
				return txt_words[f.w()] + 'day';
			},
			N: function () { // ISO-8601 day of week; 1[Mon]..7[Sun]
				return f.w() || 7;
			},
			S: function () { // Ordinal suffix for day of month; st, nd, rd, th
				return txt_ordin[f.j()] || 'th';
			},
			w: function () { // Day of week; 0[Sun]..6[Sat]
				return jsdate.getDay();
			},
			z: function () { // Day of year; 0..365
				var a = new Date(f.Y(), f.n() - 1, f.j()),
					b = new Date(f.Y(), 0, 1);
				return Math.round((a - b) / 864e5) + 1;
			},

		// Week
			W: function () { // ISO-8601 week number
				var a = new Date(f.Y(), f.n() - 1, f.j() - f.N() + 3),
					b = new Date(a.getFullYear(), 0, 4);
				return 1 + Math.round((a - b) / 864e5 / 7);
			},

		// Month
			F: function () { // Full month name; January...December
				return txt_words[6 + f.n()];
			},
			m: function () { // Month w/leading 0; 01...12
				return _pad(f.n(), 2);
			},
			M: function () { // Shorthand month name; Jan...Dec
				return f.F().slice(0, 3);
			},
			n: function () { // Month; 1...12
				return jsdate.getMonth() + 1;
			},
			t: function () { // Days in month; 28...31
				return (new Date(f.Y(), f.n(), 0)).getDate();
			},

		// Year
			L: function () { // Is leap year?; 0 or 1
				var y = f.Y(), a = y & 3, b = y % 4e2, c = y % 1e2;
				return 0 + (!a && (c || !b));
			},
			o: function () { // ISO-8601 year
				var n = f.n(), W = f.W(), Y = f.Y();
				return Y + (n === 12 && W < 9 ? -1 : n === 1 && W > 9);
			},
			Y: function () { // Full year; e.g. 1980...2010
				return jsdate.getFullYear();
			},
			y: function () { // Last two digits of year; 00...99
				return (f.Y() + "").slice(-2);
			},

		// Time
			a: function () { // am or pm
				return jsdate.getHours() > 11 ? "pm" : "am";
			},
			A: function () { // AM or PM
				return f.a().toUpperCase();
			},
			B: function () { // Swatch Internet time; 000..999
				var H = jsdate.getUTCHours() * 36e2, // Hours
					i = jsdate.getUTCMinutes() * 60, // Minutes
					s = jsdate.getUTCSeconds(); // Seconds
				return _pad(Math.floor((H + i + s + 36e2) / 86.4) % 1e3, 3);
			},
			g: function () { // 12-Hours; 1..12
				return f.G() % 12 || 12;
			},
			G: function () { // 24-Hours; 0..23
				return jsdate.getHours();
			},
			h: function () { // 12-Hours w/leading 0; 01..12
				return _pad(f.g(), 2);
			},
			H: function () { // 24-Hours w/leading 0; 00..23
				return _pad(f.G(), 2);
			},
			i: function () { // Minutes w/leading 0; 00..59
				return _pad(jsdate.getMinutes(), 2);
			},
			s: function () { // Seconds w/leading 0; 00..59
				return _pad(jsdate.getSeconds(), 2);
			},
			u: function () { // Microseconds; 000000-999000
				return _pad(jsdate.getMilliseconds() * 1000, 6);
			},

		// Timezone
			e: function () { // Timezone identifier; e.g. Atlantic/Azores, ...
	// The following works, but requires inclusion of the very large
	// timezone_abbreviations_list() function.
	/*              return this.date_default_timezone_get();
	*/
				throw 'Not supported (see source code of date() for timezone on how to add support)';
			},
			I: function () { // DST observed?; 0 or 1
				// Compares Jan 1 minus Jan 1 UTC to Jul 1 minus Jul 1 UTC.
				// If they are not equal, then DST is observed.
				var a = new Date(f.Y(), 0), // Jan 1
					c = Date.UTC(f.Y(), 0), // Jan 1 UTC
					b = new Date(f.Y(), 6), // Jul 1
					d = Date.UTC(f.Y(), 6); // Jul 1 UTC
				return 0 + ((a - c) !== (b - d));
			},
			O: function () { // Difference to GMT in hour format; e.g. +0200
				var a = jsdate.getTimezoneOffset();
				return (a > 0 ? "-" : "+") + _pad(Math.abs(a / 60 * 100), 4);
			},
			P: function () { // Difference to GMT w/colon; e.g. +02:00
				var O = f.O();
				return (O.substr(0, 3) + ":" + O.substr(3, 2));
			},
			T: function () { // Timezone abbreviation; e.g. EST, MDT, ...
	// The following works, but requires inclusion of the very
	// large timezone_abbreviations_list() function.
	/*              var abbr = '', i = 0, os = 0, default = 0;
				if (!tal.length) {
					tal = that.timezone_abbreviations_list();
				}
				if (that.php_js && that.php_js.default_timezone) {
					default = that.php_js.default_timezone;
					for (abbr in tal) {
						for (i=0; i < tal[abbr].length; i++) {
							if (tal[abbr][i].timezone_id === default) {
								return abbr.toUpperCase();
							}
						}
					}
				}
				for (abbr in tal) {
					for (i = 0; i < tal[abbr].length; i++) {
						os = -jsdate.getTimezoneOffset() * 60;
						if (tal[abbr][i].offset === os) {
							return abbr.toUpperCase();
						}
					}
				}
	*/
				return 'UTC';
			},
			Z: function () { // Timezone offset in seconds (-43200...50400)
				return -jsdate.getTimezoneOffset() * 60;
			},

		// Full Date/Time
			c: function () { // ISO-8601 date.
				return 'Y-m-d\\Th:i:sP'.replace(formatChr, formatChrCb);
			},
			r: function () { // RFC 2822
				return 'D, d M Y H:i:s O'.replace(formatChr, formatChrCb);
			},
			U: function () { // Seconds since UNIX epoch
				return jsdate.getTime() / 1000 | 0;
			}
		};
		this.date = function (format, timestamp) {
			that = this;
			jsdate = (
				(typeof timestamp === 'undefined') ? new Date() : // Not provided
				(timestamp instanceof Date) ? new Date(timestamp) : // JS Date()
				new Date(timestamp * 1000) // UNIX timestamp (auto-convert to int)
			);
			return format.replace(formatChr, formatChrCb);
		};
		return this.date(format, timestamp);
	}


	function mktime() {
		// Get UNIX timestamp for a date  
		// 
		// version: 1008.1718
		// discuss at: http://phpjs.org/functions/mktime    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// +   improved by: baris ozdil
		// +      input by: gabriel paderni
		// +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// +   improved by: FGFEmperor    // +      input by: Yannoo
		// +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// +      input by: jakes
		// +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
		// +   bugfixed by: Marc Palau    // +   improved by: Brett Zamir (http://brett-zamir.me)
		// +      input by: 3D-GRAF
		// +   bugfixed by: Brett Zamir (http://brett-zamir.me)
		// +      input by: Chris
		// +    revised by: Theriault    // %        note 1: The return values of the following examples are
		// %        note 1: received only if your system's timezone is UTC.
		// *     example 1: mktime(14, 10, 2, 2, 1, 2008);
		// *     returns 1: 1201875002
		// *     example 2: mktime(0, 0, 0, 0, 1, 2008);    // *     returns 2: 1196467200
		// *     example 3: make = mktime();
		// *     example 3: td = new Date();
		// *     example 3: real = Math.floor(td.getTime() / 1000);
		// *     example 3: diff = (real - make);    // *     results 3: diff < 5
		// *     example 4: mktime(0, 0, 0, 13, 1, 1997)
		// *     returns 4: 883612800 
		// *     example 5: mktime(0, 0, 0, 1, 1, 1998)
		// *     returns 5: 883612800     // *     example 6: mktime(0, 0, 0, 1, 1, 98)
		// *     returns 6: 883612800 
		// *     example 7: mktime(23, 59, 59, 13, 0, 2010)
		// *     returns 7: 1293839999
		// *     example 8: mktime(0, 0, -1, 1, 1, 1970)    // *     returns 8: -1
		var d = new Date(), r = arguments, i = 0,
			e = ['Hours', 'Minutes', 'Seconds', 'Month', 'Date', 'FullYear'];
	 
		for (i = 0; i < e.length; i++) {        if (typeof r[i] === 'undefined') {
				r[i] = d['get' + e[i]]();
				r[i] += (i === 3); // +1 to fix JS months.
			} else {
				r[i] = parseInt(r[i], 10);            if (isNaN(r[i])) {
					return false;
				}
			}
		}    
		
		// Map years 0-69 to 2000-2069 and years 70-100 to 1970-2000.
		r[5] += (r[5] >= 0 ? (r[5] <= 69 ? 2e3 : (r[5] <= 100 ? 1900 : 0)) : 0);
		
		// Set year, month (-1 to fix JS months), and date.    // !This must come before the call to setHours!
		d.setFullYear(r[5], r[3] - 1, r[4]);
		
		// Set hours, minutes, and seconds.
		d.setHours(r[0], r[1], r[2]); 
		// Divide milliseconds by 1000 to return seconds and drop decimal.
		// Add 1 second if negative or it'll be off from PHP by 1 second.
		return (d.getTime() / 1e3 >> 0) - (d.getTime() < 0);
	}

}