diff --git a/date.js b/date.js index ac7b8db..ebb9343 100644 --- a/date.js +++ b/date.js @@ -47,16 +47,67 @@ function date_field_formatter_view(entity_type, entity, field, instance, langcod // Now iterate over the items and render them using the format. // @TODO might need to do the "T" stuff for iOS and/or Safari $.each(items, function(delta, item) { - var value2_present = typeof item.value2 !== 'undefined' ? true: false; - var label = value2_present ? 'From: ' : ''; + + // prepare date formats + var format_full = 'D, j F Y - g:i a'; + var format_day = 'D, j F Y'; + var format_time = 'g:i a'; + + // prepare 'From:' date value var d = date_prepare(item.value); - element[delta] = { - markup: '
' + label + date(format, d.getTime()) + '
' - }; + + // check to see if there is a 'To:' date + var value2_present = typeof item.value2 !== 'undefined' ? true: false; + if (value2_present) { + + // prepare 'To:' date value var d2 = date_prepare(item.value2); - element[delta].markup += '
To: ' + date(format, d2.getTime()) + '
'; + + var from_day = date(format_day, d.getTime()); + var to_day = date(format_day, d2.getTime()); + + // get hour for 'To:' date + var to_hour = date('g', d2.getTime()); + + // correct the 0 hour to 12 for 12pm + if (to_hour == '0') { + var to_time = '12' + date(':i a', d2.getTime());; + } else { + var to_time = date(format_time, d2.getTime()); + } + + // get hour for 'From:' date + var from_hour = date('g', d.getTime()); + + if (from_hour == '0') { + var from_hour = '12' + date(':i a', d.getTime());; + } else { + var from_hour = date(format_time, d.getTime()); + } + + if (from_day == to_day) { + + element[delta] = { + markup: '
' + from_day + ' - ' + from_hour + ' to ' + to_time + '
' + }; + + } else { + + var label = value2_present ? 'From: ' : ''; + element[delta] = { + markup: '
' + label + date(format_full, d.getTime()) + '
' + }; + element[delta].markup += '
To: ' + date(format_full, d2.getTime()) + '
'; + + } + + } else { + element[delta] = { + markup: '
' + label + date(format_full, d.getTime()) + '
' + }; } + }); } @@ -123,14 +174,21 @@ function date_field_widget_form(form, form_state, field, instance, langcode, ite // on this item, otherwise the DG FAPI will default it to the item's value, which is only the first part of the // date. if (value2_set && items[delta].value.indexOf('|') == -1) { - items[delta].value += '|' + items[delta].value2; + items[delta].value += '|' + items[delta].item.value2; if (!items[delta].attributes) { items[delta].attributes = {}; } items[delta].attributes.value = items[delta].value; } // Grab the current date. - var date = new Date(); - + if (date_apple_device()) { + // console.log('--- APPLE DEVICE --- (Grab the current date)'); + var date = new Date(); + var date = date.getTime() + (date.getTimezoneOffset() * 60000); + var date = new Date(date); + } else { + // console.log('--- NON APPLE DEVICE --- (Grab the current date)'); + var date = new Date(); + } // Depending if we are collecting an end date or not, build a widget for each date value. var values = ['value']; @@ -195,26 +253,9 @@ function date_field_widget_form(form, form_state, field, instance, langcode, ite case 'hour': _widget_hour = _date_grain_widget_hour(date, instance, attributes, value_set, value2_set, item_date, military); - // Add an am/pm selector if we're not in military time. Hang onto the old value so we - // can prevent the +/- 12 adjustment from happening if the user selects the same - // thing twice. + // Add an am/pm selector if we're not in military time. if (!military) { - var onclick = attributes.onchange.replace(grain, 'ampm') + - '; this.date_ampm_old_value = this.value;'; - var ampm_value = parseInt(item_date.getHours()) < 12 ? 'am' : 'pm'; - _widget_ampm = { - type: 'select', - attributes: { - id: attributes.id.replace(grain, 'ampm'), - onclick: onclick, - date_ampm_original_value: ampm_value - }, - value: ampm_value, - options: { - am: 'am', - pm: 'pm' - } - }; + _widget_ampm = _date_grain_widget_ampm(date, instance, attributes, value_set, value2_set, item_date, military); } break; @@ -414,6 +455,29 @@ function _date_grain_widget_hour(date, instance, attributes, value_set, value2_s catch (error) { console.log('_date_grain_widget_hour', error); } } +function _date_grain_widget_ampm(date, instance, attributes, value_set, value2_set, item_date, military) { + try { + + var ampm = parseInt(date.getHours()) < 12 ? 'am' : 'pm'; + + if (value_set) { + ampm = parseInt(item_date.getHours()) < 12 ? 'am' : 'pm'; + } + + return { + // prefix: theme('date_label', { title: t('AM/PM') }), + type: 'date_select', + value: ampm, + attributes: attributes, + options: { + am: 'am', + pm: 'pm' + } + }; + } + catch (error) { console.log('_date_grain_widget_day', error); } +} + function _date_grain_widget_minute(date, instance, attributes, value_set, value2_set, item_date, _value, increment) { try { // Determine the current minute. @@ -588,6 +652,8 @@ function date_military(instance) { function date_select_onchange(input, id, grain, military, increment, offset) { try { + // console.log('--- date_select_onchange --- function called ---'); + // @TODO - we may need the time zone offset placed here as well! // Are we setting a "to date"? @@ -596,6 +662,7 @@ function date_select_onchange(input, id, grain, military, increment, offset) { // Grab the current value (which may include both the "from" and "to" dates // separated by a pipe '|') var current_val = $('#' + id).val(); + // console.log('current_val', current_val); // Is there a "to date" already set on the current value? var todate_already_set = current_val.indexOf('|') != -1 ? true : false; @@ -606,37 +673,65 @@ function date_select_onchange(input, id, grain, military, increment, offset) { else { parts.push(current_val); } // Get the date for the current value, or just default to now. - //console.log('parts before', parts); + + // console.log('parts before', parts); + var date = null; - if (!current_val) { date = new Date(); } - else { + if (!current_val) { + // console.log('--- CURRENT VALUE NOT SET ---'); + + + if (date_apple_device()) { + // console.log('--- APPLE DEVICE ---'); + item_date = new Date(); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); + } else { + // console.log('--- NON APPLE DEVICE ---'); + date = new Date(); + } + + } else { // In case they set the "to date" before the "from date", give the "from date" a default value. if (!todate && empty(parts[0])) { parts[0] = date_yyyy_mm_dd_hh_mm_ss(); } - //Fixes iOS bug spaces must be replaced with T's - if (date_apple_device()) { + if (date_apple_device() && offset) { + + // TODO -- update to reflect code below + date = date_item_adjust_offset(date, offset); + + } else if (date_apple_device()) { + // console.log('--- APPLE DEVICE ---'); if (!todate) { - parts[0] = date_apple_cleanse(parts[0]); + item_date = new Date(date_apple_cleanse(parts[0])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); } else { if (todate_already_set) { - parts[1] = date_apple_cleanse(parts[1]); + item_date = new Date(date_apple_cleanse(parts[1])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); + } + } + } else { + if (!todate) { + date = new Date(parts[0]); + } else { + if (todate_already_set) { + date = new Date(parts[1]); + } else { + date = new Date(); } } - } - if (!todate) { date = new Date(parts[0]); } - else { - if (todate_already_set) { date = new Date(parts[1]); } - else { date = new Date(); } } - - if (date_apple_device() && offset) { date = date_item_adjust_offset(date, offset); } - + } - //console.log('parts after', parts); + + // console.log('parts after', parts); var input_val = $(input).val(); switch (grain) { @@ -651,42 +746,35 @@ function date_select_onchange(input, id, grain, military, increment, offset) { break; case 'hour': if (!military) { + + var currenthour = date.getHours(); + // console.log('input_val', input_val); + // console.log('date.getHours() BEFORE', date.getHours()); + // console.log('currenthour', currenthour); + + if (input_val == 'pm') { + if (date.getHours() < 12) { date.setHours(date.getHours() + 12); } + else { date.setHours(date.getHours()); } + } + else if (input_val == 'am') { date.setHours(date.getHours() - 12); } + input_val = parseInt(input_val); - var ampm_input = $('#' + $(input).attr('id').replace(grain, 'ampm')); - var ampm_input_value = $(ampm_input).val(); - switch (ampm_input_value) { - case 'am': - if (input_val == 12) { input_val = 0; } - date.setHours(input_val); - break; - case 'pm': - if (input_val == 12) { input_val = 0; } - date.setHours(input_val + 12); - break; + if (input_val >= 0 && currenthour > 12) { + date.setHours(input_val + 12); + } else if (input_val >= 0 && currenthour < 12) { + date.setHours(input_val); + } else if (input_val >= 0 && currenthour == 12) { + date.setHours(0); } + } else { date.setHours(input_val); } + + // console.log('date.getHours() AFTER', date.getHours()); + break; case 'minute': date.setMinutes(input_val); - break; - case 'ampm': - - // Stop if they picked the same val twice. - if (input.date_ampm_old_value == input_val || - ( - typeof input.date_ampm_old_value === 'undefined' && - $(input).attr('date_ampm_original_value') == input_val - ) - ) { return; } - - // Adjust the hours by +/- 12 as needed. - if (input_val == 'pm') { - if (date.getHours() < 12) { date.setHours(date.getHours() + 12); } - else { date.setHours(date.getHours()); } - } - else if (input_val == 'am') { date.setHours(date.getHours() - 12); } - break; } @@ -831,6 +919,8 @@ function date_tz_handling_is_date(field) { function _date_get_item_and_offset(items, delta, _value, value_set, value2_set, field) { try { + + console.log('--- function - _date_get_item_and_offset ---'); // Grab the item date and offset, if they are set, otherwise grab the current date/time. var item_date = null; @@ -838,17 +928,35 @@ function _date_get_item_and_offset(items, delta, _value, value_set, value2_set, if (value_set && _value == 'value') { if (items[delta].value.indexOf('|') != -1) { var parts = items[delta].value.split('|'); - item_date = new Date(!date_apple_device() ? parts[0] : date_apple_cleanse(parts[0])); + if(!date_apple_device()){ + item_date = new Date(parts[0]); + } else { + item_date = new Date(date_apple_cleanse(parts[0])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } } else { - item_date = new Date(!date_apple_device() ? items[delta].value : date_apple_cleanse(items[delta].value)); + if(!date_apple_device()){ + item_date = new Date(items[delta].value); + } else { + item_date = new Date(date_apple_cleanse(items[delta].value)); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } } if (items[delta].item && items[delta].item.offset) { offset = items[delta].item.offset; } } if (value2_set && _value == 'value2') { - item_date = new Date(!date_apple_device() ? items[delta].item.value2 : date_apple_cleanse(items[delta].item.value2)); + if(!date_apple_device()){ + item_date = new Date(items[delta].item.value2); + } else { + item_date = new Date(date_apple_cleanse(items[delta].item.value2)); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } if (items[delta].item && items[delta].item.offset2) { offset = items[delta].item.offset2; } @@ -1002,7 +1110,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val // Do we have an item? var have_item = typeof form.elements[field.field_name][langcode][delta].item !== 'undefined'; - //console.log('BYE', form_state_value, field, instance); + // console.log('BYE', form_state_value, field, instance); // On iOS we must place a 'T' on the date. if (date_apple_device()) { form_state_value = date_apple_cleanse(form_state_value); } @@ -1022,7 +1130,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val if (todate_already_set) { parts = form_state_value.split('|'); } else { parts.push(form_state_value); } - //console.log('HELLO', form_state_value, parts, form_state_value); + // console.log('HELLO', form_state_value, parts, form_state_value); // Add timezone object to result, if necessary. if (date_tz_handling_is_date(field)) { @@ -1037,8 +1145,9 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val var date = null; if (_value == 'value') { - date = new Date(parts[0]); + // console.log('THE DATE before', date); if (have_item) { + // console.log('have_item', have_item); var offset = parseInt(form.elements[field.field_name][langcode][delta].item.offset); if (offset) { result.offset = offset; } if (date_apple_device() && offset) { @@ -1046,11 +1155,33 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val date = date.getTime() / 1000; date -= parseInt(offset); date = new Date(date * 1000); + } else if (date_apple_device()) { + // console.log('--- date_apple_device 1 ---'); + date = new Date(date_apple_cleanse(parts[0])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else {// + date = new Date(parts[0]); + } + } else { + // console.log('does not have_item', have_item); + if (date_apple_device() && offset) { + date = new Date(date.toUTCString()); + date = date.getTime() / 1000; + date -= parseInt(offset); + date = new Date(date * 1000); + } else if (date_apple_device()) { + // console.log('--- date_apple_device 2 ---'); + date = new Date(date_apple_cleanse(parts[0])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[0]); } } + // console.log('THE DATE after', date); } else if (_value == 'value2') { - date = new Date(parts[1]); if (have_item) { var offset2 = parseInt(form.elements[field.field_name][langcode][delta].item.offset2); if (offset2) { result.offset2 = offset2; } @@ -1059,6 +1190,25 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val date = date.getTime() / 1000; date -= parseInt(offset2); date = new Date(date * 1000); + } else if (date_apple_device()) { + date = new Date(date_apple_cleanse(parts[1])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[1]); + } + } else { + if (date_apple_device() && offset2) { + date = new Date(date.toUTCString()); + date = date.getTime() / 1000; + date -= parseInt(offset2); + date = new Date(date * 1000); + } else if (date_apple_device()) { + date = new Date(date_apple_cleanse(parts[1])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[1]); } } } @@ -1080,7 +1230,10 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val if (result[_value].hour >= 12) { result[_value].hour = result[_value].hour % 12; result[_value].ampm = 'pm'; + } else { + result[_value].ampm = 'am'; } + if (result[_value].hour == 0) { result[_value].hour = 12; } } break; case 'minute': @@ -1093,7 +1246,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val }); - //console.log('RESULT', result); + // console.log('RESULT', result); return result; } diff --git a/src/date.field-formatter.js b/src/date.field-formatter.js index 18a14df..2346aa0 100644 --- a/src/date.field-formatter.js +++ b/src/date.field-formatter.js @@ -7,7 +7,7 @@ function date_field_formatter_view(entity_type, entity, field, instance, langcod //console.log(field); //console.log(instance); //console.log(display); - //console.log(items); + //console.log('ITEMS', items); //console.log('date_formats', drupalgap.date_formats); //console.log('date_types', drupalgap.date_types); @@ -47,16 +47,67 @@ function date_field_formatter_view(entity_type, entity, field, instance, langcod // Now iterate over the items and render them using the format. // @TODO might need to do the "T" stuff for iOS and/or Safari $.each(items, function(delta, item) { - var value2_present = typeof item.value2 !== 'undefined' ? true: false; - var label = value2_present ? 'From: ' : ''; + + // prepare date formats + var format_full = 'D, j F Y - g:i a'; + var format_day = 'D, j F Y'; + var format_time = 'g:i a'; + + // prepare 'From:' date value var d = date_prepare(item.value); - element[delta] = { - markup: '
' + label + date(format, d.getTime()) + '
' - }; + + // check to see if there is a 'To:' date + var value2_present = typeof item.value2 !== 'undefined' ? true: false; + if (value2_present) { + + // prepare 'To:' date value var d2 = date_prepare(item.value2); - element[delta].markup += '
To: ' + date(format, d2.getTime()) + '
'; + + var from_day = date(format_day, d.getTime()); + var to_day = date(format_day, d2.getTime()); + + // get hour for 'To:' date + var to_hour = date('g', d2.getTime()); + + // correct the 0 hour to 12 for 12pm + if (to_hour == '0') { + var to_time = '12' + date(':i a', d2.getTime());; + } else { + var to_time = date(format_time, d2.getTime()); + } + + // get hour for 'From:' date + var from_hour = date('g', d.getTime()); + + if (from_hour == '0') { + var from_hour = '12' + date(':i a', d.getTime());; + } else { + var from_hour = date(format_time, d.getTime()); + } + + if (from_day == to_day) { + + element[delta] = { + markup: '
' + from_day + ' - ' + from_hour + ' to ' + to_time + '
' + }; + + } else { + + var label = value2_present ? 'From: ' : ''; + element[delta] = { + markup: '
' + label + date(format_full, d.getTime()) + '
' + }; + element[delta].markup += '
To: ' + date(format_full, d2.getTime()) + '
'; + + } + + } else { + element[delta] = { + markup: '
' + label + date(format_full, d.getTime()) + '
' + }; } + }); } @@ -85,4 +136,4 @@ function date_field_formatter_view(entity_type, entity, field, instance, langcod return element; } catch (error) { console.log('date_field_formatter_view - ' + error); } -} \ No newline at end of file +} diff --git a/src/date.field-widget.js b/src/date.field-widget.js index e4a4ead..a8016e0 100644 --- a/src/date.field-widget.js +++ b/src/date.field-widget.js @@ -34,14 +34,21 @@ function date_field_widget_form(form, form_state, field, instance, langcode, ite // on this item, otherwise the DG FAPI will default it to the item's value, which is only the first part of the // date. if (value2_set && items[delta].value.indexOf('|') == -1) { - items[delta].value += '|' + items[delta].value2; + items[delta].value += '|' + items[delta].item.value2; if (!items[delta].attributes) { items[delta].attributes = {}; } items[delta].attributes.value = items[delta].value; } // Grab the current date. - var date = new Date(); - + if (date_apple_device()) { + // console.log('--- APPLE DEVICE --- (Grab the current date)'); + var date = new Date(); + var date = date.getTime() + (date.getTimezoneOffset() * 60000); + var date = new Date(date); + } else { + // console.log('--- NON APPLE DEVICE --- (Grab the current date)'); + var date = new Date(); + } // Depending if we are collecting an end date or not, build a widget for each date value. var values = ['value']; @@ -106,26 +113,9 @@ function date_field_widget_form(form, form_state, field, instance, langcode, ite case 'hour': _widget_hour = _date_grain_widget_hour(date, instance, attributes, value_set, value2_set, item_date, military); - // Add an am/pm selector if we're not in military time. Hang onto the old value so we - // can prevent the +/- 12 adjustment from happening if the user selects the same - // thing twice. + // Add an am/pm selector if we're not in military time. if (!military) { - var onclick = attributes.onchange.replace(grain, 'ampm') + - '; this.date_ampm_old_value = this.value;'; - var ampm_value = parseInt(item_date.getHours()) < 12 ? 'am' : 'pm'; - _widget_ampm = { - type: 'select', - attributes: { - id: attributes.id.replace(grain, 'ampm'), - onclick: onclick, - date_ampm_original_value: ampm_value - }, - value: ampm_value, - options: { - am: 'am', - pm: 'pm' - } - }; + _widget_ampm = _date_grain_widget_ampm(date, instance, attributes, value_set, value2_set, item_date, military); } break; diff --git a/src/date.grains.js b/src/date.grains.js index 2754ec3..01c3377 100644 --- a/src/date.grains.js +++ b/src/date.grains.js @@ -1,3 +1,6 @@ +/** + * + */ function _date_grain_widget_year(date, instance, attributes, value_set, value2_set, item_date) { try { // Determine the current year and the range of year(s) to provide @@ -127,6 +130,29 @@ function _date_grain_widget_hour(date, instance, attributes, value_set, value2_s catch (error) { console.log('_date_grain_widget_hour', error); } } +function _date_grain_widget_ampm(date, instance, attributes, value_set, value2_set, item_date, military) { + try { + + var ampm = parseInt(date.getHours()) < 12 ? 'am' : 'pm'; + + if (value_set) { + ampm = parseInt(item_date.getHours()) < 12 ? 'am' : 'pm'; + } + + return { + // prefix: theme('date_label', { title: t('AM/PM') }), + type: 'date_select', + value: ampm, + attributes: attributes, + options: { + am: 'am', + pm: 'pm' + } + }; + } + catch (error) { console.log('_date_grain_widget_day', error); } +} + function _date_grain_widget_minute(date, instance, attributes, value_set, value2_set, item_date, _value, increment) { try { // Determine the current minute. @@ -236,4 +262,3 @@ function _date_grain_widgets_ux_wrap(items, delta, _widget_year, _widget_month, if (ymd_grid) { items[delta].children.push({ markup: '' }); } } catch (error) { console.log('_date_grain_widgets_ux_wrap', error); } -} \ No newline at end of file diff --git a/src/date.helpers.js b/src/date.helpers.js index 3b7e3b8..c743e98 100644 --- a/src/date.helpers.js +++ b/src/date.helpers.js @@ -62,6 +62,8 @@ function date_military(instance) { function date_select_onchange(input, id, grain, military, increment, offset) { try { + // console.log('--- date_select_onchange --- function called ---'); + // @TODO - we may need the time zone offset placed here as well! // Are we setting a "to date"? @@ -70,6 +72,7 @@ function date_select_onchange(input, id, grain, military, increment, offset) { // Grab the current value (which may include both the "from" and "to" dates // separated by a pipe '|') var current_val = $('#' + id).val(); + // console.log('current_val', current_val); // Is there a "to date" already set on the current value? var todate_already_set = current_val.indexOf('|') != -1 ? true : false; @@ -80,37 +83,65 @@ function date_select_onchange(input, id, grain, military, increment, offset) { else { parts.push(current_val); } // Get the date for the current value, or just default to now. - //console.log('parts before', parts); + + // console.log('parts before', parts); + var date = null; - if (!current_val) { date = new Date(); } - else { + if (!current_val) { + // console.log('--- CURRENT VALUE NOT SET ---'); + + + if (date_apple_device()) { + // console.log('--- APPLE DEVICE ---'); + item_date = new Date(); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); + } else { + // console.log('--- NON APPLE DEVICE ---'); + date = new Date(); + } + + } else { // In case they set the "to date" before the "from date", give the "from date" a default value. if (!todate && empty(parts[0])) { parts[0] = date_yyyy_mm_dd_hh_mm_ss(); } - //Fixes iOS bug spaces must be replaced with T's - if (date_apple_device()) { + if (date_apple_device() && offset) { + + // TODO -- update to reflect code below + date = date_item_adjust_offset(date, offset); + + } else if (date_apple_device()) { + // console.log('--- APPLE DEVICE ---'); if (!todate) { - parts[0] = date_apple_cleanse(parts[0]); + item_date = new Date(date_apple_cleanse(parts[0])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); } else { if (todate_already_set) { - parts[1] = date_apple_cleanse(parts[1]); + item_date = new Date(date_apple_cleanse(parts[1])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + date = new Date(item_date); + } + } + } else { + if (!todate) { + date = new Date(parts[0]); + } else { + if (todate_already_set) { + date = new Date(parts[1]); + } else { + date = new Date(); } } - } - if (!todate) { date = new Date(parts[0]); } - else { - if (todate_already_set) { date = new Date(parts[1]); } - else { date = new Date(); } } - - if (date_apple_device() && offset) { date = date_item_adjust_offset(date, offset); } - + } - //console.log('parts after', parts); + + // console.log('parts after', parts); var input_val = $(input).val(); switch (grain) { @@ -125,42 +156,35 @@ function date_select_onchange(input, id, grain, military, increment, offset) { break; case 'hour': if (!military) { + + var currenthour = date.getHours(); + // console.log('input_val', input_val); + // console.log('date.getHours() BEFORE', date.getHours()); + // console.log('currenthour', currenthour); + + if (input_val == 'pm') { + if (date.getHours() < 12) { date.setHours(date.getHours() + 12); } + else { date.setHours(date.getHours()); } + } + else if (input_val == 'am') { date.setHours(date.getHours() - 12); } + input_val = parseInt(input_val); - var ampm_input = $('#' + $(input).attr('id').replace(grain, 'ampm')); - var ampm_input_value = $(ampm_input).val(); - switch (ampm_input_value) { - case 'am': - if (input_val == 12) { input_val = 0; } - date.setHours(input_val); - break; - case 'pm': - if (input_val == 12) { input_val = 0; } - date.setHours(input_val + 12); - break; + if (input_val >= 0 && currenthour > 12) { + date.setHours(input_val + 12); + } else if (input_val >= 0 && currenthour < 12) { + date.setHours(input_val); + } else if (input_val >= 0 && currenthour == 12) { + date.setHours(0); } + } else { date.setHours(input_val); } + + // console.log('date.getHours() AFTER', date.getHours()); + break; case 'minute': date.setMinutes(input_val); - break; - case 'ampm': - - // Stop if they picked the same val twice. - if (input.date_ampm_old_value == input_val || - ( - typeof input.date_ampm_old_value === 'undefined' && - $(input).attr('date_ampm_original_value') == input_val - ) - ) { return; } - - // Adjust the hours by +/- 12 as needed. - if (input_val == 'pm') { - if (date.getHours() < 12) { date.setHours(date.getHours() + 12); } - else { date.setHours(date.getHours()); } - } - else if (input_val == 'am') { date.setHours(date.getHours() - 12); } - break; } @@ -305,6 +329,8 @@ function date_tz_handling_is_date(field) { function _date_get_item_and_offset(items, delta, _value, value_set, value2_set, field) { try { + + console.log('--- function - _date_get_item_and_offset ---'); // Grab the item date and offset, if they are set, otherwise grab the current date/time. var item_date = null; @@ -312,17 +338,35 @@ function _date_get_item_and_offset(items, delta, _value, value_set, value2_set, if (value_set && _value == 'value') { if (items[delta].value.indexOf('|') != -1) { var parts = items[delta].value.split('|'); - item_date = new Date(!date_apple_device() ? parts[0] : date_apple_cleanse(parts[0])); + if(!date_apple_device()){ + item_date = new Date(parts[0]); + } else { + item_date = new Date(date_apple_cleanse(parts[0])); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } } else { - item_date = new Date(!date_apple_device() ? items[delta].value : date_apple_cleanse(items[delta].value)); + if(!date_apple_device()){ + item_date = new Date(items[delta].value); + } else { + item_date = new Date(date_apple_cleanse(items[delta].value)); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } } if (items[delta].item && items[delta].item.offset) { offset = items[delta].item.offset; } } if (value2_set && _value == 'value2') { - item_date = new Date(!date_apple_device() ? items[delta].item.value2 : date_apple_cleanse(items[delta].item.value2)); + if(!date_apple_device()){ + item_date = new Date(items[delta].item.value2); + } else { + item_date = new Date(date_apple_cleanse(items[delta].item.value2)); + item_date = item_date.getTime() + (item_date.getTimezoneOffset() * 60000); + item_date = new Date(item_date); + } if (items[delta].item && items[delta].item.offset2) { offset = items[delta].item.offset2; } diff --git a/src/date.hooks.js b/src/date.hooks.js index 622573a..e6007a0 100644 --- a/src/date.hooks.js +++ b/src/date.hooks.js @@ -24,7 +24,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val // Do we have an item? var have_item = typeof form.elements[field.field_name][langcode][delta].item !== 'undefined'; - //console.log('BYE', form_state_value, field, instance); + // console.log('BYE', form_state_value, field, instance); // On iOS we must place a 'T' on the date. if (date_apple_device()) { form_state_value = date_apple_cleanse(form_state_value); } @@ -44,7 +44,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val if (todate_already_set) { parts = form_state_value.split('|'); } else { parts.push(form_state_value); } - //console.log('HELLO', form_state_value, parts, form_state_value); + // console.log('HELLO', form_state_value, parts, form_state_value); // Add timezone object to result, if necessary. if (date_tz_handling_is_date(field)) { @@ -59,8 +59,9 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val var date = null; if (_value == 'value') { - date = new Date(parts[0]); + // console.log('THE DATE before', date); if (have_item) { + // console.log('have_item', have_item); var offset = parseInt(form.elements[field.field_name][langcode][delta].item.offset); if (offset) { result.offset = offset; } if (date_apple_device() && offset) { @@ -68,11 +69,33 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val date = date.getTime() / 1000; date -= parseInt(offset); date = new Date(date * 1000); + } else if (date_apple_device()) { + // console.log('--- date_apple_device 1 ---'); + date = new Date(date_apple_cleanse(parts[0])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else {// + date = new Date(parts[0]); + } + } else { + // console.log('does not have_item', have_item); + if (date_apple_device() && offset) { + date = new Date(date.toUTCString()); + date = date.getTime() / 1000; + date -= parseInt(offset); + date = new Date(date * 1000); + } else if (date_apple_device()) { + // console.log('--- date_apple_device 2 ---'); + date = new Date(date_apple_cleanse(parts[0])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[0]); } } + // console.log('THE DATE after', date); } else if (_value == 'value2') { - date = new Date(parts[1]); if (have_item) { var offset2 = parseInt(form.elements[field.field_name][langcode][delta].item.offset2); if (offset2) { result.offset2 = offset2; } @@ -81,6 +104,25 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val date = date.getTime() / 1000; date -= parseInt(offset2); date = new Date(date * 1000); + } else if (date_apple_device()) { + date = new Date(date_apple_cleanse(parts[1])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[1]); + } + } else { + if (date_apple_device() && offset2) { + date = new Date(date.toUTCString()); + date = date.getTime() / 1000; + date -= parseInt(offset2); + date = new Date(date * 1000); + } else if (date_apple_device()) { + date = new Date(date_apple_cleanse(parts[1])); + date = date.getTime() + (date.getTimezoneOffset() * 60000); + date = new Date(date); + } else { + date = new Date(parts[1]); } } } @@ -102,7 +144,10 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val if (result[_value].hour >= 12) { result[_value].hour = result[_value].hour % 12; result[_value].ampm = 'pm'; + } else { + result[_value].ampm = 'am'; } + if (result[_value].hour == 0) { result[_value].hour = 12; } } break; case 'minute': @@ -115,7 +160,7 @@ function date_assemble_form_state_into_field(entity_type, bundle, form_state_val }); - //console.log('RESULT', result); + // console.log('RESULT', result); return result; }