| Current File : /home/bwalansa/www/wp-content/plugins/the-events-calendar/src/resources/js/events-admin.js |
/*
* Date Format 1.2.3
* (c) 2007-2009 Steven Levithan <stevenlevithan.com>
* MIT license
*
* Includes enhancements by Scott Trenda <scott.trenda.net>
* and Kris Kowal <cixar.com/~kris.kowal/>
*
* Accepts a date, a mask, or a date and a mask.
* Returns a formatted version of the given date.
* The date defaults to the current date/time.
* The mask defaults to dateFormat.masks.default.
* todo: now used in multiple places, lets consolidate. Also, should events-admin really be powering community fe form?
*/
var tribeDateFormat = function() {
var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
timezoneClip = /[^-+\dA-Z]/g,
pad = function( val, len ) {
val = String( val );
len = len || 2;
while ( val.length < len ) {
val = "0" + val;
}
return val;
};
// Regexes and supporting functions are cached through closure
return function( date, mask, utc ) {
var dF = tribeDateFormat;
// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
if ( arguments.length == 1 && Object.prototype.toString.call( date ) == "[object String]" && !/\d/.test( date ) ) {
mask = date;
date = undefined;
}
if ( typeof date === 'string' ) {
date = date.replace( /-/g, "/" );
}
// Passing date through Date applies Date.parse, if necessary
date = date ? new Date( date ) : new Date;
if ( isNaN( date ) ) {
return;
}
mask = String( dF.masks[mask] || mask || dF.masks["default"] );
// Allow setting the utc argument via the mask
if ( mask.slice( 0, 4 ) == "UTC:" ) {
mask = mask.slice( 4 );
utc = true;
}
var _ = utc ? "getUTC" : "get",
d = date[_ + "Date"](),
D = date[_ + "Day"](),
m = date[_ + "Month"](),
y = date[_ + "FullYear"](),
H = date[_ + "Hours"](),
M = date[_ + "Minutes"](),
s = date[_ + "Seconds"](),
L = date[_ + "Milliseconds"](),
o = utc ? 0 : date.getTimezoneOffset(),
flags = {
d : d,
dd : pad( d ),
ddd : dF.i18n.dayNames[D],
dddd: dF.i18n.dayNames[D + 7],
m : m + 1,
mm : pad( m + 1 ),
mmm : dF.i18n.monthNames[m],
mmmm: dF.i18n.monthNames[m + 12],
yy : String( y ).slice( 2 ),
yyyy: y,
h : H % 12 || 12,
hh : pad( H % 12 || 12 ),
H : H,
HH : pad( H ),
M : M,
MM : pad( M ),
s : s,
ss : pad( s ),
l : pad( L, 3 ),
L : pad( L > 99 ? Math.round( L / 10 ) : L ),
t : H < 12 ? "a" : "p",
tt : H < 12 ? "am" : "pm",
T : H < 12 ? "A" : "P",
TT : H < 12 ? "AM" : "PM",
Z : utc ? "UTC" : (String( date ).match( timezone ) || [""]).pop().replace( timezoneClip, "" ),
o : (o > 0 ? "-" : "+") + pad( Math.floor( Math.abs( o ) / 60 ) * 100 + Math.abs( o ) % 60, 4 ),
S : ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
};
return mask.replace( token, function( $0 ) {
return $0 in flags ? flags[$0] : $0.slice( 1, $0.length - 1 );
} );
};
}();
tribeDateFormat.masks = {
"default" : "ddd mmm dd yyyy HH:MM:ss",
"tribeQuery" : "yyyy-mm-dd",
"tribeMonthQuery": "yyyy-mm",
"0" : 'yyyy-mm-dd',
"1" : 'm/d/yyyy',
"2" : 'mm/dd/yyyy',
"3" : 'd/m/yyyy',
"4" : 'dd/mm/yyyy',
"5" : 'm-d-yyyy',
"6" : 'mm-dd-yyyy',
"7" : 'd-m-yyyy',
"8" : 'dd-mm-yyyy',
"m0" : 'yyyy-mm',
"m1" : 'm/yyyy',
"m2" : 'mm/yyyy',
"m3" : 'm/yyyy',
"m4" : 'mm/yyyy',
"m5" : 'm-yyyy',
"m6" : 'mm-yyyy',
"m7" : 'm-yyyy',
"m8" : 'mm-yyyy'
};
tribeDateFormat.i18n = {
dayNames : [
"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
],
monthNames: [
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
]
};
Date.prototype.format = function( mask, utc ) {
return tribeDateFormat( this, mask, utc );
};
var tribe_datepicker_opts = {};
jQuery( document ).ready( function( $ ) {
var $date_format = $( '[data-datepicker_format]' ),
$view_select = $( '.tribe-field-dropdown_select2 select' ),
viewCalLinkHTML = $( '#view-calendar-link-div' ).html(),
$template_select = $( 'select[name="tribeEventsTemplate"]' ),
$event_pickers = $( '#tribe-event-datepickers' ),
is_community_edit = $( 'body' ).is( '.tribe_community_edit' ),
datepicker_format = 0;
// Modified from tribe_ev.data to match jQuery UI formatting.
var datepicker_formats = {
'main' : ['yy-mm-dd', 'm/d/yy', 'mm/dd/yy', 'd/m/yy', 'dd/mm/yy', 'm-d-yy', 'mm-dd-yy', 'd-m-yy', 'dd-mm-yy'],
'month': ['yy-mm', 'm/yy', 'mm/yy', 'm/yy', 'mm/yy', 'm-yy', 'mm-yy', 'm-yy', 'mm-yy']
};
// Initialize Chosen and Select2.
$( '.chosen, .tribe-field-dropdown_chosen select' ).chosen();
$( '.select2' ).select2( {width: '250px'} );
$view_select.select2( {width: '250px'} );
// initialize the category hierarchy checkbox - scroll to closest checked checkbox
$( '[data-wp-lists="list:tribe_events_cat"]' ).each( function() {
var $list = $( this );
var $first = $list.find( ':checkbox:checked' ).first();
if ( ! $first.length ) {
return;
}
var top_position = $list.find( ':checkbox' ).position().top;
var checked_position = $first.position().top;
$list.closest( '.tabs-panel' ).scrollTop( checked_position - top_position + 5 );
} );
// Grab HTML from hidden Calendar link and append to Header on Event Listing Page
$( viewCalLinkHTML )
.insertAfter( '.edit-php.post-type-tribe_events #wpbody-content .wrap h2:eq(0) a' );
if ( $template_select.length && $template_select.val() === '' ) {
var t_name = $template_select.find( "option:selected" ).text();
$template_select
.prev( '.select2-container' )
.children()
.children( 'span' )
.text( t_name );
}
//not done by default on front end
function get_datepicker_num_months() {
return ( is_community_edit && $(window).width() < 768 ) ? 1 : 3;
}
var setup_organizer_fields = function() {
var saved_organizer_template = wp.template('tribe-select-organizer');
var create_organizer_template = wp.template('tribe-create-organizer');
var organizer_section = $('#event_organizer');
var organizer_rows = organizer_section.find('.saved_organizer');
organizer_section.on( 'click', '.tribe-add-organizer', function(e) {
e.preventDefault();
var dropdown = $( saved_organizer_template({}) );
if ( dropdown.find( '.nosaved' ).length ) {
var label = dropdown.find( 'label' );
label.text( label.data( 'l10n-create-organizer' ) );
dropdown.find( '.nosaved' ).remove();
}
var fields = $( create_organizer_template({}) );
organizer_section.find('tfoot').before( fields );
fields.prepend( dropdown );
fields.find('.chosen').chosen().trigger('change');
});
organizer_section.on('change', '.organizer-dropdown', toggle_organizer_fields);
organizer_rows.each( function () {
var row = $( this );
var group = row.closest( 'tbody' );
var fields = $( create_organizer_template( {} ) ).find( '.organizer' ); // we already have our tbody
var dropdown = row.find( '.organizer-dropdown' );
if ( dropdown.length ) {
var value = dropdown.val();
if ( value != '0' ) {
fields.hide();
}
} else if ( row.find( '.nosaved' ).length ) {
var label = row.find( 'label' );
label.text( label.data( 'l10n-create-organizer' ) );
row.find( '.nosaved' ).remove();
}
group.append( fields );
} );
organizer_section.on( 'click', '.delete-organizer-group', function(e) {
e.preventDefault();
var group = $(this).closest( 'tbody' );
group.fadeOut( 500, function() { $(this).remove(); } );
});
var sortable_items = '> tbody';
if ( ! $( 'body' ).hasClass( 'wp-admin' ) ) {
sortable_items = 'table ' + sortable_items;
}
organizer_section.sortable({
items: sortable_items,
handle: '.move-organizer-group',
axis: 'y',
delay: 100,
});
};
var toggle_organizer_fields = function() {
var dropdown = $(this);
var selected_organizer_id = dropdown.val();
var group = dropdown.closest('tbody');
var edit_link = group.find('.edit-organizer-link a');
var edit_link_base_url = edit_link.attr( 'data-admin-url' );
if ( selected_organizer_id != '0' ) {
group.find('.organizer').fadeOut().find('input').val('');
edit_link.attr( 'href', edit_link_base_url + selected_organizer_id).show();
} else {
group.find('.organizer').fadeIn();
edit_link.hide();
}
};
$( '.hide-if-js' )
.hide();
if ( typeof(TEC) !== 'undefined' ) {
var _MS_PER_DAY = 1000 * 60 * 60 * 24;
var date_format = 'yy-mm-dd';
if ( $date_format.length && $date_format.attr( 'data-datepicker_format' ).length === 1 ) {
datepicker_format = $date_format.attr( 'data-datepicker_format' );
date_format = datepicker_formats.main[ datepicker_format ];
}
function date_diff_in_days( a, b ) {
var utc1 = Date.UTC( a.getFullYear(), a.getMonth(), a.getDate() );
var utc2 = Date.UTC( b.getFullYear(), b.getMonth(), b.getDate() );
return Math.floor( (utc2 - utc1) / _MS_PER_DAY );
}
var startofweek = 0;
if ( $event_pickers.length ) {
startofweek = $event_pickers.data( 'startofweek' );
}
var $end_date = $( '#EventEndDate' );
tribe_datepicker_opts = {
dateFormat : date_format,
showAnim : 'fadeIn',
changeMonth : true,
changeYear : true,
numberOfMonths : get_datepicker_num_months(),
firstDay : startofweek,
showButtonPanel: true,
beforeShow : function( element, object ) {
object.input.datepicker( 'option', 'numberOfMonths', get_datepicker_num_months() );
object.input.data( 'prevDate', object.input.datepicker( "getDate" ) );
},
onSelect : function( selectedDate ) {
var option = this.id == 'EventStartDate' ? 'minDate' : 'maxDate';
var instance = $( this ).data( "datepicker" );
var date = $.datepicker.parseDate( instance.settings.dateFormat || $.datepicker._defaults.dateFormat, selectedDate, instance.settings );
if ( this.id === 'EventStartDate' ) {
var startDate = $( '#EventStartDate' ).data( 'prevDate' );
var dateDif = null == startDate ? 0 : date_diff_in_days( startDate, $end_date.datepicker( 'getDate' ) );
var endDate = new Date( date.setDate( date.getDate() + dateDif ) );
$end_date
.datepicker( 'option', option, endDate )
.datepicker( 'setDate', endDate );
} else {
dates
.not( this )
.not( '.tribe-no-end-date-update' )
.datepicker( 'option', option, date );
}
}
};
$.extend( tribe_datepicker_opts, TEC );
var dates = $( '.tribe-datepicker' ).datepicker( tribe_datepicker_opts );
var $all_day_check = $( '#allDayCheckbox' );
var $tod_options = $( ".timeofdayoptions" );
var $time_format = $( "#EventTimeFormatDiv" );
var $start_end_month = $( "select[name='EventStartMonth'], select[name='EventEndMonth']" );
var $start_month = $( "select[name='EventStartMonth']" );
var $end_month = $( 'select[name="EventEndMonth"]' );
var selectObject;
if ( is_community_edit ) {
var $els = {
start : $event_pickers.find( '#EventStartDate' ),
end : $event_pickers.next( 'tr' ).find( '#EventEndDate' ),
};
$.each( $els, function( i, el ) {
var $el = $(el);
( '' !== $el.val() ) && $el.val( tribeDateFormat( $el.val(), datepicker_format ) );
})
}
// toggle time input
function toggleDayTimeDisplay() {
if ( $all_day_check.prop( 'checked' ) === true ) {
$tod_options.hide();
$time_format.hide();
}
else {
$tod_options.show();
$time_format.show();
}
}
$all_day_check
.click( function() {
toggleDayTimeDisplay();
} );
toggleDayTimeDisplay();
var tribeDaysPerMonth = [29, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
// start and end date select sections
var tribeStartDays = [ $( '#28StartDays' ), $( '#29StartDays' ), $( '#30StartDays' ), $( '#31StartDays' ) ],
tribeEndDays = [ $( '#28EndDays' ), $( '#29EndDays' ), $( '#30EndDays' ), $( '#31EndDays' ) ];
$start_end_month.change( function() {
var t = $( this );
var startEnd = t.attr( "name" );
// get changed select field
if ( startEnd == 'EventStartMonth' ) {
startEnd = 'Start';
}
else {
startEnd = 'End';
}
// show/hide date lists according to month
var chosenMonth = t.attr( "value" );
if ( chosenMonth.charAt( 0 ) == '0' ) {
chosenMonth = chosenMonth.replace( '0', '' );
}
// leap year
var remainder = $( "select[name='Event" + startEnd + "Year']" ).attr( "value" ) % 4;
if ( chosenMonth == 2 && remainder == 0 ) {
chosenMonth = 0;
}
// preserve selected option
var currentDateField = $( "select[name='Event" + startEnd + "Day']" );
$( '.event' + startEnd + 'DateField' ).remove();
if ( startEnd == "Start" ) {
selectObject = tribeStartDays[ tribeDaysPerMonth[ chosenMonth ] - 28 ];
selectObject.val( currentDateField.val() );
$start_month.after( selectObject );
}
else {
selectObject = tribeEndDays[ tribeDaysPerMonth[ chosenMonth ] - 28 ];
selectObject.val( currentDateField.val() );
$end_month.after( selectObject );
}
} );
$start_end_month.change();
$( "select[name='EventStartYear']" ).change( function() {
$start_month.change();
} );
$( "select[name='EventEndYear']" ).change( function() {
$end_month.change();
} );
// hide unnecessary fields
var venueFields = $( ".venue" ),
savedVenue = $( "#saved_venue" );
if ( savedVenue.length > 0 && savedVenue.val() != '0' ) {
venueFields.hide();
$( '[name="venue[Venue]"]' ).val( '' );
}
savedVenue.change( function() {
var selected_venue_id = $(this).val(),
current_edit_link = $('.edit-venue-link a').attr( 'data-admin-url' );
if ( selected_venue_id == '0' ) {
venueFields.fadeIn();
$( "#EventCountry" ).val( 0 ).trigger( "chosen:updated" );
$( "#StateProvinceSelect" ).val( 0 ).trigger( "chosen:updated" );
tribeShowHideCorrectStateProvinceInput( '' );
$('.edit-venue-link').hide();
}
else {
venueFields.fadeOut();
$('.edit-venue-link').show();
// Change edit link
$('.edit-venue-link a').attr( 'href', current_edit_link + selected_venue_id );
}
} );
setup_organizer_fields();
}
//show state/province input based on first option in countries list, or based on user input of country
var $state_prov_chzn = $( "#StateProvinceSelect_chosen" ),
$state_prov_text = $( "#StateProvinceText" );
function tribeShowHideCorrectStateProvinceInput( country ) {
if ( country == 'US' || country == 'United States' ) {
$state_prov_chzn.show();
$state_prov_text.hide();
}
else if ( country != '' ) {
$state_prov_text.show();
$state_prov_chzn.hide();
}
else {
$state_prov_text.hide();
$state_prov_chzn.hide();
}
}
tribeShowHideCorrectStateProvinceInput( $( "#EventCountry > option:selected" ).val() );
$( "#EventCountry" ).change( function() {
var countryLabel = $( this ).find( 'option:selected' ).val();
tribeShowHideCorrectStateProvinceInput( countryLabel );
} );
// EventCoordinates
var overwriteCoordinates = {
$container: $( '#overwrite_coordinates' )
};
overwriteCoordinates.$lat = overwriteCoordinates.$container.find( '#VenueLatitude' );
overwriteCoordinates.$lng = overwriteCoordinates.$container.find( '#VenueLongitude' );
overwriteCoordinates.$fields = $('').add( overwriteCoordinates.$lat ).add( overwriteCoordinates.$lng );
overwriteCoordinates.$toggle = overwriteCoordinates.$container.find( '#VenueOverwriteCoords' ).on( 'change', function( event ){
if ( overwriteCoordinates.$toggle.is(':checked') ) {
overwriteCoordinates.$fields.prop( 'disabled', false ).removeClass( 'hidden' );
} else {
overwriteCoordinates.$fields.prop( 'disabled', true ).addClass( 'hidden' );
}
} );
overwriteCoordinates.$toggle.trigger( 'change' );
$( '#EventInfo input, #EventInfo select' ).change( function() {
$( '.rec-error' ).hide();
} );
var eventSubmitButton = $( '.wp-admin.events-cal #post #publishing-action input[type="submit"]' );
eventSubmitButton.click( function() {
$( this ).data( 'clicked', true );
} );
// Workaround for venue & organizer post types when editing or adding
// so events parent menu stays open and active
if ( $( 'body' ).hasClass( 'post-type-tribe_venue' ) ) {
$( '#menu-posts-tribe_events, #menu-posts-tribe_events a.wp-has-submenu' )
.addClass( 'wp-menu-open wp-has-current-submenu wp-has-submenu' )
.removeClass( 'wp-not-current-submenu' )
.find( "li a[href='edit.php?post_type=tribe_venue']" )
.parent()
.addClass( 'current' );
}
if ( $( 'body' ).hasClass( 'post-type-tribe_organizer' ) ) {
$( '#menu-posts-tribe_events, #menu-posts-tribe_events a.wp-has-submenu' )
.addClass( 'wp-menu-open wp-has-current-submenu wp-has-submenu' )
.removeClass( 'wp-not-current-submenu' )
.find( "li a[href='edit.php?post_type=tribe_organizer']" )
.parent()
.addClass( 'current' );
}
// Default Layout Settings
// shows / hides proper views that are to be used on front-end
var $tribe_views = $( '#tribe-field-tribeEnableViews' );
if ( $tribe_views.length ) {
var $default_view_select = $( '.tribe-field-dropdown_select2 select[name="viewOption"]' ),
$view_inputs = $tribe_views.find( 'input:checkbox' ),
$view_desc = $( '#tribe-field-tribeEnableViews .tribe-field-wrap p.description' ),
view_options = {};
function create_view_array() {
$default_view_select
.find( 'option' )
.each( function() {
var $this = $( this );
view_options[$this.attr( 'value' )] = $this.text();
} );
}
function set_selected_views() {
// Store the default view chosen prior to this change
var prev_default_view = $default_view_select
.find( "option:selected" )
.first()
.val();
$default_view_select
.find( 'option' )
.remove();
$view_inputs
.each( function() {
var $this = $( this );
if ( $this.is( ':checked' ) ) {
var value = $this.val();
$default_view_select
.append( '<option value="' + value + '">' + view_options[value] + '</option>' );
}
} );
// Test to see if the previous default view is still available...
var $prev_default_option = $default_view_select.find( "option[value='" + prev_default_view + "']" );
// ...if it is, keep it as the default (else switch to the first available remaining option)
if ( 1 === $prev_default_option.length ) {
$prev_default_option
.attr( 'selected', 'selected' );
} else {
$default_view_select
.find( 'option' )
.first()
.attr( 'selected', 'selected' );
}
$default_view_select
.select2( 'destroy' )
.select2( {width: '250px'} );
}
create_view_array();
$tribe_views
.on( 'change', 'input:checkbox', function() {
var $this = $( this );
if ( $( '[name="tribeEnableViews[]"]:checked' ).length < 1 ) {
$this.attr( 'checked', true );
$view_desc.css( 'color', 'red' );
}
else {
$view_desc.removeAttr( 'style' );
}
set_selected_views();
} );
}
/**
* Capture the community "Add" form on submit to ensure safe date format.
*/
$( '#tribe-community-events.form form' ).on( 'submit', function() {
var $els = {
start: $event_pickers.find( '#EventStartDate' ),
end : $event_pickers.next( 'tr' ).find( '#EventEndDate' )
};
$els.start.val( tribeDateFormat( $els.start.datepicker( 'getDate' ), 'tribeQuery' ) );
$els.end.val( tribeDateFormat( $els.end.datepicker( 'getDate' ), 'tribeQuery' ) );
$event_pickers.parent().find( '.tribe-no-end-date-update' ).each( function() {
$el = $( this );
if ( ! $el.is( ':visible' ) ) {
return;
}
$el.val( tribeDateFormat( $el.datepicker( 'getDate' ), 'tribeQuery' ) );
} );
} );
});
/**
* Re-initialize chosen on widgets when moved
* credits: http://www.johngadbois.com/adding-your-own-callbacks-to-wordpress-ajax-requests/
*/
jQuery( document ).ajaxSuccess( function( e, xhr, settings ) {
if ( typeof settings !== 'undefined' && typeof settings.data !== 'undefined' && settings.data.search( 'action=save-widget' ) != - 1 ) {
jQuery( "#widgets-right .chosen" ).chosen();
}
} );
/**
* Manage the timezone selector user interface.
*/
jQuery( document ).ready( function( $ ) {
var $row = $( "#EventInfo" ).find( "tr.event-timezone" );
var $label = $row.find( "label" );
var $selector = $row.find( "select" );
var $dropdown = $row.find( ".chosen-container" );
var $selector_cell = $selector.parent( "td" );
var label_text = $label.html();
var selected_tz = $selector.find( "option:selected").html();
var tz_link = "<a href='#' class='change_tz'>" + label_text + " " + selected_tz + "</a>";
$label.hide();
$dropdown.hide();
$selector_cell.append( tz_link );
$selector_cell.find( "a.change_tz" ).click( function( event ) {
event.stopImmediatePropagation();
$( this ).hide();
$dropdown.show();
return false;
} );
} );