/* * jquery-ujs * * http://github.com/rails/jquery-ujs/blob/master/src/rails.js * * This rails.js file supports jQuery 1.4.3 and 1.4.4 . * */ jQuery(function ($) { var csrf_token = $('meta[name=csrf-token]').attr('content'), csrf_param = $('meta[name=csrf-param]').attr('content'); $.fn.extend({ /** * Triggers a custom event on an element and returns the event result * this is used to get around not being able to ensure callbacks are placed * at the end of the chain. * * TODO: deprecate with jQuery 1.4.2 release, in favor of subscribing to our * own events and placing ourselves at the end of the chain. */ triggerAndReturn: function (name, data) { var event = new $.Event(name); this.trigger(event, data); return event.result !== false; }, /** * Handles execution of remote calls. Provides following callbacks: * * - ajax:before - is execute before the whole thing begings * - ajax:loading - is executed before firing ajax call * - ajax:success - is executed when status is success * - ajax:complete - is execute when status is complete * - ajax:failure - is execute in case of error * - ajax:after - is execute every single time at the end of ajax call */ callRemote: function () { var el = this, method = el.attr('method') || el.attr('data-method') || 'GET', url = el.attr('action') || el.attr('href'), dataType = el.attr('data-type') || ($.ajaxSettings && $.ajaxSettings.dataType); if (url === undefined) { throw "No URL specified for remote call (action or href must be present)."; } else { if (el.triggerAndReturn('ajax:before')) { var data = el.is('form') ? el.serializeArray() : []; $.ajax({ url: url, data: data, dataType: dataType, type: method.toUpperCase(), beforeSend: function (xhr) { el.trigger('ajax:loading', xhr); }, success: function (data, status, xhr) { el.trigger('ajax:success', [data, status, xhr]); }, complete: function (xhr) { el.trigger('ajax:complete', xhr); }, error: function (xhr, status, error) { el.trigger('ajax:failure', [xhr, status, error]); } }); } el.trigger('ajax:after'); } } }); /** * confirmation handler */ $('body').delegate('a[data-confirm], button[data-confirm], input[data-confirm]', 'click.rails', function () { var el = $(this); if (el.triggerAndReturn('confirm')) { if (!confirm(el.attr('data-confirm'))) { return false; } } }); /** * remote handlers */ $('form[data-remote]').live('submit.rails', function (e) { $(this).callRemote(); e.preventDefault(); }); $('a[data-remote],input[data-remote]').live('click.rails', function (e) { $(this).callRemote(); e.preventDefault(); }); $('a[data-method]:not([data-remote])').live('click.rails', function (e){ var link = $(this), href = link.attr('href'), method = link.attr('data-method'), form = $('
'), metadata_input = ''; if (csrf_param !== undefined && csrf_token !== undefined) { metadata_input += ''; } form.hide() .append(metadata_input) .appendTo('body'); e.preventDefault(); form.submit(); }); /** * disable-with handlers */ var disable_with_input_selector = 'input[data-disable-with]', disable_with_form_remote_selector = 'form[data-remote]:has(' + disable_with_input_selector + ')', disable_with_form_not_remote_selector = 'form:not([data-remote]):has(' + disable_with_input_selector + ')'; var disable_with_input_function = function () { $(this).find(disable_with_input_selector).each(function () { var input = $(this); input.data('enable-with', input.val()) .attr('value', input.attr('data-disable-with')) .attr('disabled', 'disabled'); }); }; $(disable_with_form_remote_selector).live('ajax:before.rails', disable_with_input_function); $(disable_with_form_not_remote_selector).live('submit.rails', disable_with_input_function); $(disable_with_form_remote_selector).live('ajax:complete.rails', function () { $(this).find(disable_with_input_selector).each(function () { var input = $(this); input.removeAttr('disabled') .val(input.data('enable-with')); }); }); var jqueryVersion = $().jquery; if ( (jqueryVersion === '1.4') || (jqueryVersion === '1.4.1') || (jqueryVersion === '1.4.2') ){ alert('This rails.js does not support the jQuery version you are using. Please read documentation.'); } });