/*
 * Copyright (c) 1998-2009 TeamDev Ltd. All Rights Reserved.
 * Use is subject to license terms.
 */

// ================================== PUBLIC API METHODS
function q_runConfirmedFunction(confirmationId, func) {
  if (!confirmationId)
    throw "q_runConfirmedFunction: confirmations's clientId must be passed as a parameter";
  var confirmation = q__getControl(confirmationId);
  if (!confirmation)
    throw "q_runConfirmedFunction: Invalid clientId passed - no such component was found: " + confirmationId;
  return confirmation.runConfirmedFunction(func);
}

function q_runConfirmedFunctionByName(confirmationId, funcName, parameters) { // todo: remove q_runConfirmedFunctionByName, the usage of parameters can be replaced by a simple closure passed to q_runConfirmedFunction
  if (!confirmationId)
    throw "q_runConfirmedFunctionByName: confirmations's clientId must be passed as a parameter";
  var confirmation = q__getControl(confirmationId);
  if (!confirmation)
    throw "q_runConfirmedFunctionByName: Invalid clientId passed - no such component was found: " + confirmationId;
  return confirmation.runConfirmedFunctionByName(funcName, parameters);
}

function q_setConfirmationTexts(confirmationId, messageText, detailsText, okButtonText, cancelButtonText) {
  if (!confirmationId)
    throw "q_setConfirmationTexts: confirmations's clientId must be passed as a parameter";
  var confirmation = q__getControl(confirmationId);
  if (!confirmation)
    throw "q_setConfirmationTexts: Invalid clientId passed - no such component was found: " + confirmationId;
  confirmation.setTexts(messageText, detailsText, okButtonText, cancelButtonText);
}

// ================================== END OF PUBLIC API METHODS


