/*
global_message.js.php

Copyright (c) Gareth Hadfield 2008
*/

/* GLOBAL_MESSAGE */

var GLOBAL_MESSAGE=null;
var GLOBAL_MESSAGE_OPACITY = 50; // %
var GLOBAL_MESSAGE_OPACITY_INCREMENT = 3;
var GLOBAL_MESSAGE_OPACITY_INCREMENT_FAST = 25;
var GLOBAL_MESSAGE_OPACITY_INTERVAL = 40; //ms
var GLOBAL_MESSAGE_FADING = false; // reentry

function message_table(aMessage, aButtons){
  aHTML = "";
  aHTML += "<table class='global_message_table'>";

  aHTML += "<tr>";
  aHTML += "<td class='global_message_td'>";
  aHTML += "<center><div class='global_message_div' id='global_message_message_area'>";
  aHTML += aMessage;
  if(aButtons!=undefined){
    aHTML += "<div>";
    for(iButton=0; iButton<aButtons.length; iButton++){
      aHTML += "<input class='global_message_button' onclick='GLOBAL_MESSAGE.button_click("+iButton+");' type='button' value='" + aButtons[iButton] + "' name='" + aButtons[iButton] + "' id='global_message_button_" + iButton + "'></input>&nbsp;";
    }
    aHTML += "</div>";
  }
  aHTML += "</div></center>";
  aHTML += "</td>";
  aHTML += "</tr>";


  aHTML += "</table>";
  return(aHTML);
}

function show_next_global_message(){
  var aMessageVars = GLOBAL_MESSAGE.queue[0];
  var aMessage = aMessageVars[0];
  var aButtons = aMessageVars[1];
  var aOnClose = aMessageVars[2];

  // customise the message
  GLOBAL_MESSAGE.buttons = aButtons;
  GLOBAL_MESSAGE.result = undefined;
  GLOBAL_MESSAGE.onClose = aOnClose;
  if(GLOBAL_MESSAGE.buttons==undefined){
    GLOBAL_MESSAGE.increment = GLOBAL_MESSAGE_OPACITY_INCREMENT;
  }
  else{
    GLOBAL_MESSAGE.increment = GLOBAL_MESSAGE_OPACITY_INCREMENT_FAST;
  }

  if(typeof(aMessage) == "string"){
    // aMessage is plain text
    GLOBAL_MESSAGE.messageBox.innerHTML = message_table(aMessage, aButtons);
  }
  else{
    // aMessage is a dom object
    GLOBAL_MESSAGE.messageBox.innerHTML = message_table("", aButtons);
    var aMessageArea = document.getElementById("global_message_message_area");
    aMessageArea.insertBefore(aMessage, aMessageArea.firstChild);
  }

  if(IS_IE){
    GLOBAL_MESSAGE.style.top = document.body.scrollTop;
    GLOBAL_MESSAGE.messageBox.style.top = document.body.scrollTop;
  }

  setOpacity(GLOBAL_MESSAGE, GLOBAL_MESSAGE_OPACITY);

  bring_to_front(GLOBAL_MESSAGE.messageBox);

  GLOBAL_MESSAGE.style.display = "";
  GLOBAL_MESSAGE.messageBox.style.display = "";
}

function show_global_message(aMessage, aButtons, aOnClose){
  if(typeof(aMessage)=="string"){
    aMessage = nlbr(aMessage);
  }
  if(GLOBAL_MESSAGE==undefined){
    // first time - so create the elements

    // background part
    GLOBAL_MESSAGE = document.createElement("div");
    GLOBAL_MESSAGE.className="global_message_main";
    GLOBAL_MESSAGE.queue = new Array();
    if(IS_IE){
      GLOBAL_MESSAGE.style.width=document.body.clientWidth;
    }

    GLOBAL_MESSAGE.disable_all_buttons = bind(GLOBAL_MESSAGE, function(){
      //var aButtons = all_class(all_tags("input"), "global_message_button");
      var aButtons = get_all_class("input", "global_message_button");
      for(var i=0; i<aButtons.length; i++){
        aButtons[i].disabled = true;
      }
    });

    GLOBAL_MESSAGE.button_click = bind(GLOBAL_MESSAGE, function(iButton){
      // disable all the buttons - prevents dbl-click etc.
      this.disable_all_buttons();
      this.result = iButton;
      hide_global_message();
    });

    document.body.appendChild(GLOBAL_MESSAGE);

    // message box part
    var messageBox = document.createElement("div");
    messageBox.className = "global_message_box";

    if(IS_IE){
      messageBox.style.position="absolute";
      GLOBAL_MESSAGE.style.position="absolute";
    }

    document.body.appendChild(messageBox);

    GLOBAL_MESSAGE.messageBox = messageBox;
  }

  GLOBAL_MESSAGE.queue.push(new Array(aMessage, aButtons, aOnClose));

  show_next_global_message();
}

function fadeout_global_message(){
  if(!GLOBAL_MESSAGE_FADING){
    GLOBAL_MESSAGE_FADING = true;
    current_opacity = getOpacity(GLOBAL_MESSAGE);

    if(current_opacity > 3){ // bail at 3 since difference is insignificant
      // fade one increment
      current_opacity = current_opacity - GLOBAL_MESSAGE.increment;//GLOBAL_MESSAGE_OPACITY_INCREMENT;

      setOpacity(GLOBAL_MESSAGE, current_opacity);
    }
    else{
      // finished fading
      clearInterval(GLOBAL_MESSAGE.interval);

      GLOBAL_MESSAGE.style.display = "none";
      GLOBAL_MESSAGE.messageBox.style.display = "none";

      setOpacity(GLOBAL_MESSAGE, GLOBAL_MESSAGE_OPACITY);

      GLOBAL_MESSAGE.queue.shift(); // remove current message from the queue

      if(GLOBAL_MESSAGE.onClose!=undefined){
        var keepGoing = GLOBAL_MESSAGE.onClose(GLOBAL_MESSAGE.result);
        if(keepGoing==undefined){
          keepGoing=true;
        }
        if(!keepGoing){
          return;
        }
      }

      if((GLOBAL_MESSAGE != undefined) && (GLOBAL_MESSAGE.queue.length > 0)){
        // still more messages - so call show_next_global_message
        show_next_global_message();
      }

    }

    GLOBAL_MESSAGE_FADING = false;
  }
  else{
    // todo - does this ever occur?
  }
}

function hide_global_message(){
  if(GLOBAL_MESSAGE!=null){
    GLOBAL_MESSAGE.interval = setInterval(fadeout_global_message, GLOBAL_MESSAGE_OPACITY_INTERVAL);
  }
}

function remove_global_message(){
  // get rid of the global message nodes
  if(GLOBAL_MESSAGE!=undefined){
    GLOBAL_MESSAGE.messageBox.parentNode.removeChild(GLOBAL_MESSAGE.messageBox);
    GLOBAL_MESSAGE.parentNode.removeChild(GLOBAL_MESSAGE);
    GLOBAL_MESSAGE = undefined;
  }
}
