1jQuery(document).ready( function($){ 2 var load_ui_css = false; //load jquery ui css? 3 /* Time Entry */ 4 $('#start-time').each(function(i, el){ 5 $(el).addClass('em-time-input em-time-start').next('#end-time').addClass('em-time-input em-time-end').parent().addClass('em-time-range'); 6 }); 7 if( $(".em-time-input").length > 0 ){ 8 em_setup_timepicker('body'); 9 } 10 /* Calendar AJAX */ 11 $('.em-calendar-wrapper a').unbind("click"); 12 $('.em-calendar-wrapper a').undelegate("click"); 13 $('.em-calendar-wrapper').delegate('a.em-calnav, a.em-calnav', 'click', function(e){ 14 e.preventDefault(); 15 $(this).closest('.em-calendar-wrapper').prepend('<div class="loading" id="em-loading"></div>'); 16 var url = em_ajaxify($(this).attr('href')); 17 $(this).closest('.em-calendar-wrapper').load(url, function(){$(this).trigger('em_calendar_load');}); 18 } ); 19 20 //Events Search 21 $(document).delegate('.em-toggle', 'click change', function(e){ 22 e.preventDefault(); 23 //show or hide advanced tickets, hidden by default 24 var el = $(this); 25 var rel = el.attr('rel').split(':'); 26 if( el.hasClass('show-search') ){ 27 if( rel.length > 1 ){ el.closest(rel[1]).find(rel[0]).slideUp(); } 28 else{ $(rel[0]).slideUp(); } 29 el.find('.show, .show-advanced').show(); 30 el.find('.hide, .hide-advanced').hide(); 31 el.removeClass('show-search'); 32 }else{ 33 if( rel.length > 1 ){ el.closest(rel[1]).find(rel[0]).slideDown(); } 34 else{ $(rel[0]).slideDown(); } 35 el.find('.show, .show-advanced').hide(); 36 el.find('.hide, .hide-advanced').show(); 37 el.addClass('show-search'); 38 } 39 40 }); 41 if( EM.search_term_placeholder ){ 42 if( 'placeholder' in document.createElement('input') ){ 43 $('input.em-events-search-text, input.em-search-text').attr('placeholder', EM.search_term_placeholder); 44 }else{ 45 $('input.em-events-search-text, input.em-search-text').blur(function(){ 46 if( this.value=='' ) this.value = EM.search_term_placeholder; 47 }).focus(function(){ 48 if( this.value == EM.search_term_placeholder ) this.value=''; 49 }).trigger('blur'); 50 } 51 } 52 $('.em-search-form select[name=country]').change( function(){ 53 var el = $(this); 54 $('.em-search select[name=state]').html('<option value="">'+EM.txt_loading+'</option>'); 55 $('.em-search select[name=region]').html('<option value="">'+EM.txt_loading+'</option>'); 56 $('.em-search select[name=town]').html('<option value="">'+EM.txt_loading+'</option>'); 57 if( el.val() != '' ){ 58 el.closest('.em-search-location').find('.em-search-location-meta').slideDown(); 59 var data = { 60 action : 'search_states', 61 country : el.val(), 62 return_html : true 63 }; 64 $('.em-search select[name=state]').load( EM.ajaxurl, data ); 65 data.action = 'search_regions'; 66 $('.em-search select[name=region]').load( EM.ajaxurl, data ); 67 data.action = 'search_towns'; 68 $('.em-search select[name=town]').load( EM.ajaxurl, data ); 69 }else{ 70 el.closest('.em-search-location').find('.em-search-location-meta').slideUp(); 71 } 72 }); 73 74 $('.em-search-form select[name=region]').change( function(){ 75 $('.em-search select[name=state]').html('<option value="">'+EM.txt_loading+'</option>'); 76 $('.em-search select[name=town]').html('<option value="">'+EM.txt_loading+'</option>'); 77 var data = { 78 action : 'search_states', 79 region : $(this).val(), 80 country : $('.em-search-form select[name=country]').val(), 81 return_html : true 82 }; 83 $('.em-search select[name=state]').load( EM.ajaxurl, data ); 84 data.action = 'search_towns'; 85 $('.em-search select[name=town]').load( EM.ajaxurl, data ); 86 }); 87 88 $('.em-search-form select[name=state]').change( function(){ 89 $('.em-search select[name=town]').html('<option value="">'+EM.txt_loading+'</option>'); 90 var data = { 91 action : 'search_towns', 92 state : $(this).val(), 93 region : $('.em-search-form select[name=region]').val(), 94 country : $('.em-search-form select[name=country]').val(), 95 return_html : true 96 }; 97 $('.em-search select[name=town]').load( EM.ajaxurl, data ); 98 }); 99 100 //in order for this to work, you need the above classes to be present in your templates 101 $(document).delegate('.em-search-form, .em-events-search-form', 'submit', function(e){
102 var form = $(this); 103 if( this.em_search && this.em_search.value == EM.txt_search){ this.em_search.value = ''; } 104 var results_wrapper = form.closest('.em-search-wrapper').find('.em-search-ajax'); 105 if( results_wrapper.length == 0 ) results_wrapper = $('.em-search-ajax'); 106 if( results_wrapper.length > 0 ){ 107 results_wrapper.append('<div class="loading" id="em-loading"></div>'); 108 var submitButton = form.find('.em-search-submit'); 109 submitButton.data('buttonText', submitButton.val()).val(EM.txt_searching); 110 var img = submitButton.children('img'); 111 if( img.length > 0 ) img.attr('src', img.attr('src').replace('search-mag.png', 'search-loading.gif')); 112 var vars = form.serialize(); 113 $.ajax( EM.ajaxurl, { 114 type : 'POST', 115 dataType : 'html', 116 data : vars, 117 success : function(responseText){ 118 submitButton.val(submitButton.data('buttonText')); 119 if( img.length > 0 ) img.attr('src', img.attr('src').replace('search-loading.gif', 'search-mag.png'));
120 results_wrapper.replaceWith(responseText); 121 if( form.find('input[name=em_search]').val() == '' ){ form.find('input[name=em_search]').val(EM.txt_search); } 122 //reload results_wrapper 123 results_wrapper = form.closest('.em-search-wrapper').find('.em-search-ajax'); 124 if( results_wrapper.length == 0 ) results_wrapper = $('.em-search-ajax'); 125 jQuery(document).triggerHandler('em_search_ajax', [vars, results_wrapper, e]); //ajax has loaded new results 126 } 127 }); 128 e.preventDefault(); 129 return false; 130 } 131 }); 132 if( $('.em-search-ajax').length > 0 ){ 133 $(document).delegate('.em-search-ajax a.page-numbers', 'click', function(e){ 134 var a = $(this); 135 var data = a.closest('.em-pagination').attr('data-em-ajax'); 136 var wrapper = a.closest('.em-search-ajax'); 137 var wrapper_parent = wrapper.parent(); 138 var qvars = a.attr('href').split('?'); 139 var vars = qvars[1]; 140 //add data-em-ajax att if it exists 141 if( data != '' ){ 142 vars = vars != '' ? vars+'&'+data : data; 143 } 144 wrapper.append('<div class="loading" id="em-loading"></div>'); 145 $.ajax( EM.ajaxurl, { 146 type : 'POST', 147 dataType : 'html', 148 data : vars, 149 success : function(responseText) { 150 wrapper.replaceWith(responseText); 151 wrapper = wrapper_parent.find('.em-search-ajax'); 152 jQuery(document).triggerHandler('em_search_ajax', [vars, wrapper, e]); //ajax has loaded new results 153 } 154 }); 155 e.preventDefault(); 156 return false; 157 }); 158 } 159 160 /* 161 * ADMIN AREA AND PUBLIC FORMS (Still polishing this section up, note that form ids and classes may change accordingly) 162 */ 163 //Events List 164 //Approve/Reject Links 165 $('.events-table').on('click', '.em-event-delete', function(){ 166 if( !confirm("Are you sure you want to delete?") ){ return false; } 167 window.location.href = this.href; 168 }); 169 //Forms 170 $('#event-form #event-image-delete, #location-form #location-image-delete').on('click', function(){ 171 var el = $(this); 172 if( el.is(':checked') ){ 173 el.closest('.event-form-image, .location-form-image').find('#event-image-img, #location-image-img').hide(); 174 }else{ 175 el.closest('.event-form-image, .location-form-image').find('#event-image-img, #location-image-img').show(); 176 } 177 }); 178 //Tickets & Bookings 179 if( $("#em-tickets-form").length > 0 ){ 180 //Enable/Disable Bookings 181 $('#event-rsvp').click( function(event){ 182 if( !this.checked ){ 183 confirmation = confirm(EM.disable_bookings_warning); 184 if( confirmation == false ){ 185 event.preventDefault(); 186 }else{ 187 $('#event-rsvp-options').hide(); 188 } 189 }else{ 190 $('#event-rsvp-options').fadeIn(); 191 } 192 }); 193 if($('input#event-rsvp').is(":checked")) { 194 $("div#rsvp-data").fadeIn(); 195 } else { 196 $("div#rsvp-data").hide(); 197 } 198 //Ticket(s) UI 199 var reset_ticket_forms = function(){ 200 $('#em-tickets-form table tbody tr.em-tickets-row').show(); 201 $('#em-tickets-form table tbody tr.em-tickets-row-form').hide(); 202 }; 203 //recurrences and cut-off logic for ticket availability 204 if( $('#em-recurrence-checkbox').length > 0 ){ 205 $('#em-recurrence-checkbox').change(function(){ 206 if( $('#em-recurrence-checkbox').is(':checked') ){ 207 $('#em-tickets-form .ticket-dates-from-recurring, #em-tickets-form .ticket-dates-to-recurring, #event-rsvp-options .em-booking-date-recurring').show(); 208 $('#em-tickets-form .ticket-dates-from-normal, #em-tickets-form .ticket-dates-to-normal, #event-rsvp-options .em-booking-date-normal, #em-tickets-form .hidden').hide(); 209 }else{ 210 $('#em-tickets-form .ticket-dates-from-normal, #em-tickets-form .ticket-dates-to-normal, #event-rsvp-options .em-booking-date-normal').show(); 211 $('#em-tickets-form .ticket-dates-from-recurring, #em-tickets-form .ticket-dates-to-recurring, #event-rsvp-options .em-booking-date-recurring, #em-tickets-form .hidden').hide(); 212 } 213 }).trigger('change'); 214 }else if( $('#em-form-recurrence').length > 0 ){ 215 $('#em-tickets-form .ticket-dates-from-recurring, #em-tickets-form .ticket-dates-to-recurring, #event-rsvp-options .em-booking-date-recurring').show(); 216 $('#em-tickets-form .ticket-dates-from-normal, #em-tickets-form .ticket-dates-to-normal, #event-rsvp-options .em-booking-date-normal, #em-tickets-form .hidden').hide(); 217 }else{ 218 $('#em-tickets-form .ticket-dates-from-recurring, #em-tickets-form .ticket-dates-to-recurring, #event-rsvp-options .em-booking-date-recurring, #em-tickets-form .hidden').hide(); 219 } 220 //Add a new ticket 221 $("#em-tickets-add").click(function(e){ 222 e.preventDefault(); 223 reset_ticket_forms(); 224 //create copy of template slot, insert so ready for population 225 var tickets = $('#em-tickets-form table tbody'); 226 var rowNo = tickets.length+1; 227 var slot = tickets.first().clone(true).attr('id','em-ticket-'+ rowNo).appendTo($('#em-tickets-form table'));
228 //change the index of the form element names 229 slot.find('*[name]').each( function(index,el){ 230 el = $(el); 231 el.attr('name', el.attr('name').replace('em_tickets[0]','em_tickets['+rowNo+']')); 232 }); 233 //show ticket and switch to editor 234 slot.show().find('.ticket-actions-edit').trigger('click'); 235 //refresh datepicker and values 236 slot.find('.em-date-input-loc').datepicker('destroy').removeAttr('id'); //clear all datepickers 237 slot.find('.em-time-input').unbind().each(function(index, el){ this.timePicker = false; }); //clear all timepickers - consequently, also other click/blur/change events, recreate the further down 238 em_setup_datepicker(slot); 239 em_setup_timepicker(slot); 240 $('html, body').animate({ scrollTop: slot.offset().top - 30 }); //sends user to form 241 }); 242 //Edit a Ticket 243 $(document).delegate('.ticket-actions-edit', 'click', function(e){ 244 e.preventDefault(); 245 reset_ticket_forms(); 246 var tbody = $(this).closest('tbody'); 247 tbody.find('tr.em-tickets-row').hide(); 248 tbody.find('tr.em-tickets-row-form').fadeIn(); 249 return false; 250 }); 251 $(document).delegate('.ticket-actions-edited', 'click', function(e){ 252 e.preventDefault(); 253 var tbody = $(this).closest('tbody'); 254 var rowNo = tbody.attr('id').replace('em-ticket-',''); 255 tbody.find('.em-tickets-row').fadeIn(); 256 tbody.find('.em-tickets-row-form').hide(); 257 tbody.find('*[name]').each(function(index,el){ 258 el = $(el); 259 if( el.attr('name') == 'ticket_start_pub'){ 260 tbody.find('span.ticket_start').text(el.attr('value')); 261 }else if( el.attr('name') == 'ticket_end_pub' ){ 262 tbody.find('span.ticket_end').text(el.attr('value')); 263 }else if( el.attr('name') == 'em_tickets['+rowNo+'][ticket_type]' ){ 264 if( el.find(':selected').val() == 'members' ){ 265 tbody.find('span.ticket_name').prepend('* '); 266 } 267 }else if( el.attr('name') == 'em_tickets['+rowNo+'][ticket_start_recurring_days]' ){ 268 var text = tbody.find('select.ticket-dates-from-recurring-when').val() == 'before' ? '-'+el.attr('value'):el.attr('value'); 269 if( el.attr('value') != '' ){ 270 tbody.find('span.ticket_start_recurring_days').text(text); 271 tbody.find('span.ticket_start_recurring_days_text, span.ticket_start_time').removeClass('hidden').show(); 272 }else{ 273 tbody.find('span.ticket_start_recurring_days').text(' - '); 274 tbody.find('span.ticket_start_recurring_days_text, span.ticket_start_time').removeClass('hidden').hide(); 275 } 276 }else if( el.attr('name') == 'em_tickets['+rowNo+'][ticket_end_recurring_days]' ){ 277 var text = tbody.find('select.ticket-dates-to-recurring-when').val() == 'before' ? '-'+el.attr('value'):el.attr('value'); 278 if( el.attr('value') != '' ){ 279 tbody.find('span.ticket_end_recurring_days').text(text); 280 tbody.find('span.ticket_end_recurring_days_text, span.ticket_end_time').removeClass('hidden').show(); 281 }else{ 282 tbody.find('span.ticket_end_recurring_days').text(' - '); 283 tbody.find('span.ticket_end_recurring_days_text, span.ticket_end_time').removeClass('hidden').hide(); 284 } 285 }else{ 286 tbody.find('.'+el.attr('name').replace('em_tickets['+rowNo+'][','').replace(']','').replace('[]','')).text(el.attr('value')); 287 } 288 }); 289 //allow for others to hook into this 290 $(document).triggerHandler('em_maps_tickets_edit', [tbody, rowNo, true]); 291 $('html, body').animate({ scrollTop: tbody.parent().offset().top - 30 }); //sends user back to top of form 292 return false; 293 }); 294 $(document).delegate('.em-ticket-form select.ticket_type','change', function(e){ 295 //check if ticket is for all users or members, if members, show roles to limit the ticket to 296 var el = $(this); 297 if( el.find('option:selected').val() == 'members' ){ 298 el.closest('.em-ticket-form').find('.ticket-roles').fadeIn(); 299 }else{ 300 el.closest('.em-ticket-form').find('.ticket-roles').hide(); 301 } 302 }); 303 $(document).delegate('.em-ticket-form .ticket-options-advanced','click', function(e){ 304 //show or hide advanced tickets, hidden by default 305 e.preventDefault(); 306 var el = $(this); 307 if( el.hasClass('show') ){ 308 el.closest('.em-ticket-form').find('.em-ticket-form-advanced').fadeIn(); 309 el.find('.show,.show-advanced').hide();
310 el.find('.hide,.hide-advanced').show(); 311 }else{ 312 el.closest('.em-ticket-form').find('.em-ticket-form-advanced').hide(); 313 el.find('.show,.show-advanced').show(); 314 el.find('.hide,.hide-advanced').hide(); 315 } 316 el.toggleClass('show'); 317 }); 318 $('.em-ticket-form').each( function(){ 319 //check whether to show advanced options or not by default for each ticket 320 var show_advanced = false; 321 var el = $(this); 322 el.find('.em-ticket-form-advanced input[type="text"]').each(function(){ if(this.value != '') show_advanced = true; }); 323 if( el.find('.em-ticket-form-advanced input[type="checkbox"]:checked').length > 0 ){ show_advanced = true; } 324 el.find('.em-ticket-form-advanced option:selected').each(function(){ if(this.value != '') show_advanced = true; }); 325 if( show_advanced ) el.find('.ticket-options-advanced').trigger('click'); 326 }); 327 //Delete a ticket 328 $(document).delegate('.ticket-actions-delete', 'click', function(e){ 329 e.preventDefault(); 330 var el = $(this); 331 var tbody = el.closest('tbody'); 332 if( tbody.find('input.ticket_id').val() > 0 ){ 333 //only will happen if no bookings made 334 el.text('Deleting...'); 335 $.getJSON( $(this).attr('href'), {'em_ajax_action':'delete_ticket', 'id':tbody.find('input.ticket_id').val()}, function(data){ 336 if(data.result){ 337 tbody.remove(); 338 }else{ 339 el.text('Delete'); 340 alert(data.error); 341 } 342 }); 343 }else{ 344 //not saved to db yet, so just remove 345 tbody.remove(); 346 } 347 return false; 348 }); 349 } 350 //Manageing Bookings 351 if( $('#em-bookings-table').length > 0 ){ 352 //Pagination link clicks 353 $(document).delegate('#em-bookings-table .tablenav-pages a', 'click', function(){ 354 var el = $(this); 355 var form = el.parents('#em-bookings-table form.bookings-filter'); 356 //get page no from url, change page, submit form 357 var match = el.attr('href').match(/#[0-9]+/); 358 if( match != null && match.length > 0){ 359 var pno = match[0].replace('#',''); 360 form.find('input[name=pno]').val(pno); 361 }else{ 362 form.find('input[name=pno]').val(1); 363 } 364 form.trigger('submit'); 365 return false; 366 }); 367 //Overlay Options 368 var em_bookings_settings_dialog = { 369 modal : true, 370 autoOpen: false, 371 minWidth: 500, 372 height: 'auto', 373 buttons: [{ 374 text: EM.bookings_settings_save, 375 click: function(e){ 376 e.preventDefault(); 377 //we know we'll deal with cols, so wipe hidden value from main 378 var match = $("#em-bookings-table form.bookings-filter [name=cols]").val(''); 379 var booking_form_cols = $('form#em-bookings-table-settings-form input.em-bookings-col-item'); 380 $.each( booking_form_cols, function(i,item_match){ 381 //item_match = $(item_match); 382 if( item_match.value == 1 ){ 383 if( match.val() != ''){ 384 match.val(match.val()+','+item_match.name); 385 }else{ 386 match.val(item_match.name); 387 } 388 } 389 }); 390 //submit main form 391 $('#em-bookings-table-settings').trigger('submitted'); //hook into this with bind() 392 $('#em-bookings-table form.bookings-filter').trigger('submit'); 393 $(this).dialog('close'); 394 } 395 }] 396 }; 397 var em_bookings_export_dialog = { 398 modal : true, 399 autoOpen: false, 400 minWidth: 500, 401 height: 'auto', 402 buttons: [{ 403 text: EM.bookings_export_save, 404 click: function(e){ 405 $(this).children('form').submit(); 406 $(this).dialog('close'); 407 } 408 }] 409 }; 410 if( $("#em-bookings-table-settings").length > 0 ){ 411 //Settings Overlay 412 $("#em-bookings-table-settings").dialog(em_bookings_settings_dialog); 413 $(document).delegate('#em-bookings-table-settings-trigger','click', function(e){ e.preventDefault(); $("#em-bookings-table-settings").dialog('open'); }); 414 //Export Overlay 415 $("#em-bookings-table-export").dialog(em_bookings_export_dialog); 416 $(document).delegate('#em-bookings-table-export-trigger','click', function(e){ e.preventDefault(); $("#em-bookings-table-export").dialog('open'); }); 417 var export_overlay_show_tickets = function(){ 418 if( $('#em-bookings-table-export-form input[name=show_tickets]').is(':checked') ){ 419 $('#em-bookings-table-export-form .em-bookings-col-item-ticket').show(); 420 $('#em-bookings-table-export-form #em-bookings-export-cols-active .em-bookings-col-item-ticket input').val(1); 421 }else{ 422 $('#em-bookings-table-export-form .em-bookings-col-item-ticket').hide().find('input').val(0); 423 } 424 };
425 //Sync export overlay with table search field changes 426 $('#em-bookings-table form select').each(function(i, el){ 427 $(el).change(function(e){ 428 var select_el = $(this); 429 var input_par = $('#em-bookings-table-export-form input[name='+select_el.attr('name')+']'); 430 var input_par_selected = select_el.find('option:selected'); 431 input_par.val(input_par_selected.val()); 432 }); 433 }); 434 435 export_overlay_show_tickets(); 436 $('#em-bookings-table-export-form input[name=show_tickets]').click(export_overlay_show_tickets); 437 //Sortables 438 $( ".em-bookings-cols-sortable" ).sortable({ 439 connectWith: ".em-bookings-cols-sortable", 440 update: function(event, ui) { 441 if( ui.item.parents('ul#em-bookings-cols-active, ul#em-bookings-export-cols-active').length > 0 ){ 442 ui.item.addClass('ui-state-highlight').removeClass('ui-state-default').children('input').val(1); 443 }else{ 444 ui.item.addClass('ui-state-default').removeClass('ui-state-highlight').children('input').val(0); 445 } 446 } 447 }).disableSelection(); 448 load_ui_css = true; 449 } 450 //Widgets and filter submissions 451 $(document).delegate('#em-bookings-table form.bookings-filter', 'submit', function(e){ 452 var el = $(this); 453 //append loading spinner 454 el.parents('#em-bookings-table').find('.table-wrap').first().append('<div id="em-loading" />'); 455 //ajax call 456 $.post( EM.ajaxurl, el.serializeArray(), function(data){ 457 var root = el.parents('#em-bookings-table').first(); 458 root.replaceWith(data); 459 //recreate overlays 460 $('#em-bookings-table-export input[name=scope]').val(root.find('select[name=scope]').val()); 461 $('#em-bookings-table-export input[name=status]').val(root.find('select[name=status]').val()); 462 jQuery(document).triggerHandler('em_bookings_filtered', [data, root, el]); 463 }); 464 return false; 465 }); 466 //Approve/Reject Links 467 $(document).delegate('.em-bookings-approve,.em-bookings-reject,.em-bookings-unapprove,.em-bookings-delete', 'click', function(){ 468 var el = $(this); 469 if( el.hasClass('em-bookings-delete') ){ 470 if( !confirm(EM.booking_delete) ){ return false; } 471 } 472 var url = em_ajaxify( el.attr('href')); 473 var td = el.parents('td').first(); 474 td.html(EM.txt_loading); 475 td.load( url ); 476 return false; 477 }); 478 } 479 //Old Bookings Table - depreciating soon 480 if( $('.em_bookings_events_table').length > 0 ){ 481 //Widgets and filter submissions 482 $(document).delegate('.em_bookings_events_table form', 'submit', function(e){ 483 var el = $(this); 484 var url = em_ajaxify( el.attr('action') ); 485 el.parents('.em_bookings_events_table').find('.table-wrap').first().append('<div id="em-loading" />'); 486 $.get( url, el.serializeArray(), function(data){ 487 el.parents('.em_bookings_events_table').first().replaceWith(data); 488 }); 489 return false; 490 }); 491 //Pagination link clicks 492 $(document).delegate('.em_bookings_events_table .tablenav-pages a', 'click', function(){ 493 var el = $(this); 494 var url = em_ajaxify( el.attr('href') ); 495 el.parents('.em_bookings_events_table').find('.table-wrap').first().append('<div id="em-loading" />'); 496 $.get( url, function(data){ 497 el.parents('.em_bookings_events_table').first().replaceWith(data); 498 }); 499 return false; 500 }); 501 } 502 503 //Manual Booking 504 $('a.em-booking-button').click(function(e){ 505 e.preventDefault(); 506 var button = $(this); 507 if( button.text() != EM.bb_booked && $(this).text() != EM.bb_booking){ 508 button.text(EM.bb_booking); 509 var button_data = button.attr('id').split('_'); 510 $.ajax({ 511 url: EM.ajaxurl, 512 dataType: 'jsonp', 513 data: { 514 event_id : button_data[1], 515 _wpnonce : button_data[2], 516 action : 'booking_add_one' 517 }, 518 success : function(response, statusText, xhr, $form) { 519 if(response.result){ 520 button.text(EM.bb_booked); 521 }else{ 522 button.text(EM.bb_error); 523 } 524 if(response.message != '') alert(response.message); 525 }, 526 error : function(){ button.text(EM.bb_error); } 527 }); 528 } 529 return false; 530 }); 531 $('a.em-cancel-button').click(function(e){
532 e.preventDefault(); 533 var button = $(this); 534 if( button.text() != EM.bb_cancelled && button.text() != EM.bb_canceling){ 535 button.text(EM.bb_canceling); 536 var button_data = button.attr('id').split('_'); 537 $.ajax({ 538 url: EM.ajaxurl, 539 dataType: 'jsonp', 540 data: { 541 booking_id : button_data[1], 542 _wpnonce : button_data[2], 543 action : 'booking_cancel' 544 }, 545 success : function(response, statusText, xhr, $form) { 546 if(response.result){ 547 button.text(EM.bb_cancelled); 548 }else{ 549 button.text(EM.bb_cancel_error); 550 } 551 }, 552 error : function(){ button.text(EM.bb_cancel_error); } 553 }); 554 } 555 return false; 556 }); 557 558 //Datepicker 559 if( $('.em-date-single, .em-date-range, #em-date-start').length > 0 ){ 560 if( EM.locale != 'en' && EM.locale_data ){ 561 $.datepicker.setDefaults(EM.locale_data); 562 } 563 load_ui_css = true; 564 em_setup_datepicker('body'); 565 } 566 if( load_ui_css ) em_load_jquery_css(); 567 568 //previously in em-admin.php 569 function updateIntervalDescriptor () { 570 $(".interval-desc").hide(); 571 var number = "-plural"; 572 if ($('input#recurrence-interval').val() == 1 || $('input#recurrence-interval').val() == "") 573 number = "-singular"; 574 var descriptor = "span#interval-"+$("select#recurrence-frequency").val()+number; 575 $(descriptor).show(); 576 } 577 function updateIntervalSelectors () { 578 $('p.alternate-selector').hide(); 579 $('p#'+ $('select#recurrence-frequency').val() + "-selector").show(); 580 } 581 function updateShowHideRecurrence () { 582 if( $('input#event-recurrence').is(":checked")) { 583 $("#event_recurrence_pattern").fadeIn(); 584 $("#event-date-explanation").hide(); 585 $("#recurrence-dates-explanation").show(); 586 $("h3#recurrence-dates-title").show(); 587 $("h3#event-date-title").hide(); 588 } else { 589 $("#event_recurrence_pattern").hide(); 590 $("#recurrence-dates-explanation").hide(); 591 $("#event-date-explanation").show(); 592 $("h3#recurrence-dates-title").hide(); 593 $("h3#event-date-title").show(); 594 } 595 } 596 $("#recurrence-dates-explanation").hide(); 597 $("#date-to-submit").hide(); 598 $("#end-date-to-submit").hide(); 599 600 $("#localised-date").show(); 601 $("#localised-end-date").show(); 602 603 $('#em-wrapper input.select-all').change(function(){ 604 if($(this).is(':checked')){ 605 $('input.row-selector').prop('checked', true); 606 $('input.select-all').prop('checked', true); 607 }else{ 608 $('input.row-selector').prop('checked', false); 609 $('input.select-all').prop('checked', false); 610 } 611 }); 612 613 updateIntervalDescriptor(); 614 updateIntervalSelectors(); 615 updateShowHideRecurrence(); 616 $('input#event-recurrence').change(updateShowHideRecurrence); 617 618 // recurrency elements 619 $('input#recurrence-interval').keyup(updateIntervalDescriptor); 620 $('select#recurrence-frequency').change(updateIntervalDescriptor); 621 $('select#recurrence-frequency').change(updateIntervalSelectors); 622 623 /* Load any maps */ 624 if( $('.em-location-map').length > 0 || $('.em-locations-map').length > 0 || $('#em-map').length > 0 || $('.em-search-geo').length > 0 ){ 625 em_maps_load(); 626 } 627 628 //Finally, add autocomplete here 629 //Autocomplete 630 if( jQuery( "div.em-location-data input#location-name" ).length > 0 ){ 631 jQuery( "div.em-location-data input#location-name" ).autocomplete({ 632 source: EM.locationajaxurl, 633 minLength: 2, 634 focus: function( event, ui ){ 635 jQuery("input#location-id" ).val( ui.item.value ); 636 return false; 637 }, 638 select: function( event, ui ){ 639 jQuery("input#location-id" ).val(ui.item.id).trigger('change'); 640 jQuery("input#location-name" ).val(ui.item.value); 641 jQuery('input#location-address').val(ui.item.address); 642 jQuery('input#location-town').val(ui.item.town); 643 jQuery('input#location-state').val(ui.item.state); 644 jQuery('input#location-region').val(ui.item.region); 645 jQuery('input#location-postcode').val(ui.item.postcode); 646 if( ui.item.country == '' ){ 647 jQuery('select#location-country option:selected').removeAttr('selected'); 648 }else{ 649 jQuery('select#location-country option[value="'+ui.item.country+'"]').attr('selected', 'selected'); 650 } 651 jQuery('div.em-location-data input, div.em-location-data select').css('background-color','#ccc').attr('readonly','readonly'); 652 jQuery('#em-location-reset').show(); 653 jQuery('#em-location-search-tip').hide(); 654 jQuery(document).triggerHandler('em_locations_autocomplete_selected', [event, ui]); 655 return false; 656 } 657 }).data( "ui-autocomplete" )._renderItem = function( ul, item ) { 658 html_val = "<a>" + item.label + '<br><span style="font-size:11px"><em>'+ item.address + ', ' + item.town+"</em></span></a>"; 659 return jQuery( "<li></li>" ).data( "item.autocomplete", item ).append(html_val).appendTo( ul ); 660 }; 661 jQuery('#em-location-reset a').click( function(){ 662 jQuery('div.em-location-data input').css('background-color','#fff').val('').removeAttr('readonly'); 663 jQuery('div.em-location-data select').css('background-color','#fff'); 664 jQuery('div.em-location-data option:selected').removeAttr('selected'); 665 jQuery('input#location-id').val(''); 666 jQuery('#em-location-reset').hide(); 667 jQuery('#em-location-search-tip').show(); 668 jQuery('#em-map').hide(); 669 jQuery('#em-map-404').show(); 670 if(typeof(marker) !== 'undefined'){ 671 marker.setPosition(new google.maps.LatLng(0, 0)); 672 infoWindow.close(); 673 marker.setDraggable(true); 674 } 675 return false; 676 }); 677 if( jQuery('input#location-id').val() != '0' && jQuery('input#location-id').val() != '' ){ 678 jQuery('div.em-location-data input, div.em-location-data select').css('background-color','#ccc').attr('readonly','readonly'); 679 jQuery('#em-location-reset').show(); 680 jQuery('#em-location-search-tip').hide(); 681 } 682 } 683 684}); 685 686function em_load_jquery_css(){ 687 if( EM.ui_css && jQuery('link#jquery-ui-css').length == 0 ){ 688 var script = document.createElement("link"); 689 script.id = 'jquery-ui-css'; 690 script.rel = "stylesheet"; 691 script.href = EM.ui_css; 692 document.body.appendChild(script); 693 } 694} 695 696function em_setup_datepicker(wrap){ 697 wrap = jQuery(wrap); 698 //default picker vals 699 var datepicker_vals = { altFormat: "yy-mm-dd", changeMonth: true, changeYear: true, firstDay : EM.firstDay, yearRange:'-100:+10' }; 700 if( EM.dateFormat ) datepicker_vals.dateFormat = EM.dateFormat; 701 if( EM.yearRange ) datepicker_vals.yearRange = EM.yearRange; 702 jQuery(document).triggerHandler('em_datepicker', datepicker_vals); 703 704 //apply datepickers 705 dateDivs = wrap.find('.em-date-single, .em-date-range'); 706 if( dateDivs.length > 0 ){ 707 //apply datepickers to elements 708 dateDivs.find('input.em-date-input-loc').each(function(i,dateInput){ 709 //init the datepicker 710 var dateInput = jQuery(dateInput); 711 var dateValue = dateInput.nextAll('input.em-date-input').first(); 712 var dateValue_value = dateValue.val(); 713 dateInput.datepicker(datepicker_vals); 714 dateInput.datepicker('option', 'altField', dateValue); 715 //now set the value 716 if( dateValue_value ){ 717 var this_date_formatted = jQuery.datepicker.formatDate( EM.dateFormat, jQuery.datepicker.parseDate('yy-mm-dd', dateValue_value) ); 718 dateInput.val(this_date_formatted); 719 dateValue.val(dateValue_value); 720 } 721 //add logic for texts 722 dateInput.change(function(){ 723 if( jQuery(this).val() == '' ){ 724 jQuery(this).nextAll('.em-date-input').first().val(''); 725 } 726 }); 727 }); 728 //deal with date ranges 729 dateDivs.filter('.em-date-range').find('input.em-date-input-loc').each(function(i,dateInput){ 730 //finally, apply start/end logic to this field 731 dateInput = jQuery(dateInput); 732 if( dateInput.hasClass('em-date-start') ){ 733 dateInput.datepicker('option','onSelect', function( selectedDate ) { 734 //get corresponding end date input, we expect ranges to be contained in .em-date-range with a start/end input element 735 var startDate = jQuery(this); 736 var endDate = startDate.parents('.em-date-range').find('.em-date-end').first(); 737 if( startDate.val() > endDate.val() && endDate.val() != '' ){ 738 endDate.datepicker( "setDate" , selectedDate ); 739 endDate.trigger('change'); 740 } 741 endDate.datepicker( "option", 'minDate', selectedDate ); 742 }); 743 }else if( dateInput.hasClass('em-date-end') ){ 744 var startInput = dateInput.parents('.em-date-range').find('.em-date-start').first(); 745 if( startInput.val() != '' ){ 746 dateInput.datepicker('option', 'minDate', startInput.val()); 747 } 748 } 749 }); 750 } 751} 752 753function em_setup_timepicker(wrap){ 754 wrap = jQuery(wrap); 755 var timepicker_options = { 756 show24Hours: EM.show24hours == 1, 757 step:15 758 } 759 jQuery(document).triggerHandler('em_timepicker_options', timepicker_options); 760 wrap.find(".em-time-input").timePicker(timepicker_options); 761
762 // Keep the duration between the two inputs. 763 wrap.find(".em-time-range input.em-time-start").each( function(i, el){ 764 jQuery(el).data('oldTime', jQuery.timePicker(el).getTime()); 765 }).change( function() { 766 var start = jQuery(this); 767 var end = start.nextAll('.em-time-end'); 768 if (end.val()) { // Only update when second input has a value. 769 // Calculate duration. 770 var oldTime = start.data('oldTime'); 771 var duration = (jQuery.timePicker(end).getTime() - oldTime); 772 var time = jQuery.timePicker(start).getTime(); 773 if( jQuery.timePicker(end).getTime() >= oldTime ){ 774 // Calculate and update the time in the second input. 775 jQuery.timePicker(end).setTime(new Date(new Date(time.getTime() + duration))); 776 } 777 start.data('oldTime', time); 778 } 779 }); 780 // Validate. 781 wrap.find(".em-time-range input.em-time-end").change(function() { 782 var end = jQuery(this); 783 var start = end.prevAll('.em-time-start'); 784 if( start.val() ){ 785 if( jQuery.timePicker(start).getTime() > jQuery.timePicker(this).getTime() && ( jQuery('.em-date-end').val().length == 0 || jQuery('.em-date-start').val() == jQuery('.em-date-end').val() ) ) { end.addClass("error"); } 786 else { end.removeClass("error"); } 787 } 788 }); 789 //Sort out all day checkbox 790 wrap.find('.em-time-range input.em-time-all-day').change(function(){ 791 var allday = jQuery(this); 792 if( allday.is(':checked') ){ 793 allday.siblings('.em-time-input').css('background-color','#ccc'); 794 }else{ 795 allday.siblings('.em-time-input').css('background-color','#fff'); 796 } 797 }).trigger('change'); 798} 799 800/* Useful function for adding the em_ajax flag to a url, regardless of querystring format */ 801var em_ajaxify = function(url){ 802 if ( url.search('em_ajax=0') != -1){ 803 url = url.replace('em_ajax=0','em_ajax=1'); 804 }else if( url.search(/\?/) != -1 ){ 805 url = url + "&em_ajax=1"; 806 }else{ 807 url = url + "?em_ajax=1"; 808 } 809 return url; 810}; 811 812/* 813 * MAP FUNCTIONS 814 */ 815var em_maps_loaded = false; 816var maps = {}; 817var maps_markers = {}; 818var infowindow; 819//loads maps script if not already loaded and executes EM maps script 820function em_maps_load(){ 821 if( !em_maps_loaded ){ 822 if ( jQuery('script#google-maps').length == 0 && ( typeof google !== 'object' || typeof google.maps !== 'object' ) ){ 823 var script = document.createElement("script"); 824 script.type = "text/javascript"; 825 script.id = "google-maps"; 826 var proto = (EM.is_ssl) ? 'https:' : 'http:'; 827 script.src = proto + '//maps.google.com/maps/api/js?v=3.12&sensor=false&libraries=places&callback=em_maps'; 828 document.body.appendChild(script); 829 }else if( typeof google === 'object' && typeof google.maps === 'object' && !em_maps_loaded ){ 830 em_maps(); 831 }else if( jQuery('script#google-maps').length > 0 ){ 832 jQuery(window).load(function(){ if( !em_maps_loaded ) em_maps(); }); //google isn't loaded so wait for page to load resources 833 } 834 } 835} 836//re-usable function to load global location maps 837function em_maps_load_locations(el){ 838 var el = jQuery(el); 839 var map_id = el.attr('id').replace('em-locations-map-',''); 840 var em_data = jQuery.parseJSON( el.nextAll('.em-locations-map-coords').first().text() ); 841 if( em_data == null ){ 842 var em_data = jQuery.parseJSON( jQuery('#em-locations-map-coords-'+map_id).text() ); 843 } 844 jQuery.getJSON(document.URL, em_data , function(data){ 845 if(data.length > 0){ 846 //define default options and allow option for extension via event triggers 847 var map_options = { mapTypeId: google.maps.MapTypeId.ROADMAP }; 848 jQuery(document).triggerHandler('em_maps_locations_map_options', map_options); 849 var marker_options = {}; 850 jQuery(document).triggerHandler('em_maps_location_marker_options', marker_options); 851 852 maps[map_id] = new google.maps.Map(el[0], map_options); 853 maps_markers[map_id] = []; 854 855 var minLatLngArr = [0,0]; 856 var maxLatLngArr = [0,0]; 857 858 for (var i = 0; i < data.length; i++) { 859 if( !(data[i].location_latitude == 0 && data[i].location_longitude == 0) ){ 860 var latitude = parseFloat( data[i].location_latitude ); 861 var longitude = parseFloat( data[i].location_longitude ); 862 var location = new google.maps.LatLng( latitude, longitude ); 863 //extend the default marker options 864 jQuery.extend(marker_options, { 865 position: location, 866 map: maps[map_id] 867 }) 868 var marker = new google.maps.Marker(marker_options); 869 maps_markers[map_id].push(marker); 870 marker.setTitle(data[i].location_name); 871 var myContent = '<div class="em-map-balloon"><div id="em-map-balloon-'+map_id+'" class="em-map-balloon-content">'+ data[i].location_balloon +'</div></div>'; 872 em_map_infobox(marker, myContent, maps[map_id]); 873 874 //Get min and max long/lats 875 minLatLngArr[0] = (latitude < minLatLngArr[0] || i == 0) ? latitude : minLatLngArr[0]; 876 minLatLngArr[1] = (longitude < minLatLngArr[1] || i == 0) ? longitude : minLatLngArr[1]; 877 maxLatLngArr[0] = (latitude > maxLatLngArr[0] || i == 0) ? latitude : maxLatLngArr[0]; 878 maxLatLngArr[1] = (longitude > maxLatLngArr[1] || i == 0) ? longitude : maxLatLngArr[1]; 879 } 880 } 881 // Zoom in to the bounds 882 var minLatLng = new google.maps.LatLng(minLatLngArr[0],minLatLngArr[1]); 883 var maxLatLng = new google.maps.LatLng(maxLatLngArr[0],maxLatLngArr[1]); 884 var bounds = new google.maps.LatLngBounds(minLatLng,maxLatLng); 885 maps[map_id].fitBounds(bounds); 886 887 //Call a hook if exists 888 jQuery(document).triggerHandler('em_maps_locations_hook', [maps[map_id], data, map_id]); 889 }else{
890 el.children().first().html('No locations found'); 891 jQuery(document).triggerHandler('em_maps_locations_hook_not_found', [el]); 892 } 893 }); 894} 895function em_maps_load_location(el){ 896 el = jQuery(el); 897 var map_id = el.attr('id').replace('em-location-map-',''); 898 em_LatLng = new google.maps.LatLng( jQuery('#em-location-map-coords-'+map_id+' .lat').text(), jQuery('#em-location-map-coords-'+map_id+' .lng').text()); 899 //extend map and markers via event triggers 900 var map_options = { 901 zoom: 14, 902 center: em_LatLng, 903 mapTypeId: google.maps.MapTypeId.ROADMAP, 904 mapTypeControl: false 905 }; 906 jQuery(document).triggerHandler('em_maps_location_map_options', map_options); 907 maps[map_id] = new google.maps.Map( document.getElementById('em-location-map-'+map_id), map_options); 908 var marker_options = { 909 position: em_LatLng, 910 map: maps[map_id] 911 }; 912 jQuery(document).triggerHandler('em_maps_location_marker_options', marker_options); 913 maps_markers[map_id] = new google.maps.Marker(marker_options); 914 infowindow = new google.maps.InfoWindow({ content: jQuery('#em-location-map-info-'+map_id+' .em-map-balloon').get(0) }); 915 infowindow.open(maps[map_id],maps_markers[map_id]); 916 maps[map_id].panBy(40,-70); 917 918 //JS Hook for handling map after instantiation 919 //Example hook, which you can add elsewhere in your theme's JS - jQuery(document).bind('em_maps_location_hook', function(){ alert('hi');} ); 920 jQuery(document).triggerHandler('em_maps_location_hook', [maps[map_id], infowindow, maps_markers[map_id], map_id]); 921 //map resize listener 922 jQuery(window).on('resize', function(e) { 923 google.maps.event.trigger(maps[map_id], "resize"); 924 maps[map_id].setCenter(maps_markers[map_id].getPosition()); 925 maps[map_id].panBy(40,-70); 926 }); 927} 928jQuery(document).bind('em_search_ajax', function(e, vars, wrapper){ 929 if( em_maps_loaded ){ 930 wrapper.find('.em-location-map').each( function(index, el){ em_maps_load_location(el); } ); 931 wrapper.find('.em-locations-map').each( function(index, el){ em_maps_load_locations(el); }); 932 } 933}); 934//Load single maps (each map is treated as a seperate map). 935function em_maps() { 936 //Find all the maps on this page and load them 937 jQuery('.em-location-map').each( function(index, el){ em_maps_load_location(el); } ); 938 jQuery('.em-locations-map').each( function(index, el){ em_maps_load_locations(el); } ); 939 940 //Location stuff - only needed if inputs for location exist 941 if( jQuery('select#location-select-id, input#location-address').length > 0 ){ 942 var map, marker; 943 //load map info 944 var refresh_map_location = function(){ 945 var location_latitude = jQuery('#location-latitude').val(); 946 var location_longitude = jQuery('#location-longitude').val(); 947 if( !(location_latitude == 0 && location_longitude == 0) ){ 948 var position = new google.maps.LatLng(location_latitude, location_longitude); //the location coords 949 marker.setPosition(position); 950 var mapTitle = (jQuery('input#location-name').length > 0) ? jQuery('input#location-name').val():jQuery('input#title').val(); 951 marker.setTitle( jQuery('input#location-name input#title, #location-select-id').first().val() ); 952 jQuery('#em-map').show(); 953 jQuery('#em-map-404').hide(); 954 google.maps.event.trigger(map, 'resize'); 955 map.setCenter(position); 956 map.panBy(40,-55); 957 infoWindow.setContent( 958 '<div id="location-balloon-content"><strong>' + 959 mapTitle + 960 '</strong><br/>' + 961 jQuery('#location-address').val() + 962 '<br/>' + jQuery('#location-town').val()+ 963 '</div>' 964 ); 965 infoWindow.open(map, marker); 966 jQuery(document).triggerHandler('em_maps_location_hook', [map, infowindow, marker, 0]); 967 } else { 968 jQuery('#em-map').hide(); 969 jQuery('#em-map-404').show(); 970 } 971 }; 972 973 //Add listeners for changes to address 974 var get_map_by_id = function(id){ 975 if(jQuery('#em-map').length > 0){ 976 jQuery.getJSON(document.URL,{ em_ajax_action:'get_location', id:id }, function(data){ 977 if( data.location_latitude!=0 && data.location_longitude!=0 ){ 978 loc_latlng = new google.maps.LatLng(data.location_latitude, data.location_longitude); 979 marker.setPosition(loc_latlng); 980 marker.setTitle( data.location_name ); 981 marker.setDraggable(false); 982 jQuery('#em-map').show(); 983 jQuery('#em-map-404').hide(); 984 map.setCenter(loc_latlng); 985 map.panBy(40,-55); 986 infoWindow.setContent( '<div id="location-balloon-content">'+ data.location_balloon +'</div>'); 987 infoWindow.open(map, marker); 988 google.maps.event.trigger(map, 'resize'); 989 jQuery(document).triggerHandler('em_maps_location_hook', [map, infowindow, marker, 0]); 990 }else{ 991 jQuery('#em-map').hide(); 992 jQuery('#em-map-404').show(); 993 } 994 }); 995 } 996 }; 997 jQuery('#location-select-id, input#location-id').change( function(){get_map_by_id(jQuery(this).val());} ); 998 jQuery('#location-name, #location-town, #location-address, #location-state, #location-postcode, #location-country').change( function(){ 999 //build address 1000 var addresses = [ jQuery('#location-address').val(), jQuery('#location-town').val(), jQuery('#location-state').val(), jQuery('#location-postcode').val() ]; 1001 var address = ''; 1002 jQuery.each( addresses, function(i, val){ 1003 if( val != '' ){ 1004 address = ( address == '' ) ? address+val:address+', '+val; 1005 } 1006 }); 1007 if( address == '' ){ //in case only name is entered, no address 1008 jQuery('#em-map').hide(); 1009 jQuery('#em-map-404').show(); 1010 return false; 1011 } 1012 //do country last, as it's using the text version 1013 if( jQuery('#location-country option:selected').val() != 0 ){ 1014 address = ( address == '' ) ? address+jQuery('#location-country option:selected').text():address+', '+jQuery('#location-country option:selected').text(); 1015 } 1016 if( address != '' && jQuery('#em-map').length > 0 ){ 1017 geocoder.geocode( { 'address': address }, function(results, status) { 1018 if (status == google.maps.GeocoderStatus.OK) { 1019 jQuery('#location-latitude').val(results[0].geometry.location.lat()); 1020 jQuery('#location-longitude').val(results[0].geometry.location.lng()); 1021 } 1022 refresh_map_location(); 1023 }); 1024 } 1025 }); 1026 1027 //Load map 1028 if(jQuery('#em-map').length > 0){ 1029 var em_LatLng = new google.maps.LatLng(0, 0); 1030 map = new google.maps.Map( document.getElementById('em-map'), { 1031 zoom: 14, 1032 center: em_LatLng, 1033 mapTypeId: google.maps.MapTypeId.ROADMAP, 1034 mapTypeControl: false 1035 }); 1036 var marker = new google.maps.Marker({ 1037 position: em_LatLng, 1038 map: map, 1039 draggable: true 1040 }); 1041 infoWindow = new google.maps.InfoWindow({ 1042 content: '' 1043 }); 1044 var geocoder = new google.maps.Geocoder(); 1045 google.maps.event.addListener(infoWindow, 'domready', function() { 1046 document.getElementById('location-balloon-content').parentNode.style.overflow=''; 1047 document.getElementById('location-balloon-content').parentNode.parentNode.style.overflow=''; 1048 }); 1049 google.maps.event.addListener(marker, 'dragend', function() { 1050 var position = marker.getPosition(); 1051 jQuery('#location-latitude').val(position.lat()); 1052 jQuery('#location-longitude').val(position.lng()); 1053 map.setCenter(position); 1054 map.panBy(40,-55); 1055 }); 1056 if( jQuery('#location-select-id').length > 0 ){ 1057 jQuery('#location-select-id').trigger('change'); 1058 }else{ 1059 refresh_map_location(); 1060 } 1061 jQuery(document).triggerHandler('em_map_loaded', [map, infowindow, marker]); 1062 } 1063 //map resize listener 1064 jQuery(window).on('resize', function(e) { 1065 google.maps.event.trigger(map, "resize"); 1066 map.setCenter(marker.getPosition()); 1067 map.panBy(40,-55); 1068 }); 1069 } 1070 em_maps_loaded = true; //maps have been loaded 1071 jQuery(document).triggerHandler('em_maps_loaded'); 1072} 1073 1074function em_map_infobox(marker, message, map) { 1075 var iw = new google.maps.InfoWindow({ content: message });
1076 google.maps.event.addListener(marker, 'click', function() { 1077 if( infowindow ) infowindow.close(); 1078 infowindow = iw; 1079 iw.open(map,marker); 1080 }); 1081} 1082 1083/* jQuery timePicker - http://labs.perifer.se/timedatepicker/ @ http://github.com/perifer/timePicker commit 100644 */ 1084(function(e){function t(t,n,r,i){t.value=e(n).text();e(t).change();if(!navigator.userAgent.match(/msie/i)){t.focus()}r.hide()}function n(e,t){var n=e.getHours();var i=t.show24Hours?n:(n+11)%12+1;var s=e.getMinutes();return r(i)+t.separator+r(s)+(t.show24Hours?"":n<12?" AM":" PM")}function r(e){return(e<10?"0":"")+e}function i(e,t){return typeof e=="object"?o(e):s(e,t)}function s(e,t){if(e){var n=e.split(t.separator);var r=parseFloat(n[0]);var i=parseFloat(n[1]);if(!t.show24Hours){if(r===12&&e.indexOf("AM")!==-1){r=0}else if(r!==12&&e.indexOf("PM")!==-1){r+=12}}var s=new Date(0,0,0,r,i,0);return o(s)}return null}function o(e){e.setFullYear(2001);e.setMonth(0);e.setDate(0);return e}e.fn.timePicker=function(t){var n=e.extend({},e.fn.timePicker.defaults,t);return this.each(function(){e.timePicker(this,n)})};e.timePicker=function(t,n){var r=e(t)[0];return r.timePicker||(r.timePicker=new jQuery._timePicker(r,n))};e.timePicker.version="0.3";e._timePicker=function(r,u){var a=false;var f=false;var l=i(u.startTime,u);var c=i(u.endTime,u);var h="selected";var p="li."+h;e(r).attr("autocomplete","OFF");var d=[];var v=new Date(l);while(v<=c){d[d.length]=n(v,u);v=new Date(v.setMinutes(v.getMinutes()+u.step))}var m=e('<div class="time-picker'+(u.show24Hours?"":" time-picker-12hours")+'"></div>');var g=e("<ul></ul>");for(var y=0;y<d.length;y++){g.append("<li>"+d[y]+"</li>")}m.append(g);m.appendTo("body").hide();m.mouseover(function(){a=true}).mouseout(function(){a=false});e("li",g).mouseover(function(){if(!f){e(p,m).removeClass(h);e(this).addClass(h)}}).mousedown(function(){a=true}).click(function(){t(r,this,m,u);a=false});var b=function(){if(m.is(":visible")){return false}e("li",m).removeClass(h);var t=e(r).offset();m.css({top:t.top+r.offsetHeight,left:t.left});m.show();var i=r.value?s(r.value,u):l;var a=l.getHours()*60+l.getMinutes();var f=i.getHours()*60+i.getMinutes()-a;var p=Math.round(f/u.step);var d=o(new Date(0,0,0,0,p*u.step+a,0));d=l<d&&d<=c?d:l;var v=e("li:contains("+n(d,u)+")",m);if(v.length){v.addClass(h);m[0].scrollTop=v[0].offsetTop}return true};e(r).focus(b).click(b);e(r).blur(function(){if(!a){m.hide()}});e(r)["keydown"](function(n){var i;f=true;var s=m[0].scrollTop;switch(n.keyCode){case 38:if(b()){return false}i=e(p,g);var o=i.prev().addClass(h)[0];if(o){i.removeClass(h);if(o.offsetTop<s){m[0].scrollTop=s-o.offsetHeight}}else{i.removeClass(h);o=e("li:last",g).addClass(h)[0];m[0].scrollTop=o.offsetTop-o.offsetHeight}return false;break;case 40:if(b()){return false}i=e(p,g);var a=i.next().addClass(h)[0];if(a){i.removeClass(h);if(a.offsetTop+a.offsetHeight>s+m[0].offsetHeight){m[0].scrollTop=s+a.offsetHeight}}else{i.removeClass(h);a=e("li:first",g).addClass(h)[0];m[0].scrollTop=0}return false;break;case 13:if(m.is(":visible")){var l=e(p,g)[0];t(r,l,m,u)}return false;break;case 27:m.hide();return false;break}return true});e(r).keyup(function(e){f=false});this.getTime=function(){return s(r.value,u)};this.setTime=function(t){r.value=n(i(t,u),u);e(r).change()}};e.fn.timePicker.defaults={step:30,startTime:new Date(0,0,0,0,0,0),endTime:new Date(0,0,0,23,30,0),separator:":",show24Hours:true}})(jQuery)
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.