/*
 *
 * pouzite priority: 0-499 - muze canclovat, 500+ nema CANCEL
 * (defaultova hodnota priority je 500)
 * vykonava se v poradi dle kodu priority od nejnizsi hodnoty
 *
 **** rizeni
 * ProtectDoubleClick      1
 * ConfirmationDialog    110
 * CanDiscardFormChanges 120
 *
 **** objekty
 * Filter                180
 * Calendar              190
 *
 **** elementy
 * Anchors               200
 * CheckBoxes            210
 *
 **** non caceled objekty
 * OpenWindow            980
 * WaitBox               990
 *
 * ProtectDoubleClick    999
 *
 **** neregistruji se, pouze volaji fci DoClick()
 * AutoSubmit
 * ConditionalAutoSubmit
 */


var grOnClickEventManager = new function(){
  this.frListeners = Array();  
  this.frTarget = null;
  
  this.addListener = function(irListener, isTagID, isTagName, isTagClass, inPriority){
    if(inPriority == null)
      inPriority = 500; // default priority
    var lrListener = {'Listener': irListener,
                      'TagID': isTagID,
                      'TagName': isTagName,
                      'TagClass': isTagClass,
                      'Priority': inPriority};
    var lbPlaced = false;
    if(this.frListeners.length > 0){ // zaradi Lestener do seznamu. Radi vzestupne dle kodu priority
      for (var i = 0; i < this.frListeners.length; i++) {
        if(this.frListeners[i].Priority > inPriority){
          this.frListeners.splice(i, 0, lrListener);
          lbPlaced = true;
          break;
        }
      }
    }
    if(lbPlaced == false)
     this.frListeners.push(lrListener);
  }

 /*
  * INTERNAL FUNCTION
  * tady prosvistim vsemi objekty navesenymi na listeners
  */
  this.ProcessClick = function(irTarget, irEvent){
    var lbCancelled = false;
    var lrListener = null;

    while (   (irTarget != null)
           && !lbCancelled
           && (irTarget.nodeType == CrossBrowser.GetNodeType('ELEMENT_NODE')))
    {
      for (var i = 0; i < this.frListeners.length; i++) {
        lrListener = this.frListeners[i];
        if (   (lrListener.TagID == null || lrListener.TagID == irTarget.id)
            && (lrListener.TagName == null || lrListener.TagName == irTarget.tagName.toLowerCase())
            && (lrListener.TagClass == null || lrListener.TagClass == irTarget.className))
        {
          if (!lrListener.Listener.CapturedClick(irTarget, lrListener.Priority, irEvent)){
            lbCancelled = true;
            break;
          }
        }
      }
      irTarget = irTarget.parentNode;
    }
    return lbCancelled;
  }

  /*
   * volam tuto fci, pokud si chci kliknuti vynutit metodou .click()
   */
  this.DoClick = function(irEvent, irSubmitBtn){
    var lbCancelled = false;

    lbCancelled = this.ProcessClick(irSubmitBtn);
    if (lbCancelled)
      CrossBrowser.CancelEvent(irEvent);
    else
      irSubmitBtn.click();
    return lbCancelled;
  }

  this.CapturedClick = function(irEvent){
    var lrTarget = null;
    var lbCancelled = false;

    lrTarget = CrossBrowser.GetEventTarget(irEvent);
    this.frTarget = lrTarget;
    lbCancelled = this.ProcessClick(lrTarget, irEvent);
    if (lbCancelled)
      CrossBrowser.CancelEvent(irEvent);
  }

  this.Init = function(){
    var lrBody = document.getElementsByTagName('body');
    if (lrBody.length > 0){
      CrossBrowser.addEventListener(lrBody.item(0), 'click', function(irEvent){grOnClickEventManager.CapturedClick(irEvent)});
    }
  }
  /* get target for function ModifyFormAction in formprocessing.js */ 
  this.GetTarget = function(){
    return this.frTarget; 
  }  
  
}

CrossBrowser.addWindowOnLoadListener(function(){grOnClickEventManager.Init()});


