diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 9f199b2ad2..55e1a5d2d0 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -443,7 +443,7 @@ return array( 'rsrc/js/core/behavior-device.js' => 'a205cf28', 'rsrc/js/core/behavior-drag-and-drop-textarea.js' => '6d49590e', 'rsrc/js/core/behavior-error-log.js' => '6882e80a', - 'rsrc/js/core/behavior-fancy-datepicker.js' => '510b5809', + 'rsrc/js/core/behavior-fancy-datepicker.js' => 'ea5cec5d', 'rsrc/js/core/behavior-file-tree.js' => '88236f00', 'rsrc/js/core/behavior-form.js' => '5c54cbf3', 'rsrc/js/core/behavior-gesture.js' => '3ab51e2c', @@ -467,7 +467,7 @@ return array( 'rsrc/js/core/behavior-scrollbar.js' => '834a1173', 'rsrc/js/core/behavior-search-typeahead.js' => '048330fa', 'rsrc/js/core/behavior-select-on-click.js' => '4e3e79a6', - 'rsrc/js/core/behavior-time-typeahead.js' => '8bfbb401', + 'rsrc/js/core/behavior-time-typeahead.js' => 'f80d6bf0', 'rsrc/js/core/behavior-toggle-class.js' => '5d7c9f33', 'rsrc/js/core/behavior-tokenizer.js' => 'b3a4b884', 'rsrc/js/core/behavior-tooltip.js' => '3ee3408b', @@ -575,7 +575,7 @@ return array( 'javelin-behavior-durable-column' => 'c72aa091', 'javelin-behavior-error-log' => '6882e80a', 'javelin-behavior-event-all-day' => '38dcf3c8', - 'javelin-behavior-fancy-datepicker' => '510b5809', + 'javelin-behavior-fancy-datepicker' => 'ea5cec5d', 'javelin-behavior-global-drag-and-drop' => 'c8e57404', 'javelin-behavior-herald-rule-editor' => '7ebaeed3', 'javelin-behavior-high-security-warning' => 'a464fe03', @@ -643,7 +643,7 @@ return array( 'javelin-behavior-slowvote-embed' => '887ad43f', 'javelin-behavior-stripe-payment-form' => '3f5d6dbf', 'javelin-behavior-test-payment-form' => 'fc91ab6c', - 'javelin-behavior-time-typeahead' => '8bfbb401', + 'javelin-behavior-time-typeahead' => 'f80d6bf0', 'javelin-behavior-toggle-class' => '5d7c9f33', 'javelin-behavior-typeahead-browse' => '635de1ec', 'javelin-behavior-typeahead-search' => '93d0c9e3', @@ -1172,13 +1172,6 @@ return array( 'javelin-typeahead-source', 'javelin-util', ), - '510b5809' => array( - 'javelin-behavior', - 'javelin-util', - 'javelin-dom', - 'javelin-stratcom', - 'javelin-vector', - ), '519705ea' => array( 'javelin-install', 'javelin-dom', @@ -1518,14 +1511,6 @@ return array( 'javelin-request', 'javelin-typeahead-source', ), - '8bfbb401' => array( - 'javelin-behavior', - 'javelin-util', - 'javelin-dom', - 'javelin-stratcom', - 'javelin-vector', - 'javelin-typeahead-static-source', - ), '8ce821c5' => array( 'phabricator-notification', 'javelin-stratcom', @@ -1953,6 +1938,13 @@ return array( 'javelin-dom', 'phabricator-draggable-list', ), + 'ea5cec5d' => array( + 'javelin-behavior', + 'javelin-util', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-vector', + ), 'ea681761' => array( 'javelin-behavior', 'javelin-aphlict', @@ -1998,6 +1990,14 @@ return array( 'javelin-typeahead-ondemand-source', 'javelin-util', ), + 'f80d6bf0' => array( + 'javelin-behavior', + 'javelin-util', + 'javelin-dom', + 'javelin-stratcom', + 'javelin-vector', + 'javelin-typeahead-static-source', + ), 'f829edb3' => array( 'javelin-view', 'javelin-install', diff --git a/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php b/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php index 218fe17371..47736f38fe 100644 --- a/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php +++ b/src/applications/calendar/controller/PhabricatorCalendarEventEditController.php @@ -191,7 +191,7 @@ final class PhabricatorCalendarEventEditController PhabricatorCalendarEventTransaction::TYPE_NAME) ->setNewValue($name); - if ($is_parent && $this->isCreate()) { + if ($is_recurring && $this->isCreate()) { $xactions[] = id(new PhabricatorCalendarEventTransaction()) ->setTransactionType( PhabricatorCalendarEventTransaction::TYPE_RECURRING) @@ -210,7 +210,7 @@ final class PhabricatorCalendarEventEditController } } - if (($is_parent && $this->isCreate()) || !$is_parent) { + if (($is_recurring && $this->isCreate()) || !$is_parent) { $xactions[] = id(new PhabricatorCalendarEventTransaction()) ->setTransactionType( PhabricatorCalendarEventTransaction::TYPE_ALL_DAY) diff --git a/src/applications/conpherence/controller/ConpherenceWidgetController.php b/src/applications/conpherence/controller/ConpherenceWidgetController.php index 76113cd598..18d142d9b7 100644 --- a/src/applications/conpherence/controller/ConpherenceWidgetController.php +++ b/src/applications/conpherence/controller/ConpherenceWidgetController.php @@ -315,8 +315,14 @@ final class ConpherenceWidgetController extends ConpherenceController { $user, $time_str); - $secondary_info = pht('%s, %s', - $handles[$status->getUserPHID()]->getName(), $epoch_range); + if (isset($handles[$status->getUserPHID()])) { + $secondary_info = pht( + '%s, %s', + $handles[$status->getUserPHID()]->getName(), + $epoch_range); + } else { + $secondary_info = $epoch_range; + } $content[] = phutil_tag( 'div', diff --git a/src/applications/diviner/query/DivinerAtomQuery.php b/src/applications/diviner/query/DivinerAtomQuery.php index e01df2022d..2daa9bc3a7 100644 --- a/src/applications/diviner/query/DivinerAtomQuery.php +++ b/src/applications/diviner/query/DivinerAtomQuery.php @@ -179,6 +179,7 @@ final class DivinerAtomQuery extends PhabricatorCursorPagedPolicyAwareQuery { $xatoms = id(new DivinerAtomQuery()) ->setViewer($this->getViewer()) ->withNames($names) + ->withGhosts(false) ->needExtends(true) ->needAtoms(true) ->needChildren($this->needChildren) diff --git a/src/applications/diviner/search/DivinerAtomSearchIndexer.php b/src/applications/diviner/search/DivinerAtomSearchIndexer.php index 0e77c6e64c..ea134058f6 100644 --- a/src/applications/diviner/search/DivinerAtomSearchIndexer.php +++ b/src/applications/diviner/search/DivinerAtomSearchIndexer.php @@ -10,6 +10,10 @@ final class DivinerAtomSearchIndexer extends PhabricatorSearchDocumentIndexer { $atom = $this->loadDocumentByPHID($phid); $book = $atom->getBook(); + if (!$atom->getIsDocumentable()) { + return null; + } + $doc = $this->newDocument($phid) ->setDocumentTitle($atom->getTitle()) ->setDocumentCreated($book->getDateCreated()) diff --git a/src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php b/src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php index 26450722b9..64219b84c4 100644 --- a/src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php +++ b/src/applications/harbormaster/step/HarbormasterBuildStepImplementation.php @@ -2,6 +2,8 @@ abstract class HarbormasterBuildStepImplementation extends Phobject { + private $settings; + public static function getImplementations() { return id(new PhutilSymbolLoader()) ->setAncestorClass(__CLASS__) diff --git a/src/applications/settings/panel/PhabricatorDateTimeSettingsPanel.php b/src/applications/settings/panel/PhabricatorDateTimeSettingsPanel.php index 45f9f3fa01..7c70089836 100644 --- a/src/applications/settings/panel/PhabricatorDateTimeSettingsPanel.php +++ b/src/applications/settings/panel/PhabricatorDateTimeSettingsPanel.php @@ -19,6 +19,7 @@ final class PhabricatorDateTimeSettingsPanel extends PhabricatorSettingsPanel { $username = $user->getUsername(); $pref_time = PhabricatorUserPreferences::PREFERENCE_TIME_FORMAT; + $pref_date = PhabricatorUserPreferences::PREFERENCE_DATE_FORMAT; $pref_week_start = PhabricatorUserPreferences::PREFERENCE_WEEK_START_DAY; $preferences = $user->loadPreferences(); @@ -31,12 +32,16 @@ final class PhabricatorDateTimeSettingsPanel extends PhabricatorSettingsPanel { $errors[] = pht('The selected timezone is not a valid timezone.'); } - $preferences->setPreference( - $pref_time, - $request->getStr($pref_time)); - $preferences->setPreference( - $pref_week_start, - $request->getStr($pref_week_start)); + $preferences + ->setPreference( + $pref_time, + $request->getStr($pref_time)) + ->setPreference( + $pref_date, + $request->getStr($pref_date)) + ->setPreference( + $pref_week_start, + $request->getStr($pref_week_start)); if (!$errors) { $preferences->save(); @@ -69,6 +74,18 @@ final class PhabricatorDateTimeSettingsPanel extends PhabricatorSettingsPanel { ->setCaption( pht('Format used when rendering a time of day.')) ->setValue($preferences->getPreference($pref_time))) + ->appendChild( + id(new AphrontFormSelectControl()) + ->setLabel(pht('Date Format')) + ->setName($pref_date) + ->setOptions(array( + 'Y-m-d' => pht('ISO 8601 (2000-02-28)'), + 'n/j/Y' => pht('US (2/28/2000)'), + 'd-m-Y' => pht('European (28-02-2000)'), + )) + ->setCaption( + pht('Format used when rendering a date.')) + ->setValue($preferences->getPreference($pref_date))) ->appendChild( id(new AphrontFormSelectControl()) ->setLabel(pht('Week Starts On')) diff --git a/src/applications/settings/storage/PhabricatorUserPreferences.php b/src/applications/settings/storage/PhabricatorUserPreferences.php index d54cf6cb46..cb04f59392 100644 --- a/src/applications/settings/storage/PhabricatorUserPreferences.php +++ b/src/applications/settings/storage/PhabricatorUserPreferences.php @@ -8,6 +8,7 @@ final class PhabricatorUserPreferences extends PhabricatorUserDAO { const PREFERENCE_MULTIEDIT = 'multiedit'; const PREFERENCE_TITLES = 'titles'; const PREFERENCE_MONOSPACED_TEXTAREAS = 'monospaced-textareas'; + const PREFERENCE_DATE_FORMAT = 'date-format'; const PREFERENCE_TIME_FORMAT = 'time-format'; const PREFERENCE_WEEK_START_DAY = 'week-start-day'; diff --git a/src/infrastructure/daemon/bot/PhabricatorBot.php b/src/infrastructure/daemon/bot/PhabricatorBot.php index ce66338111..6c4bfafc8a 100644 --- a/src/infrastructure/daemon/bot/PhabricatorBot.php +++ b/src/infrastructure/daemon/bot/PhabricatorBot.php @@ -15,6 +15,7 @@ final class PhabricatorBot extends PhabricatorDaemon { private $conduit; private $config; private $pollFrequency; + private $protocolAdapter; protected function run() { $argv = $this->getArgv(); diff --git a/src/view/form/control/AphrontFormDateControl.php b/src/view/form/control/AphrontFormDateControl.php index 6f826cf830..20172593e9 100644 --- a/src/view/form/control/AphrontFormDateControl.php +++ b/src/view/form/control/AphrontFormDateControl.php @@ -127,7 +127,29 @@ final class AphrontFormDateControl extends AphrontFormControl { } private function getDateInputValue() { - return $this->valueDate; + $date_format = $this->getDateFormat(); + $timezone = $this->getTimezone(); + + $datetime = new DateTime($this->valueDate, $timezone); + $date = $datetime->format($date_format); + + return $date; + } + + private function getTimeFormat() { + $viewer = $this->getUser(); + $preferences = $viewer->loadPreferences(); + $pref_time_format = PhabricatorUserPreferences::PREFERENCE_TIME_FORMAT; + + return $preferences->getPreference($pref_time_format, 'g:i A'); + } + + private function getDateFormat() { + $viewer = $this->getUser(); + $preferences = $viewer->loadPreferences(); + $pref_date_format = PhabricatorUserPreferences::PREFERENCE_DATE_FORMAT; + + return $preferences->getPreference($pref_date_format, 'Y-m-d'); } private function getTimeInputValue() { @@ -219,6 +241,7 @@ final class AphrontFormDateControl extends AphrontFormControl { 'startTimeID' => $time_id, 'endTimeID' => $this->endDateID, 'timeValues' => $values, + 'format' => $this->getTimeFormat(), )); @@ -242,7 +265,9 @@ final class AphrontFormDateControl extends AphrontFormControl { ), $time_sel); - Javelin::initBehavior('fancy-datepicker', array()); + Javelin::initBehavior('fancy-datepicker', array( + 'format' => $this->getDateFormat(), + )); $classes = array(); $classes[] = 'aphront-form-date-container'; @@ -319,20 +344,31 @@ final class AphrontFormDateControl extends AphrontFormControl { } private function getTimeTypeaheadValues() { + $time_format = $this->getTimeFormat(); $times = array(); - $am_pm_list = array('AM', 'PM'); - foreach ($am_pm_list as $am_pm) { - for ($hour = 0; $hour < 12; $hour++) { - $actual_hour = ($hour == 0) ? 12 : $hour; - $times[] = $actual_hour.':00 '.$am_pm; - $times[] = $actual_hour.':30 '.$am_pm; + if ($time_format == 'g:i A') { + $am_pm_list = array('AM', 'PM'); + + foreach ($am_pm_list as $am_pm) { + for ($hour = 0; $hour < 12; $hour++) { + $actual_hour = ($hour == 0) ? 12 : $hour; + $times[] = $actual_hour.':00 '.$am_pm; + $times[] = $actual_hour.':30 '.$am_pm; + } + } + } else if ($time_format == 'H:i') { + for ($hour = 0; $hour < 24; $hour++) { + $written_hour = ($hour > 9) ? $hour : '0'.$hour; + $times[] = $written_hour.':00'; + $times[] = $written_hour.':30'; } } foreach ($times as $key => $time) { $times[$key] = array($key, $time); } + return $times; } diff --git a/src/view/form/control/AphrontFormDateControlValue.php b/src/view/form/control/AphrontFormDateControlValue.php index 43fb42664e..c5d7e81852 100644 --- a/src/view/form/control/AphrontFormDateControlValue.php +++ b/src/view/form/control/AphrontFormDateControlValue.php @@ -10,6 +10,7 @@ final class AphrontFormDateControlValue extends Phobject { private $zone; private $optional; + public function getValueDate() { return $this->valueDate; } @@ -65,8 +66,13 @@ final class AphrontFormDateControlValue extends Phobject { $value = new AphrontFormDateControlValue(); $value->viewer = $viewer; - $value->valueDate = $month.'/'.$day.'/'.$year; - $value->valueTime = coalesce($time, '12:00 AM'); + list($value->valueDate, $value->valueTime) = + $value->getFormattedDateFromParts( + $year, + $month, + $day, + coalesce($time, '12:00 AM'), + $value); $value->valueEnabled = $enabled; return $value; @@ -75,10 +81,14 @@ final class AphrontFormDateControlValue extends Phobject { public static function newFromRequest(AphrontRequest $request, $key) { $value = new AphrontFormDateControlValue(); $value->viewer = $request->getViewer(); - $value->valueDate = $request->getStr($key.'_d'); - $value->valueTime = $request->getStr($key.'_t'); - $value->valueEnabled = $request->getStr($key.'_e'); + list($value->valueDate, $value->valueTime) = + $value->getFormattedDateFromDate( + $request->getStr($key.'_d'), + $request->getStr($key.'_t'), + $value); + + $value->valueEnabled = $request->getStr($key.'_e'); return $value; } @@ -91,10 +101,15 @@ final class AphrontFormDateControlValue extends Phobject { $year = $readable[0]; $month = $readable[1]; $day = $readable[2]; + $time = $readable[3]; - $value->valueDate = $month.'/'.$day.'/'.$year; - $value->valueTime = $readable[3]; - + list($value->valueDate, $value->valueTime) = + $value->getFormattedDateFromParts( + $year, + $month, + $day, + $time, + $value); return $value; } @@ -105,8 +120,12 @@ final class AphrontFormDateControlValue extends Phobject { $value = new AphrontFormDateControlValue(); $value->viewer = $viewer; - $value->valueDate = idx($dictionary, 'd'); - $value->valueTime = idx($dictionary, 't'); + list($value->valueDate, $value->valueTime) = + $value->getFormattedDateFromDate( + idx($dictionary, 'd'), + idx($dictionary, 't'), + $value); + $value->valueEnabled = idx($dictionary, 'e'); return $value; @@ -185,6 +204,67 @@ final class AphrontFormDateControlValue extends Phobject { return $value; } + private function getTimeFormat() { + $preferences = $this->viewer->loadPreferences(); + $pref_time_format = PhabricatorUserPreferences::PREFERENCE_TIME_FORMAT; + + return $preferences->getPreference($pref_time_format, 'g:i A'); + } + + private function getDateFormat() { + $preferences = $this->viewer->loadPreferences(); + $pref_date_format = PhabricatorUserPreferences::PREFERENCE_DATE_FORMAT; + + return $preferences->getPreference($pref_date_format, 'Y-m-d'); + } + + private function getFormattedDateFromDate($date, $time, $value) { + $original_input = $date; + $zone = $value->getTimezone(); + $separator = $value->getFormatSeparator(); + $parts = preg_split('@[,./:-]@', $date); + $date = implode($separator, $parts); + $date = id(new DateTime($date, $zone)); + + if ($date) { + $date = $date->format($value->getDateFormat()); + } else { + $date = $original_input; + } + + $date = id(new DateTime("{$date} {$time}", $zone)); + + return array( + $date->format($value->getDateFormat()), + $date->format($value->getTimeFormat()), + ); + } + + private function getFormattedDateFromParts( + $year, + $month, + $day, + $time, + $value) { + $zone = $value->getTimezone(); + $date_time = id(new DateTime("{$year}-{$month}-{$day} {$time}", $zone)); + + return array( + $date_time->format($value->getDateFormat()), + $date_time->format($value->getTimeFormat()), + ); + } + + private function getFormatSeparator() { + $format = $this->getDateFormat(); + switch ($format) { + case 'n/j/Y': + return '/'; + default: + return '-'; + } + } + public function getDateTime() { $epoch = $this->getEpoch(); $date = null; diff --git a/src/view/phui/calendar/PHUICalendarListView.php b/src/view/phui/calendar/PHUICalendarListView.php index 1e0639262d..80468dcb62 100644 --- a/src/view/phui/calendar/PHUICalendarListView.php +++ b/src/view/phui/calendar/PHUICalendarListView.php @@ -141,6 +141,12 @@ final class PHUICalendarListView extends AphrontTagView { } private function getEventTooltip(AphrontCalendarEventView $event) { + $viewer = $this->getUser(); + $preferences = $viewer->loadPreferences(); + $time_pref = $preferences->getPreference( + PhabricatorUserPreferences::PREFERENCE_TIME_FORMAT, + 'g:i A'); + Javelin::initBehavior('phabricator-tooltips'); $start = id(AphrontFormDateControlValue::newFromEpoch( @@ -166,13 +172,13 @@ final class PHUICalendarListView extends AphrontTagView { if ($start->getValueDate() == $end->getValueDate()) { $tip = pht( '%s - %s', - $start->getValueAsFormat('g:i A'), - $end->getValueAsFormat('g:i A')); + $start->getValueAsFormat($time_pref), + $end->getValueAsFormat($time_pref)); } else { $tip = pht( '%s - %s', - $start->getValueAsFormat('M j, Y, g:i A'), - $end->getValueAsFormat('M j, Y, g:i A')); + $start->getValueAsFormat('M j, Y, '.$time_pref), + $end->getValueAsFormat('M j, Y, '.$time_pref)); } } return $tip; diff --git a/webroot/rsrc/js/core/behavior-fancy-datepicker.js b/webroot/rsrc/js/core/behavior-fancy-datepicker.js index d00f6cc77f..99feaa31f2 100644 --- a/webroot/rsrc/js/core/behavior-fancy-datepicker.js +++ b/webroot/rsrc/js/core/behavior-fancy-datepicker.js @@ -7,7 +7,11 @@ * javelin-vector */ -JX.behavior('fancy-datepicker', function() { +JX.behavior('fancy-datepicker', function(config, statics) { + if (statics.initialized) { + return; + } + statics.initialized = true; var picker; var root; @@ -16,6 +20,32 @@ JX.behavior('fancy-datepicker', function() { var value_m; var value_d; + var get_format_separator = function() { + var format = get_format(); + switch (format.toLowerCase()) { + case 'n/j/y': + return '/'; + default: + return '-'; + } + }; + + var get_key_maps = function() { + var format = get_format(); + var regex = new RegExp('[./ -]'); + return format.split(regex); + }; + + var get_format = function() { + var format = config.format; + + if (format === null) { + format = 'Y-m-d'; + } + + return format; + }; + var onopen = function(e) { e.kill(); @@ -85,18 +115,76 @@ JX.behavior('fancy-datepicker', function() { }; }; - var read_date = function() { - var i = get_inputs(); - var date = i.d.value; - var parts = date.split('/'); - value_y = +parts[2]; - value_m = +parts[0]; - value_d = +parts[1]; + var read_date = function(){ + var inputs = get_inputs(); + var date = inputs.d.value; + var regex = new RegExp('[./ -]'); + var date_parts = date.split(regex); + var map = get_key_maps(); + + for (var i=0; i < date_parts.length; i++) { + var key = map[i].toLowerCase(); + + switch (key) { + case 'y': + value_y = date_parts[i]; + break; + case 'm': + value_m = date_parts[i]; + break; + case 'd': + value_d = date_parts[i]; + break; + } + } }; var write_date = function() { - var i = get_inputs(); - i.d.value = value_m + '/' + value_d + '/' + value_y; + var inputs = get_inputs(); + var map = get_key_maps(); + var arr_values = []; + + for(var i=0; i < map.length; i++) { + switch (map[i].toLowerCase()) { + case 'y': + arr_values[i] = value_y; + break; + case 'm': + arr_values[i] = value_m; + break; + case 'n': + arr_values[i] = value_m; + break; + case 'd': + arr_values[i] = value_d; + break; + case 'j': + arr_values[i] = value_d; + break; + } + } + + var text_value = ''; + var separator = get_format_separator(); + + for(var j=0; j < arr_values.length; j++) { + var element = arr_values[j]; + var format = get_format(); + + if ((format.toLowerCase() === 'd-m-y' || + format.toLowerCase() === 'y-m-d') && + element < 10) { + element = '0' + element; + } + + if (text_value.length === 0) { + text_value += element; + } else { + text_value = text_value + separator + element; + } + } + + inputs.d.value = text_value; }; var render = function() { diff --git a/webroot/rsrc/js/core/behavior-time-typeahead.js b/webroot/rsrc/js/core/behavior-time-typeahead.js index 381eea7f36..bbd5e08699 100644 --- a/webroot/rsrc/js/core/behavior-time-typeahead.js +++ b/webroot/rsrc/js/core/behavior-time-typeahead.js @@ -11,6 +11,7 @@ JX.behavior('time-typeahead', function(config) { var start_date_control = JX.$(config.startTimeID); var end_date_control = config.endTimeID ? JX.$(config.endTimeID) : null; + var format = config.format; var end_date_tampered = false; @@ -79,7 +80,7 @@ JX.behavior('time-typeahead', function(config) { function getNewValue(time) { - var regex = /^([01]?\d)(?::([0-5]\d))?\s*((am|pm))?$/i; + var regex = /^([0-2]?\d)(?::([0-5]\d))?\s*((am|pm))?$/i; if (!regex.test(time)) { return null; @@ -90,32 +91,56 @@ JX.behavior('time-typeahead', function(config) { var minutes = parseInt(results[2], 10) ? parseInt(results[2], 10) : 0; var real_time = 0; + var end_value = ''; - if (/pm/i.test(results[3])) { - real_time = 12*60; - } else if (/am/i.test(results[3]) && hours == 12) { - hours = 0; + var end_hours; + var end_minutes; + + if (format === 'H:i' && hours < 23) { + end_hours = hours + 1; + + if (end_hours > 9) { + end_hours = end_hours.toString(); + } else { + end_hours = '0' + end_hours.toString(); + } + + if (minutes > 9) { + end_minutes = minutes.toString(); + } else { + end_minutes = '0' + minutes.toString(); + } + + end_value = end_hours + ':' + end_minutes; + } else if (format === 'g:i A') { + if (/pm/i.test(results[3])) { + real_time = 12*60; + } else if (/am/i.test(results[3]) && hours == 12) { + hours = 0; + } + + real_time = real_time + (hours * 60) + minutes; + + var end_time = real_time + 60; + + var end_meridian = 'AM'; + end_hours = Math.floor(end_time / 60); + + if (end_hours == 12) { + end_meridian = 'PM'; + } else if (end_hours > 12 && end_hours < 24) { + end_hours = end_hours - 12; + end_meridian = 'PM'; + } else if (end_hours == 24) { + end_hours = end_hours - 12; + } + + end_minutes = end_time%60; + end_minutes = (end_minutes < 9) ? end_minutes : ('0' + end_minutes); + end_value = end_hours + ':' + end_minutes + ' ' + end_meridian; } - real_time = real_time + (hours * 60) + minutes; - var end_time = real_time + 60; - - var end_meridian = 'AM'; - var end_hours = Math.floor(end_time / 60); - - if (end_hours == 12) { - end_meridian = 'PM'; - } else if (end_hours > 12 && end_hours < 24) { - end_hours = end_hours - 12; - end_meridian = 'PM'; - } else if (end_hours == 24) { - end_hours = end_hours - 12; - } - - var end_minutes = end_time%60; - end_minutes = (end_minutes > 9) ? end_minutes : ('0' + end_minutes); - var end_value = end_hours + ':' + end_minutes + ' ' + end_meridian; return end_value; }