function q__initConfirmation(
        confirmationId,
        invokerId,
        eventHandlerName,
        defaultButton,
        bindToInvoker) {
  var confirmation = q__getControl(confirmationId);
  confirmation._invokerId = invokerId;
  confirmation._eventHandlerName = eventHandlerName;
  confirmation._defaultButton = defaultButton;
  confirmation._bindToInvoker = bindToInvoker;

  confirmation._buttonArea = q__getControl(confirmationId + "::buttonArea");

  confirmation._listenerMode = 0;

  confirmation._icon = q__getControl(confirmationId + "::icon");
  confirmation._messageText = q__getControl(confirmationId + "::headerText");
  confirmation._detailsText = q__getControl(confirmationId + "::detailsText");
  confirmation._okButton = q__getControl(confirmationId + "::yes_button");
  confirmation._cancelButton = q__getControl(confirmationId + "::no_button");

  confirmation._okButton.onclick = function (event) {
    confirmation._confirmationHide();
    if (confirmation._listenerMode == 0) { // listen to event with eventHandlerName of element with invokerId
      var invoker = confirmation._invoker ? confirmation._invoker : q__getControl(confirmation._invokerId);
      if (!invoker)
        invoker = confirmation;

      var eventHandler = window.q__confirmationEventHandlers[confirmation.id];
      var result = undefined;
      if (eventHandler) { // invoke eventHandler with "this" variable pointing to invoker...
        invoker.q_invokeYesHandler = eventHandler;
        invoker.q_fnc = q__getEventHandlerFunction("q_invokeYesHandler", null, invoker);
        result = invoker.q_fnc(event);
      }
      if (invoker.type == "submit") {
        result = result !== false;
        if (result) {
          invoker.onclick = null;
          invoker.click();
        }
      }
      return;
    }

    if (confirmation._listenerMode == 1) { // runConfirmedFunction
      confirmation._listenerMode = 0;
      if (confirmation._evaluatedFunction) {
        confirmation._evaluatedFunction();
      }
      return;
    }

    // runConfirmedFunctionByName
    confirmation._listenerMode = 0;
    var evalString = confirmation._evaluatedFunctionName + "("

    if (confirmation._evaluatedFunctionParameters) {
      for (var i = 0; i < confirmation._evaluatedFunctionParameters.length; i++) {
        if (i > 0) {
          evalString += ", ";
        }
        evalString += "confirmation._evaluatedFunctionParameters[" + i + "]";
      }
    }
    evalString += ");"

    eval(evalString);
  }

  confirmation._cancelButton.onclick = function () {
    confirmation._confirmationHide();
    return false;
  }

  if (confirmation._closeButton) {
    confirmation._closeButton.onclick = function () {
      confirmation._confirmationHide();
      return false;
    }
  }

  // Set listener on element
  if (confirmation._invokerId != null && confirmation._eventHandlerName != null) {
    var attachConfirmation = function () {
      var invoker = document.getElementById(confirmation._invokerId);
      if (!invoker) {
        var thisTime = new Date().getTime();
        if (!confirmation._firstAttachAttemptTime) {
          confirmation._firstAttachAttemptTime = thisTime;
          confirmation._elapsedSinceFirstAttachAttempt = 0;
        } else {
          // don't take large chunks of javascript-busy time into account, count only execution-free time when timeouts flow reliably
          var elapsedSinceLastAttempt = thisTime - confirmation._previousAttachAttemptTime;
          if (elapsedSinceLastAttempt < 100)
            confirmation._elapsedSinceFirstAttachAttempt += elapsedSinceLastAttempt;
        }
        if (confirmation._elapsedSinceFirstAttachAttempt > 5000)
          throw "Invalid invokerId for confirmation. Couldn't find component with clientId: " + confirmation._invokerId;
        confirmation._previousAttachAttemptTime = thisTime;
        setTimeout(attachConfirmation, 30);
        return;
      }
      if (invoker.q__confirmationIds && q__arrayContainsValue(invoker.q__confirmationIds, confirmation.id)) {
        var idx = q__findValueInArray(confirmation.id, invoker.q__confirmationIds);
        invoker.q__confirmationIds.splice(idx - 1, 1);
      }
      if (!window.q__confirmationEventHandlers)
        window.q__confirmationEventHandlers = new Array();
      if (!window.q__confirmationEventHandlers[confirmation.id]) {
        window.q__confirmationEventHandlers[confirmation.id] = invoker[confirmation._eventHandlerName];
      }

      invoker[confirmation._eventHandlerName] = function (event) {
        confirmation._showForEvent(event);
        return false;
      };

      if (!invoker.q__confirmationIds)
        invoker.q__confirmationIds = new Array();
      // we save ids of all registered confirmations to support use-case when confirmation is reloaded with a4j
      invoker.q__confirmationIds.push(confirmation.id);
    }
    var invoker = q__getControl(confirmation._invokerId);
    if (invoker) { // this branch is to support loading confirmation through ajax/a4j
      attachConfirmation();
    } else {
      q__addLoadEvent(function () {
        attachConfirmation();
      });
    }
  }

  confirmation._showForEvent = function (e) {
    confirmation.invokerEvent = q__getEvent(e);
    confirmation._confirmationShow();
    return false;
  }


  confirmation._confirmationShow = function () {
    var invoker = q__getControl(confirmation._invokerId);
    if (invoker)
      q__correctElementZIndex(confirmation, invoker);
    q__layoutConfirmation(confirmation);

    confirmation.show();

    // if not left-top set, move it to the center
    q__layoutConfirmation(confirmation);

    // IE fixes for modality
    /*
        if(document.body.leftMargin) {
          confirmation.blockingLayer.style.left = (confirmation.blockingLayer.offsetLeft*1 + document.body.leftMargin*1) + "px";
        }
    */

    confirmation._okButton.onfocus = function () {
      confirmation._currentFocus = 0;
    }

    confirmation._cancelButton.onfocus = function () {
      confirmation._currentFocus = 1;
    }

    if (q__isOpera()) {
      confirmation._oldDocumentOnMouseDown = document.onmousedown;
      document.onmousedown = function () {
        if (confirmation._currentFocus == 0) {
          confirmation._okButton.focus();
        } else {
          confirmation._cancelButton.focus();
        }
      }
    } else {
      confirmation._oldDocumentOnClick = document.onclick;
      document.onclick = function () {
        if (confirmation.isVisible()) { // need for IE for cases when closeOnOuterClick=true
          if (confirmation._currentFocus == 0) {
            confirmation._okButton.focus();
          } else {
            confirmation._cancelButton.focus();
          }
        }
      }
    }

    // Fix for FF, when caption has a border
    if (confirmation._caption) {
      //      confirmation.caption.style.top = q__getElementTop(confirmation) + "px";
      //      confirmation.caption.style.left = q__getElementLeft(confirmation) + "px";
      confirmation._caption.style.top = "0px";
      confirmation._caption.style.left = "0px";
      if (q__isMozillaFF() || q__isSafari3AndLate() /*todo:check whetther q__isSafari3AndLate check is really needed (it was added by mistake)*/ || q__isExplorer()) { // todo: checking q__isExplorer might not be needed here -- check this
        if (!confirmation._caption.style.width) {
          confirmation._caption.style.width = confirmation.clientWidth - (confirmation._caption.clientWidth - confirmation.clientWidth) + "px";
        }
      }
    }

    confirmation._preAnchor.onfocus = function () {
      confirmation._cancelButton.focus();
    }
    confirmation._postAnchor.onfocus = function () {
      confirmation._okButton.focus();
    }

    // set focus on button
    if (confirmation._defaultButton == "ok") {
      confirmation._currentFocus = 0;
      confirmation._okButton.focus();
    } else {
      confirmation._currentFocus = 1;
      confirmation._cancelButton.focus();
    }
  }

  confirmation._confirmationHide = function () {
    if (!this.isVisible()) return;

    if (q__isOpera()) {
      document.onmousedown = confirmation._oldDocumentOnMouseDown;
    } else {
      document.onclick = confirmation._oldDocumentOnClick;
    }
    confirmation._preAnchor.onfocus = function () {
    }
    confirmation._postAnchor.onfocus = function () {
    }

    confirmation.hide();
  }

  // set escape behavior
  confirmation._okButton.onkeydown = function (e) {
    var evt = (e != undefined) ? e : (event ? event : null);
    if (!evt) return;
    var keyCode = evt.keyCode;
    if (keyCode == 27) {
      confirmation._confirmationHide();
    }
  }

  confirmation._cancelButton.onkeydown = confirmation._okButton.onkeydown;

  confirmation.setTexts = function (messageText, detailsText, okButtonText, cancelButtonText) {
    if (messageText || messageText == "") {
      confirmation._messageText.innerHTML = messageText;
    }
    if (detailsText || detailsText == "") {
      confirmation._detailsText.innerHTML = detailsText;
    }
    if (okButtonText || okButtonText == "") {
      confirmation._okButton.value = okButtonText;
    }
    if (cancelButtonText || cancelButtonText == "") {
      confirmation._cancelButton.value = cancelButtonText;
    }
  }

  confirmation.runConfirmedFunctionByName = function (funcName, parameters) {
    confirmation._listenerMode = 2;
    confirmation._evaluatedFunctionName = funcName;
    confirmation._evaluatedFunctionParameters = parameters;
    confirmation._confirmationShow();
    return false;
  }

  confirmation.runConfirmedFunction = function (func) {
    confirmation._listenerMode = 1;
    confirmation._evaluatedFunction = func;
    confirmation._confirmationShow();
    return false;
  }

  q__addLoadEvent(function() {
    // pull confirmation to the top hierarchy level to avoid possible z-index problems. E.g. a problem can occur if
    // a confirmation is placed inside of an absolutely-positioned layer with z-index less than z-index of
    // confirmation's blocking layer
    var newParent = q__getDefaultAbsolutePositionParent();
    newParent.appendChild(confirmation);
  });

}

