﻿//-----------------------------------------------------------------------------
// XMsg
//
// Copyright 2005-2010 - Xcential Group LLC.
//
//-----------------------------------------------------------------------------

//=============================================================================
// Constructor

function XMsg(
   description,
   previousMsg
)
{
   previousMsg = (previousMsg == null) ? null : previousMsg;

   var msg = new Array(); // TODO: Should be Error()
   msg.history = new Array();

   if (typeof(description) == "number")
   {
      msg.number = description;
      msg.description = XMsg.getMsgText(description);
   }
   else if (XMatch(description, /(<Error>.*<\/Error>)/))
   {
      var msgXML = XMatch.matches[1];
      var xDoc = XDoc(msgXML);
      var msgText = xDoc.X$("/Error/Text");
      if (msgText)
         msg.description = msgText.toText();
      var history = xDoc.X$$("/Error/History/Text");
      for (var i=0; i<history.length; i++)
      {
         var historyText = history.X$(i);
         msg.history.push(historyText.toText());
      }
   }
   else if (XMatch(description, /(<Note>.*<\/Note>)/))
   {
      var msgXML = XMatch.matches[1];
      var xDoc = XDoc(msgXML);
      var msgText = xDoc.X$("/Note/Text");
      if (msgText)
         msg.description = "Note: " + msgText.toText().replace(/^Note:\s*/i, "");
      var history = xDoc.X$$("/Note/History/Text");
      for (var i=0; i<history.length; i++)
      {
         var historyText = history.X$(i);
         msg.history.push(historyText.toText());
      }
   }
   else
   {
      msg.description = description;

      if (previousMsg)
      {
         try
         {
            if (previousMsg.history && previousMsg.history.length > 0)
               msg.history = previousMsg.history;
            var previousMsgText = XMsg.getMsgText(previousMsg);
            if (previousMsgText && previousMsgText.length > 0)
               msg.history.push(previousMsgText);
         }
         catch (error)
         {
            // Do not log this as an error
         }
      }
   }

   return msg;
}

//=============================================================================
// Static Interface

XMsg.ALL = true;

//-----------------------------------------------------------------------------

XMsg.isError = function(
   msg
)
{
   msg = (msg == null) ? "" : msg.toString();

   return ((/^<Error>/).test(msg)) ? true : false;
}

//-----------------------------------------------------------------------------

XMsg.hasError = function(
   msg,
   error
)
{
   msg = (msg == null) ? null : msg;

   if (!msg)
      return false;

   var errorText = XMsg.getMsgText(error);

   switch (typeof(msg))
   {
      case "string":
         return (errorText == msg) ? true : false
         break;
      case "number":
         return (errorText == XMsg.getMsgText(msg)) ? true : false;
         break;
      case "boolean":
         return (errorText == XMsg.getMsgText(msg)) ? true : false;
         break;
      case "function":
         return (errorText == XMsg.getMsgText(msg)) ? true : false;
         break;
      case "object":
         if (errorText == XMsg.getMsgText(msg.description))
            return true;
         else if (msg.history)
         {
            for (var i=0; i<msg.history.length; i++)
            {
               if (errorText == msg.history[i])
                  return true;
            }
         }
         break;
   }

   return false;
}

//-----------------------------------------------------------------------------

