+/**
+ * This returns a date of the format "Wed, Oct 29, 2003 9:52 am",
+ * or the same in 24H format (depending on the user's settings),
+ * and taking localization into accout.
+ *
+ * @param int stamp the timestamp
+ * @return string the long date string
+ */
+function getLongDateString( $stamp ) {
+
+ global $hour_format;
+
+ if ($stamp == -1) {
+ return '';
+ }
+
+ if ( $hour_format == SMPREF_TIME_12HR ) {
+ $date_format = _("D, F j, Y g:i a");
+ } else {
+ $date_format = _("D, F j, Y G:i");
+ }
+
+ return( date_intl( $date_format, $stamp ) );
+
+}
+
+/**
+ * Returns a short representation of the date,
+ * taking timezones and localization into account.
+ * Depending on user's settings, this string can be
+ * of the form: "14:23" or "Jun 14, 2003" depending
+ * on whether the stamp is "today" or not.
+ *
+ * @param int stamp the timestamp
+ * @return string the date string
+ */
+function getDateString( $stamp ) {
+
+ global $invert_time, $hour_format, $show_full_date;
+
+ if ( $stamp == -1 ) {
+ return '';
+ }
+
+ $now = time();
+
+ $dateZ = date('Z', $now );
+ if ($invert_time) {
+ $dateZ = - $dateZ;
+ }
+ $midnight = $now - ($now % 86400) - $dateZ;
+ $nextmid = $midnight + 86400;
+
+ if (($show_full_date == 1) || ($nextmid < $stamp)) {
+ $date_format = _("M j, Y");
+ } else if ($midnight < $stamp) {
+ /* Today */
+ if ( $hour_format == SMPREF_TIME_12HR ) {
+ $date_format = _("g:i a");
+ } else {
+ $date_format = _("G:i");
+ }
+ } else if ($midnight - 518400 < $stamp) {
+ /* This week */
+ if ( $hour_format == SMPREF_TIME_12HR ) {
+ $date_format = _("D, g:i a");
+ } else {
+ $date_format = _("D, G:i");
+ }
+ } else {
+ /* before this week */
+ $date_format = _("M j, Y");
+ }
+
+ return( date_intl( $date_format, $stamp ) );
+}
+
+/**
+ * Decodes a RFC 822 Date-header into a timestamp
+ *
+ * @param array dateParts the Date-header split by whitespace
+ * @return int the timestamp calculated from the header
+ */
+function getTimeStamp($dateParts) {
+ /** $dateParts[0] == <day of week> Mon, Tue, Wed
+ ** $dateParts[1] == <day of month> 23
+ ** $dateParts[2] == <month> Jan, Feb, Mar
+ ** $dateParts[3] == <year> 1999
+ ** $dateParts[4] == <time> 18:54:23 (HH:MM:SS)
+ ** $dateParts[5] == <from GMT> +0100
+ ** $dateParts[6] == <zone> (EDT)
+ **
+ ** NOTE: In RFC 822, it states that <day of week> is optional.
+ ** In that case, dateParts[0] would be the <day of month>
+ ** and everything would be bumped up one.
+ **/
+
+ /*
+ * Simply check to see if the first element in the dateParts
+ * array is an integer or not.
+ * Since the day of week is optional, this check is needed.
+ */
+ if (count($dateParts) <2) {
+ return 0;
+ }
+
+ /* remove day of week */
+ if (!is_numeric(trim($dateParts[0]))) {
+ $dataParts = array_shift($dateParts);
+ }
+ /* calculate timestamp separated from the zone and obs-zone */
+ $stamp = strtotime(implode (' ', array_splice ($dateParts,0,4)));
+ if (!isset($dateParts[0])) {
+ $dateParts[0] = '+0000';
+ }
+
+ if (!preg_match('/^[+-]{1}[0-9]{4}$/',$dateParts[0])) {
+ /* zone in obs-zone format */
+ if (preg_match('/\((.+)\)/',$dateParts[0],$regs)) {
+ $obs_zone = $regs[1];
+ } else {
+ $obs_zone = $dateParts[0];
+ }
+ return getGMTSeconds($stamp, $obs_zone);
+ } else {
+ return getGMTSeconds($stamp, $dateParts[0]);
+ }
+}