function q__initConfirmationInnerStyles(confirmationId, iconAreaStyle, rolloverIconAreaStyle,
                                        contentStyle, rolloverContentStyle, messageTextStyle, rolloverMessageTextStyle,
                                        detailsTextStyle, rolloverDetailsTextStyle, buttonAreaStyle,
                                        rolloverButtonAreaStyle, okButtonStyle, rolloverOkButtonStyle,
                                        cancelButtonStyle, rolloverCancelButtonStyle) {
  var confirmation = q__getControl(confirmationId);

  confirmation.iconAreaStyle = iconAreaStyle;
  confirmation.rolloverIconAreaStyle = rolloverIconAreaStyle;
  confirmation.contentStyle = contentStyle;
  confirmation.rolloverContentStyle = rolloverContentStyle;
  confirmation.messageTextStyle = messageTextStyle;
  confirmation.rolloverMessageTextStyle = rolloverMessageTextStyle;
  confirmation.detailsTextStyle = detailsTextStyle;
  confirmation.rolloverDetailsTextStyle = rolloverDetailsTextStyle;
  confirmation.okButtonStyle = okButtonStyle;
  confirmation.rolloverOkButtonStyle = rolloverOkButtonStyle;
  confirmation.buttonAreaStyle = buttonAreaStyle;
  confirmation.rolloverButtonAreaStyle = rolloverButtonAreaStyle;
  confirmation.cancelButtonStyle = cancelButtonStyle;
  confirmation.rolloverCancelButtonStyle = rolloverCancelButtonStyle;

  if (confirmation._icon) {
    confirmation._icon.className = confirmation.iconAreaStyle;
  }
  confirmation._content.className = confirmation.contentStyle;
  confirmation._buttonArea.className = confirmation.buttonAreaStyle;
  if (confirmation._messageText) {
    confirmation._messageText.className = confirmation.messageTextStyle;
  }
  if (confirmation._detailsText) {
    confirmation._detailsText.className = confirmation.detailsTextStyle;
  }
  confirmation._okButton.className = confirmation.okButtonStyle;
  confirmation._cancelButton.className = confirmation.cancelButtonStyle;

  confirmation.oldOnMouseOver = confirmation.onmouseover;
  confirmation.onmouseover = function (e) {
    if (confirmation.oldOnMouseOver) {
      confirmation.oldOnMouseOver(e);
    }
    if (confirmation._onmouseover) {
      confirmation._onmouseover(e);
    }
    if (confirmation._icon) {
      confirmation._icon.className = confirmation.rolloverIconAreaStyle;
    }
    confirmation._content.className = confirmation.rolloverContentStyle;
    confirmation._buttonArea.className = confirmation.rolloverButtonAreaStyle;
    if (confirmation._messageText) {
      confirmation._messageText.className = confirmation.rolloverMessageTextStyle;
    }
    if (confirmation._detailsText) {
      confirmation._detailsText.className = confirmation.rolloverDetailsTextStyle;
    }
  }

  confirmation.oldOnMouseOut = confirmation.onmouseout;
  confirmation.onmouseout = function (e) {
    if (confirmation.oldOnMouseOut) {
      confirmation.oldOnMouseOut(e);
    }
    if (confirmation._onmouseout) {
      confirmation._onmouseout(e);
    }
    if (confirmation._icon) {
      confirmation._icon.className = confirmation.iconAreaStyle;
    }
    confirmation._content.className = confirmation.contentStyle;
    confirmation._buttonArea.className = confirmation.buttonAreaStyle;
    if (confirmation._messageText) {
      confirmation._messageText.className = confirmation.messageTextStyle;
    }
    if (confirmation._detailsText) {
      confirmation._detailsText.className = confirmation.detailsTextStyle;
    }
  }

  confirmation._okButton.onmouseover = function () {
    confirmation._okButton.className = confirmation.rolloverOkButtonStyle;
  }

  confirmation._okButton.onmouseout = function () {
    confirmation._okButton.className = confirmation.okButtonStyle;
  }

  confirmation._cancelButton.onmouseover = function () {
    confirmation._cancelButton.className = confirmation.rolloverCancelButtonStyle;
  }

  confirmation._cancelButton.onmouseout = function () {
    confirmation._cancelButton.className = confirmation.cancelButtonStyle;
  }
}

function q__layoutConfirmation(confirmation) {
  var invoker = confirmation._invokerId ? q__getControl(confirmation._invokerId) : null;
  confirmation._invoker = invoker;
  if (invoker && confirmation._bindToInvoker) {
    var invokerRect = q__getElementBorderRectangle(invoker);
    confirmation.setLeft(invokerRect.getMinX());
    confirmation.setTop(invokerRect.getMaxY());
  } else {
    q__centerPopup(confirmation);
  }
}

//AUTO GENERATED CODE

window['q_loadedLibrary:/qk_internalResource/teamdev/jsf/renderkit/confirmation/confirmation-2.0.js'] = true;