XMsg.getMsgText = function(
   msg,
   all
)
{
   msg = (msg == null) ? null : msg;
   all = (all == null) ? false : all;

   if (!msg)
      return null;

   var msgText = "";
   switch (typeof(msg))
   {
      case "string":
         msgText = msg;
         break;
      case "number":
         msgText = "Error code: " + msg;
         break;
      case "boolean":
         msgText = (XString(msg).isSomething()) ? "TRUE Error." : "FALSE Error.";
         break;
      case "function":
         try
         {
            msgText = "Function:" + msg();
         }
         catch (error)
         {
            XApp.logEvent(XApp.EVENT_ERROR, error);
            return null;
         }
         break;
      case "object":
         try
         {
            if (msg.description)
               msgText = msg.description;
         }
         catch (error) {}
         if (msgText.length == 0)
         {
            try
            {
               if (msg.message)
                  msgText = msg.message;
            }
            catch (error) {}
         }
         if (XApp.DEBUG)
         {
            try
            {
               if (msg.name)
                  msgText += " (" + msg.name + ")";
               if (msg.fileName || msg.lineNumber)
               {
                  msgText +=" ( ";
                  if (msg.fileName)
                     msgText += msg.fileName + " ";
                  if (msg.lineNumber)
                     msgText += "line #: " + msg.lineNumber + " ";
                  msgText += ")";
               }
            }
            catch (error) {}
         }
         break;
   }

   msgText = XString(msgText).trim();
   if (msgText.length == 0)
      msgText = "(No error message provided.)";
   else
      msgText += ((/\.$/).test(msgText)) ? "" : ".";

   if (all && msg.history)
   {
      for (var i=0; i<msg.history.length; i++)
      {
         msgText += " " + XMsg.getMsgText(msg.history[i], XMsg.ALL).replace(/\.\s*$/,"") + ".";
      }
   }

   return msgText;
}

//-----------------------------------------------------------------------------

XMsg.getMsgXML = function(
   msg
)
{
   msg = (msg == null) ? null : msg;

   if (!msg)
      return null;

   var msgText = XMsg.getMsgText(msg);
   var msgXML = ((/^\s*Note:/i).test(msgText)) ? "<Note>" : "<Error>";
   msgXML += "<Text>" + XString(XMsg.getMsgText(msg)).encode(XString.ENCODE_ENTITY) + "</Text>";
   try
   {
      if (msg.history.length > 0)
      {
         var historyXML = "<History>";
         for (var i=0; i<msg.history.length; i++)
            historyXML += "<Text>" + XString(msg.history[i]).encode(XString.ENCODE_ENTITY) + "</Text>";
         historyXML += "</History>";
         msgXML += historyXML;
      }
   }
   catch (error)
   {
      // Do not log this as an error
   }
   msgXML += ((/^\s*Note:/i).test(msgText)) ? "</Note>" : "</Error>";

   return msgXML;
}

//-----------------------------------------------------------------------------

XMsg.getHistory = function(
   msg
)
{
   msg = (msg == null) ? null : msg;

   if (!msg)
      return null;

   var history = "";
   try
   {
      for (var i=0; i<msg.history.length; i++)
      {
         var msgText = msg.history[i];
         var isNote = ((/^\s*Note:/i).test(msgText)) ? true : false;
         msgText = msgText.replace(/^\s*Note:/i, "");
         history = "<div class=\"" +
            ((isNote) ? "MessageList Note" : "MessageList Error") + "\">" +
            "&bull; " +
            ((isNote) ? "<b class=\"Note\">Note:</b> " : "<b class=\"Error\">Error:</b> ") +
            msgText +
            "</div>" +
            history;
      }
   }
   catch (error)
   {
      // Do not log this as an error
   }

   return history;
}

//-----------------------------------------------------------------------------

XMsg.showDetails = function(
   id
)
{

   XUI(id + ".showDetailsIcon").setRuntimeStyle("display", "none");
   XUI(id + ".hideDetailsIcon").setRuntimeStyle("display", XUI.INLINE_BLOCK_DISPLAY);
   XUI(id + ".details").setRuntimeStyle("display", "block");

}

//-----------------------------------------------------------------------------

XMsg.hideDetails = function(
   id
)
{

   XUI(id + ".showDetailsIcon").setRuntimeStyle("display", XUI.INLINE_BLOCK_DISPLAY);
   XUI(id + ".hideDetailsIcon").setRuntimeStyle("display", "none");
   XUI(id + ".details").setRuntimeStyle("display", "none");

}

//-----------------------------------------------------------------------------

