title: How to override event.stopPropagation(),preventDefault().stopImmediatePropagation()
body: <p>I am trying to modify Jira Tempo plugin's plan work form. So in the tempo time sheet page
  I have a button who has 2 actions bind-ed, one is a click action and one is  a focus out.
  the click action opens a popup. and the focus out verifies the form in the popup. I need the clik action to be executed first and then the focus out.</p>
  
  <p>The problem is when the popup opens there is a call to all of the three functions.
  <code>event.stopPropagation().preventDefault().stopImmediatePropagation();</code> so the focus out does not fire in chrome. </p>
  
  <p>In IE10 and Firefox works great.</p>
  
  <p>Can i override jQuery basic function of<code>event.stopPropagation().preventDefault().stopImmediatePropagation()</code>  to do not apply for that button? 
  all three, maybe?</p>
  
  <p>I tried this:</p>
  
  <pre><code>(function () {
  jQuery.Event.prototype = {
      isDefaultPrevented: returnFalse,
  isPropagationStopped: returnFalse,
  isImmediatePropagationStopped: returnFalse,
      stopPropagation: function () {
          if (jQuery('#tempo-plan-button').hasClass(this.currentTarget.className)) {
  
          } else {
              var e = this.originalEvent;
  
              this.isPropagationStopped = returnTrue;
  
              if (e &amp;&amp; e.stopPropagation) {
                  e.stopPropagation();
              }
          }
      },
      preventDefault: function () {
          if (jQuery('#tempo-plan-button').hasClass(this.currentTarget.className)) {
  
          } else {
              var e = this.originalEvent;
  
              this.isDefaultPrevented = returnTrue;
  
              if (e &amp;&amp; e.preventDefault) {
                  e.preventDefault();
              }
          }
      },
      stopImmediatePropagation: function () {
          if (jQuery('#tempo-plan-button').hasClass(this.currentTarget.className)) {
  
          } else {
              var e = this.originalEvent;
  
              this.isImmediatePropagationStopped = returnTrue;
  
              if (e &amp;&amp; e.stopImmediatePropagation) {
                  e.stopImmediatePropagation();
              }
  
              this.stopPropagation();
          }
      }
  
  };
  function returnFalse() {
      return false;
  }
  function returnTrue() {
      return true;
  }
  })();
  </code></pre>
  
  <p>UPDATE:</p>
  
  <p>I don't have control on what the click function does, but i have control on the focus out, I have made some test and i looks like Chrome does not see the focus out event, because the element is hidden before the focus out occurs ( it is a popup button).
  I managed to call my functions with mouse out event but this does not work on IE  so I have to bind separate event listener for IE and Chrome,Firefox,Safari.
  Can you help with some browser detection examples.</p>
  
  <p>UPDATE 2:</p>
  
  <p>My problem solved with a different listener to the popup element. ex:</p>
  
  <pre><code>jQuery(document).ready(function ($) {
  var currentUser = null;
  var selected = null;
  var opened = null;
  var formOpened = null;
  var activityField = null;
  var activitySelected = null;
  var popupBody = null;
  var formOpened = null;
  var periodCheckbox = null;
  var dateField = null;
  var endDateField = null;
  var plannedHours = null;
  var periodselected = null;
  var days = 1;
  var startdate = 0;
  var enddate = 0;
  var planButton = $('#tempo-plan-button');
  //this is the default LM-Holiday activity ID set this
  value to corespond with the value on jira tempo form.
  var holidayid = "10100";
  var holidaysLeft = 21; /*
   $('#tempo-plan-button').click(function () {
   alert("click event");
   });
   $('#tempo-plan-button').focusin(function () {
   alert("focus event");
   });
   $('#tempo-plan-button').hover(function () {
   alert("hover event");
  
   });
   $('#tempo-plan-button').mouseleave(function () {
   alert("mouse leave event");
  
   });
   $('#tempo-plan-button').mouseout(function () {
   alert("mouse out event");
  
   }); */
  $('body').one('focus', 'div[class="aui-popup aui-dialog"]', function (event) {
      $('div[class="aui-popup aui-dialog"]').each(function () {
          popupBody = $(this).find(".dialog-components");
          if ($(this).find(".dialog-title").hasClass("tempo-add-button") === false) {
              i = 0;
              j = 0;
              $(popupBody).find(".dialog-page-menu li").each(function () {
                  if ($(this).attr("class") === "page-menu-item selected") {
                      button = $(this).find('.item-button');
                      if ((button).text() === "Internal") {
                          selected = i;
                      }
                  }
                  i++;
              });
              $(popupBody).find(".dialog-panel-body").each(function () {
                  if ($(this).is(":visible")) {
                      opened = j;
                      formOpened = $(this).find('form');
                  }
                  j++;
              });
              if (selected === null) {
                  i = 0;
                  j = 0;
                  $(popupBody).find(".dialog-page-menu li").click(function () {
                      $(popupBody).find(".dialog-page-menu li").each(function () {
                          if ($(this).attr("class") === "page-menu-item selected") {
                              button = $(this).find('.item-button');
                              if ((button).text() === "Internal") {
                                  selected = i;
                              }
                          }
                          i++;
                      });
                      $(popupBody).find(".dialog-panel-body").each(function () {
                          if ($(this).is(":visible")) {
                              opened = j;
                              formOpened = $(this).find('form');
                          }
                          j++;
                      });
                      if (selected === opened) {
                          activityField = $(formOpened).find('.tempo-activity-picker.select');
                          periodCheckbox = $(formOpened).find('.showperiod.tempo-show-period');
                          dateField = $(formOpened).find(' input[name="date"]');
                          endDateField = $(formOpened).find('input[name="enddate"]');
                          plannedHours = $(formOpened).find('input[name="time"]');
                          days = 1;
                          $(activityField).change(function () {
                              activitySelected = $(this).val();
                          });
  
                          $(periodCheckbox).change(function () {
                              if ($(this).prop("checked")) {
                                  periodselected = true;
                              }
                              else
                              {
                                  periodselected = false;
  
                              }
                          });
                          $(dateField).change(function () {
                              if (periodselected) {
                                  startdate = parseDate($(this).val());
                                  enddate = parseDate($(endDateField).val());
                              } else {
                                  days = 1;
                              }
                              ;
                          });
                          $(endDateField).change(function () {
                              startdatestring = $(dateField).val();
                              enddatestring = $(this).val();
                              startdate = parseDate(startdatestring);
                              enddate = parseDate(enddatestring);
                          });
                          $(plannedHours).off("focusin");
                          $(plannedHours).focusin(function () {
                              if (activitySelected === holidayid) {
                                  if (periodselected) {
                                      days = calcBusinessDays(startdate, enddate);
  
                                      if (holidaysLeft &gt;= days) {
                                          holidaysLeft = holidaysLeft - days;
                         alert("Mai ai " + holidaysLeft + " zile de concediu ramase!");
                        $(popupBody).find('button[accesskey="s"]').removeAttr('disabled');
                                      }
                                      else {
           $(popupBody).find('button[accesskey="s"]').attr('disabled', 'disabled');
           alert('trebuie sa selectezi o perioada mai mica de' + holidaysLeft + 'de zile');
                                      }
                                  } else
                                  {
                                      if (holidaysLeft &gt;= days) {
                                          holidaysLeft = holidaysLeft - days;
                                   alert("Mai ai " + holidaysLeft + " zile de concediu ramase!");
                          $(popupBody).find('button[accesskey="s"]').removeAttr('disabled');
                                      }
                                      else {
                   $(popupBody).find('button[accesskey="s"]').attr('disabled', 'disabled');
                 alert('trebuie sa selectezi o perioada mai mica de' + holidaysLeft + 'de zile');
                                      }
                                  }
                              }
                          });
                      }
                  });
              } else {
                  j = 0;
                  $(popupBody).find(".dialog-panel-body").each(function () {
                      if ($(this).is(":visible")) {
                          opened = j;
                          formOpened = $(this).find('form');
                      }
                      j++;
                  });
                  if (selected === opened) {
                      activityField = $(formOpened).find('.tempo-activity-picker.select');
                      periodCheckbox = $(formOpened).find('.showperiod.tempo-show-period');
                      dateField = $(formOpened).find(' input[name="date"]');
                      endDateField = $(formOpened).find('input[name="enddate"]');
                      plannedHours = $(formOpened).find('input[name="time"]');
                      days = 1;
                      $(activityField).change(function () {
                          activitySelected = $(this).val();
                      });
  
                      $(periodCheckbox).change(function () {
                          if ($(this).prop("checked")) {
                              periodselected = true;
                          }
                          else
                          {
                              periodselected = false;
  
                          }
                      });
                      $(dateField).change(function () {
                          if (periodselected) {
                              startdate = parseDate($(this).val());
                              enddate = parseDate($(endDateField).val());
                          } else {
                              days = 1;
                          }
                          ;
                      });
                      $(endDateField).change(function () {
                          startdatestring = $(dateField).val();
                          enddatestring = $(this).val();
                          startdate = parseDate(startdatestring);
                          enddate = parseDate(enddatestring);
                      });
                      $(plannedHours).off("focusin");
                      $(plannedHours).focusin(function () {
                          if (activitySelected === holidayid) {
                              if (periodselected) {
                                  days = calcBusinessDays(startdate, enddate);
  
                                  if (holidaysLeft &gt;= days) {
                                      holidaysLeft = holidaysLeft - days;
                 alert("Mai ai " + holidaysLeft + " zile de concediu ramase!");
                 $(popupBody).find('button[accesskey="s"]').removeAttr('disabled');
                                  }
                                  else {
                         $(popupBody).find('button[accesskey="s"]').attr('disabled', 'disabled');
                  alert('trebuie sa selectezi o perioada mai mica de' + holidaysLeft + 'de zile');
                                  }
                              } else
                              {
                                  if (holidaysLeft &gt;= days) {
                                      holidaysLeft = holidaysLeft - days;
                                alert("Mai ai " + holidaysLeft + " zile de concediu ramase!");
                           $(popupBody).find('button[accesskey="s"]').removeAttr('disabled');
                                  }
                                  else {
                      $(popupBody).find('button[accesskey="s"]').attr('disabled', 'disabled');
            alert('trebuie sa selectezi o perioada mai mica de' + holidaysLeft + 'de zile');
                                  }
                              }
                          }
                      });
                  }
              }
              ;
          }
          ;
          return false;
      });
  
      $.ajax({
          type: "GET",
          url: location.protocol + '//' + location.host + "/rest/api/2/myself",
          success: function (response) {
              currentUser = $.parseJSON(response);
          },
          error: function (response) {
              alert("Eroare" + response.result);
          }
      });
      return false;
  });
  });
   function calcBusinessDays(dDate1, dDate2) { // input given as Date objects
  var iWeeks, iDateDiff, iAdjust = 0;
  if (dDate2 &lt; dDate1)
      return -1; // error code if dates transposed
  var iWeekday1 = dDate1.getDay(); // day of week
  var iWeekday2 = dDate2.getDay();
  iWeekday1 = (iWeekday1 === 0) ? 7 : iWeekday1; // change Sunday from 0 to 7
  iWeekday2 = (iWeekday2 === 0) ? 7 : iWeekday2;
  if ((iWeekday1 &gt; 5) &amp;&amp; (iWeekday2 &gt; 5))
      iAdjust = 1; // adjustment if both days on weekend
  iWeekday1 = (iWeekday1 &gt; 5) ? 5 : iWeekday1; // only count weekdays
  iWeekday2 = (iWeekday2 &gt; 5) ? 5 : iWeekday2;
  
  // calculate differnece in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000)
  iWeeks = Math.floor((dDate2.getTime() - dDate1.getTime()) / 604800000);
  
  if (iWeekday1 &lt;= iWeekday2) {
      iDateDiff = (iWeeks * 5) + (iWeekday2 - iWeekday1);
  } else {
      iDateDiff = ((iWeeks + 1) * 5) - (iWeekday1 - iWeekday2);
  }
  
  iDateDiff -= iAdjust // take into account both days on weekend
  
  return (iDateDiff + 1); // add 1 because dates are inclusive
  }
  function parseDate(s) {
  var lastSlash = s.lastIndexOf("/");
  var years = s.substring(lastSlash + 1);
  years = "20" + years;
  s = s.replaceAt(lastSlash + 1, years);
  var pattern = /(.*?)\/(.*?)\/(.*?)$/;
  var result = s.replace(pattern, function (match, p1, p2, p3) {
  var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
   'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
      return (months.indexOf(p2) + 1) + "/" + (p1) + "/" + p3;
  });
  return new Date(result);
  }
  String.prototype.replaceAt = function (index, character) {
   return this.substr(0, index) + character + this.substr(index + character.length);
  };
  function propStopped(event) {
  var msg = "";
  if (event.isPropagationStopped()) {
      msg = "called";
  } else {
      msg = "not called";
  }
  alert(msg);
  }
  </code></pre>
  
  <p>Thanks.</p>