danielebarchiesi@0: (function($){ danielebarchiesi@0: /** danielebarchiesi@0: * To make a form auto submit, all you have to do is 3 things: danielebarchiesi@0: * danielebarchiesi@0: * ctools_add_js('auto-submit'); danielebarchiesi@0: * danielebarchiesi@0: * On gadgets you want to auto-submit when changed, add the ctools-auto-submit danielebarchiesi@0: * class. With FAPI, add: danielebarchiesi@0: * @code danielebarchiesi@0: * '#attributes' => array('class' => array('ctools-auto-submit')), danielebarchiesi@0: * @endcode danielebarchiesi@0: * danielebarchiesi@0: * If you want to have auto-submit for every form element, danielebarchiesi@0: * add the ctools-auto-submit-full-form to the form. With FAPI, add: danielebarchiesi@0: * @code danielebarchiesi@0: * '#attributes' => array('class' => array('ctools-auto-submit-full-form')), danielebarchiesi@0: * @endcode danielebarchiesi@0: * danielebarchiesi@0: * If you want to exclude a field from the ctool-auto-submit-full-form auto submission, danielebarchiesi@0: * add the class ctools-auto-submit-exclude to the form element. With FAPI, add: danielebarchiesi@0: * @code danielebarchiesi@0: * '#attributes' => array('class' => array('ctools-auto-submit-exclude')), danielebarchiesi@0: * @endcode danielebarchiesi@0: * danielebarchiesi@0: * Finally, you have to identify which button you want clicked for autosubmit. danielebarchiesi@0: * The behavior of this button will be honored if it's ajaxy or not: danielebarchiesi@0: * @code danielebarchiesi@0: * '#attributes' => array('class' => array('ctools-use-ajax', 'ctools-auto-submit-click')), danielebarchiesi@0: * @endcode danielebarchiesi@0: * danielebarchiesi@0: * Currently only 'select', 'radio', 'checkbox' and 'textfield' types are supported. We probably danielebarchiesi@0: * could use additional support for HTML5 input types. danielebarchiesi@0: */ danielebarchiesi@0: danielebarchiesi@0: Drupal.behaviors.CToolsAutoSubmit = { danielebarchiesi@0: attach: function(context) { danielebarchiesi@0: // 'this' references the form element danielebarchiesi@0: function triggerSubmit (e) { danielebarchiesi@0: var $this = $(this); danielebarchiesi@0: if (!$this.hasClass('ctools-ajaxing')) { danielebarchiesi@0: $this.find('.ctools-auto-submit-click').click(); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // the change event bubbles so we only need to bind it to the outer form danielebarchiesi@0: $('form.ctools-auto-submit-full-form', context) danielebarchiesi@0: .add('.ctools-auto-submit', context) danielebarchiesi@0: .filter('form, select, input:not(:text, :submit)') danielebarchiesi@0: .once('ctools-auto-submit') danielebarchiesi@0: .change(function (e) { danielebarchiesi@0: // don't trigger on text change for full-form danielebarchiesi@0: if ($(e.target).is(':not(:text, :submit, .ctools-auto-submit-exclude)')) { danielebarchiesi@0: triggerSubmit.call(e.target.form); danielebarchiesi@0: } danielebarchiesi@0: }); danielebarchiesi@0: danielebarchiesi@0: // e.keyCode: key danielebarchiesi@0: var discardKeyCode = [ danielebarchiesi@0: 16, // shift danielebarchiesi@0: 17, // ctrl danielebarchiesi@0: 18, // alt danielebarchiesi@0: 20, // caps lock danielebarchiesi@0: 33, // page up danielebarchiesi@0: 34, // page down danielebarchiesi@0: 35, // end danielebarchiesi@0: 36, // home danielebarchiesi@0: 37, // left arrow danielebarchiesi@0: 38, // up arrow danielebarchiesi@0: 39, // right arrow danielebarchiesi@0: 40, // down arrow danielebarchiesi@0: 9, // tab danielebarchiesi@0: 13, // enter danielebarchiesi@0: 27 // esc danielebarchiesi@0: ]; danielebarchiesi@0: // Don't wait for change event on textfields danielebarchiesi@0: $('.ctools-auto-submit-full-form input:text, input:text.ctools-auto-submit', context) danielebarchiesi@0: .filter(':not(.ctools-auto-submit-exclude)') danielebarchiesi@0: .once('ctools-auto-submit', function () { danielebarchiesi@0: // each textinput element has his own timeout danielebarchiesi@0: var timeoutID = 0; danielebarchiesi@0: $(this) danielebarchiesi@0: .bind('keydown keyup', function (e) { danielebarchiesi@0: if ($.inArray(e.keyCode, discardKeyCode) === -1) { danielebarchiesi@0: timeoutID && clearTimeout(timeoutID); danielebarchiesi@0: } danielebarchiesi@0: }) danielebarchiesi@0: .keyup(function(e) { danielebarchiesi@0: if ($.inArray(e.keyCode, discardKeyCode) === -1) { danielebarchiesi@0: timeoutID = setTimeout($.proxy(triggerSubmit, this.form), 500); danielebarchiesi@0: } danielebarchiesi@0: }) danielebarchiesi@0: .bind('change', function (e) { danielebarchiesi@0: if ($.inArray(e.keyCode, discardKeyCode) === -1) { danielebarchiesi@0: timeoutID = setTimeout($.proxy(triggerSubmit, this.form), 500); danielebarchiesi@0: } danielebarchiesi@0: }); danielebarchiesi@0: }); danielebarchiesi@0: } danielebarchiesi@0: } danielebarchiesi@0: })(jQuery);