XMsg.getMsgHTML = function(
   msg,
   prefix
)
{
   prefix = (prefix == null) ? "" : prefix + ":";

   // Note: This is really kludgy.
   var id = XUtils.generateId("urn:xcential-com:msg:", XUtils.SCHEME_GUID);

   var msgText = XMsg.getMsgText(msg);
   var isNote = ((/^\s*Note:/i).test(msgText)) ? true : false;
   msgText = msgText.replace(/^\s*Note:\s*/i, "");

   var msgHTML = "";
   msgHTML += "<" + prefix + "div " +
      "class=\"Box\" " +
      "id=\"" + id + "\" " +
      "style=\"" +
         "position: absolute; " +
         "top: 0px; " +
         "left: 0px; " +
         "bottom: 0px; " +
         "right: 0px; " +
         "width: 100%; " +
         "height: 100%; " +
      "\"" +
   ">";
      msgHTML += "<" + prefix + "table " +
         "style=\"" +
            "position: absolute; " +
            "top: 0px; " +
            "left: 0px; " +
            "width: 100%; " +
            "height: 100%; " +
         "\"" +
      ">";
         msgHTML += "<" + prefix + "tr>";
            msgHTML += "<" + prefix + "td " +
               "class=\"Message Text4M " + ((isNote) ? "Note" : "Error") + "\" " +
               "style=\"" +
                  "text-align: center; " +
                  "vertical-align: middle; " +
               "\"" +
               ">";
                  var history = XMsg.getHistory(msg);
                  if (history && history.length > 0)
                  {
                     msgHTML += "<" + prefix + "img " +
                        "id=\"" + id + ".showDetailsIcon\" " +
                        "class=\"ActionIcon\" " +
                        "src=\"" + "/app/pkgs/xfw/images/Expand1.gif\" " +
                        "title=\"Show details\" " +
                        "onclick=\"XMsg.showDetails('" + id + "')\" " +
                     "/>";
                     msgHTML += "<" + prefix + "img " +
                        "id=\"" + id + ".hideDetailsIcon\" " +
                        "class=\"Hidden ActionIcon\" " +
                        "src=\"" + "/app/pkgs/xfw/images/Collapse1.gif\" " +
                        "title=\"Hide details\" " +
                        "onclick=\"XMsg.hideDetails('" + id + "')\" " +
                     "/>";
                  }
                  msgHTML += ((isNote) ? "<" + prefix + "b class=\"Note\">Note:</" + prefix + "b> " : "<" + prefix + "b class=\"Error\">Error:</" + prefix + "b> ") + msgText;
                  if (history && history.length > 0)
                  {
                     msgHTML += "<" + prefix + "br/>";
                     msgHTML += "<" + prefix + "br/>";
                     msgHTML += "<" + prefix + "div " +
                        "id=\"" + id + ".details\" " +
                        "class=\"MessageBox Hidden Centered Text4M Note\" " +
                     ">";
                     msgHTML += "<" + prefix + "b class=\"Note\">Support Details:</" + prefix + "b><" + prefix + "br/> " + history;
                     msgHTML += "</" + prefix + "div>";
                  }
            msgHTML += "</" + prefix + "td>";
         msgHTML += "</" + prefix + "tr>";
      msgHTML += "</" + prefix + "table>";
   msgHTML += "</" + prefix + "div>";

   return msgHTML;
}

//-----------------------------------------------------------------------------

XMsg.report = function(
   msg
)
{

   document.write(XMsg.getMsgHTML(msg));

}

//-----------------------------------------------------------------------------

XMsg.alert = function(
   msg
)
{

   var msg = XMsg.getMsgText(msg);

   if (XApp.DEBUG)
   {
      var callingContext = XApp.getCallingContext();
      if (XString(callingContext).isSomething())
         msg += " [Called from '" + callingContext + "']";
   }

   alert(XMsg.getMsgText(msg));

}

//=============================================================================
