﻿//-----------------------------------------------------------------------
// <copyright file="MEDHOST.DataWidget.Server.Web.ClientLibrary.js" company="MEDHOST">
//   Copyright (c) MEDHOST, Inc. All rights reserved.
// </copyright>
//-----------------------------------------------------------------------

var MEDHOSTDataWidgetEdisKpiWebServicePath = "EdisKpi.asmx";
var MEDHOSTDataWidgetWebServiceNamespace = "http://MEDHOST.com/DataWidget/";
var MEDHOSTGetAverageEDWaitTimeConfigurationWebServiceMethodName = "GetAverageEDWaitTimeConfiguration";
var MEDHOSTGetAverageEDWaitTimeMinutesWebServiceMethodName = "GetAverageEDWaitTimeMinutes";
var MEDHOSTGetAverageEDWaitTimeFormattedWebServiceMethodName = "GetAverageEDWaitTimeFormatted";

// MEDHOST WebService Request method
// MEDHOSTgetAverageEDWaitTimeConfigurationAsync
// Starts an asynchronous web service method to get site configuration values for the average ED Wait Time functionality.
// A client callback function receives the web service request status and the method return value.
//  sample:
//    MEDHOSTgetAverageEDWaitTimeConfigurationAsync(MEDHOSTDataWidgetUrlBase, getAverageEDWaitTimeConfigurationCallback)
//
//  input:
//    String baseWebServiceUrl - The base url for the web service. For example, "http://localhost".
//    function clientCallback - A function to be called upon completion of the web service method.
//      The function should have the format: void functionName(Number requestStatus, Number refreshIntervalMinutes, String labelText, String labelPosition, String containerStyle, String labelStyle, String valueStyle).
//  return:
//    none
function MEDHOSTgetAverageEDWaitTimeConfigurationAsync(baseWebServiceUrl, clientCallback)
{
  var webServicePath = MEDHOSTDataWidgetEdisKpiWebServicePath;
  var webServiceNamespace = MEDHOSTDataWidgetWebServiceNamespace;
  var webServiceMethodName = MEDHOSTGetAverageEDWaitTimeConfigurationWebServiceMethodName;

  var webServiceRequestObj = MEDHOSTinstantiateWebServiceRequestObject();

  if (webServiceRequestObj == null)
  {
    MEDHOSTgetAverageEDWaitTimeConfigurationCompleted(clientCallback);
    return;
  }

  if ((baseWebServiceUrl.length > 0) && (baseWebServiceUrl.substr(baseWebServiceUrl.length - 1) != '/'))
  {
    baseWebServiceUrl += '/';
  }
  var fullWebServiceUrl = baseWebServiceUrl + webServicePath;

  if (false)
  {
    // force a client-side refresh of the web service call by including an extraneous unique query parameter
    fullWebServiceUrl = fullWebServiceUrl + "?timestamp=" + MEDHOSTformatDateUniversalSortable(new Date());
  }

  var isAsynchronous = true;
  webServiceRequestObj.open("POST", fullWebServiceUrl, isAsynchronous);
  webServiceRequestObj.onreadystatechange = function()
  {
    if (webServiceRequestObj.readyState == 4)
    {
      MEDHOSTgetAverageEDWaitTimeConfigurationCompleted(clientCallback);
    }
  };
  webServiceRequestObj.setRequestHeader("Content-Type", "text/xml");
  webServiceRequestObj.setRequestHeader("SOAPAction", webServiceNamespace + webServiceMethodName);

  var requestBody =
    "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>" +
      "<soap:Body>" +
        "<" + webServiceMethodName + " xmlns='" + webServiceNamespace + "'>" +
  //      "<" + parameterOneName + ">" + parameterOne + "</" + parameterOneName + ">" +
  //      "<" + parameterTwoName + ">" + parameterTwo + "</" + parameterTwoName + ">" +
        "</" + webServiceMethodName + ">" +
      "</soap:Body>" +
    "</soap:Envelope>";
  webServiceRequestObj.send(requestBody);
}

// MEDHOST WebService Request method callback (internal)
// MEDHOSTgetAverageEDWaitTimeConfigurationCompleted
// Handles notification of completion of the get average ED wait time configuration web service method
// to notify the client of the return value and web service request status.
//  sample:
//    none
//
//  input:
//    function clientCallback - A function to be called upon completion of the web service method.
//  return:
//    none
function MEDHOSTgetAverageEDWaitTimeConfigurationCompleted(clientCallback)
{
  var webServicePath = MEDHOSTDataWidgetEdisKpiWebServicePath;
  var webServiceNamespace = MEDHOSTDataWidgetWebServiceNamespace;
  var webServiceMethodName = MEDHOSTGetAverageEDWaitTimeConfigurationWebServiceMethodName;

  var requestStatus = 0;
  var refreshIntervalMinutes = -1;
  var labelText = "";
  var labelPosition = "";
  var containerStyle = "";
  var labelStyle = "";
  var valueStyle = "";

  try
  {
    var webServiceRequestObj = MEDHOSTinstantiateWebServiceRequestObject();

    // retrieve the web service request status
    if (webServiceRequestObj == null)
    {
      requestStatus = 400;
    }
    else
    {
      requestStatus = webServiceRequestObj.status;
    }

    // retrieve the web service method return value
    if (requestStatus == 200)
    {
      // soap:Envelope
      var currentNode = webServiceRequestObj.responseXML.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != "soap:Envelope"))
      {
        currentNode = currentNode.nextSibling;
      }

      // soap:Body
      currentNode = currentNode.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != "soap:Body"))
      {
        currentNode = currentNode.nextSibling;
      }

      // methodnameResponse
      currentNode = currentNode.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != (webServiceMethodName + "Response")))
      {
        currentNode = currentNode.nextSibling;
      }

      // methodnameResult
      currentNode = currentNode.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != (webServiceMethodName + "Result")))
      {
        currentNode = currentNode.nextSibling;
      }

      refreshIntervalMinutes = MEDHOSTgetWebServiceMultipleResultValue(currentNode, 0, refreshIntervalMinutes);
      labelText = MEDHOSTgetWebServiceMultipleResultValue(currentNode, 1, labelText);
      labelPosition = MEDHOSTgetWebServiceMultipleResultValue(currentNode, 2, labelPosition);
      containerStyle = MEDHOSTgetWebServiceMultipleResultValue(currentNode, 3, containerStyle);
      labelStyle = MEDHOSTgetWebServiceMultipleResultValue(currentNode, 4, labelStyle);
      valueStyle = MEDHOSTgetWebServiceMultipleResultValue(currentNode, 5, valueStyle);

      // check for invalid data
      if (refreshIntervalMinutes < 0)
      {
        requestStatus = 0;
      }
    }
  }
  catch (e)
  {
    //window.status = e.toString();
    requestStatus = 0;
  }

  if (clientCallback != null)
  {
    clientCallback(requestStatus, refreshIntervalMinutes, labelText, labelPosition, containerStyle, labelStyle, valueStyle);
  }
}

// MEDHOST WebService Request method
// MEDHOSTgetAverageEDWaitTimeMinutesAsync
// Starts an asynchronous web service method to get the average ED wait time.
// A client callback function receives the web service request status and the method return value.
//  sample:
//    MEDHOSTgetAverageEDWaitTimeMinutesAsync(MEDHOSTDataWidgetUrlBase, getAverageEDWaitTimeMinutesCallback)
//
//  input:
//    String baseWebServiceUrl - The base url for the web service. For example, "http://localhost".
//    function clientCallback - A function to be called upon completion of the web service method.
//      The function should have the format: void functionName(Number requestStatus, Number averageEDWaitTimeMinutes).
//  return:
//    none
function MEDHOSTgetAverageEDWaitTimeMinutesAsync(baseWebServiceUrl, clientCallback)
{
  var webServicePath = MEDHOSTDataWidgetEdisKpiWebServicePath;
  var webServiceNamespace = MEDHOSTDataWidgetWebServiceNamespace;
  var webServiceMethodName = MEDHOSTGetAverageEDWaitTimeMinutesWebServiceMethodName;

  var webServiceRequestObj = MEDHOSTinstantiateWebServiceRequestObject();

  if (webServiceRequestObj == null)
  {
    MEDHOSTgetAverageEDWaitTimeMinutesCompleted(clientCallback);
    return;
  }

  if ((baseWebServiceUrl.length > 0) && (baseWebServiceUrl.substr(baseWebServiceUrl.length - 1) != '/'))
  {
    baseWebServiceUrl += '/';
  }
  var fullWebServiceUrl = baseWebServiceUrl + webServicePath;

  if (false)
  {
    // force a client-side refresh of the web service call by including an extraneous unique query parameter
    fullWebServiceUrl = fullWebServiceUrl + "?timestamp=" + MEDHOSTformatDateUniversalSortable(new Date());
  }

  var isAsynchronous = true;
  webServiceRequestObj.open("POST", fullWebServiceUrl, isAsynchronous);
  webServiceRequestObj.onreadystatechange = function()
  {
    if (webServiceRequestObj.readyState == 4)
    {
      MEDHOSTgetAverageEDWaitTimeMinutesCompleted(clientCallback);
    }
  };
  webServiceRequestObj.setRequestHeader("Content-Type", "text/xml");
  webServiceRequestObj.setRequestHeader("SOAPAction", webServiceNamespace + webServiceMethodName);

  var requestBody =
    "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>" +
      "<soap:Body>" +
        "<" + webServiceMethodName + " xmlns='" + webServiceNamespace + "'>" +
        "</" + webServiceMethodName + ">" +
      "</soap:Body>" +
    "</soap:Envelope>";
  webServiceRequestObj.send(requestBody);
}

// MEDHOST WebService Request method callback (internal)
// MEDHOSTgetAverageEDWaitTimeMinutesCompleted
// Handles notification of completion of the get average ED wait time web service method
// to notify the client of the return value and web service request status.
//  sample:
//    none
//
//  input:
//    function clientCallback - A function to be called upon completion of the web service method.
//  return:
//    none
function MEDHOSTgetAverageEDWaitTimeMinutesCompleted(clientCallback)
{
  var webServicePath = MEDHOSTDataWidgetEdisKpiWebServicePath;
  var webServiceNamespace = MEDHOSTDataWidgetWebServiceNamespace;
  var webServiceMethodName = MEDHOSTGetAverageEDWaitTimeMinutesWebServiceMethodName;

  var requestStatus = 0;
  var averageEDWaitTimeMinutes = -1;

  try
  {
    var webServiceRequestObj = MEDHOSTinstantiateWebServiceRequestObject();

    // retrieve the web service request status
    if (webServiceRequestObj == null)
    {
      requestStatus = 400;
    }
    else
    {
      requestStatus = webServiceRequestObj.status;
    }

    // retrieve the web service method return value
    if (requestStatus == 200)
    {
      // soap:Envelope
      var currentNode = webServiceRequestObj.responseXML.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != "soap:Envelope"))
      {
        currentNode = currentNode.nextSibling;
      }

      // soap:Body
      currentNode = currentNode.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != "soap:Body"))
      {
        currentNode = currentNode.nextSibling;
      }

      // methodnameResponse
      currentNode = currentNode.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != (webServiceMethodName + "Response")))
      {
        currentNode = currentNode.nextSibling;
      }

      // methodnameResult
      currentNode = currentNode.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != (webServiceMethodName + "Result")))
      {
        currentNode = currentNode.nextSibling;
      }

      averageEDWaitTimeMinutes = MEDHOSTgetWebServiceSingleResultValue(currentNode, averageEDWaitTimeMinutes);

      // check for invalid data
      if (averageEDWaitTimeMinutes < 0)
      {
        requestStatus = 0;
      }
    }
  }
  catch (e)
  {
    //window.status = e.toString();
    requestStatus = 0;
  }

  if (clientCallback != null)
  {
    clientCallback(requestStatus, averageEDWaitTimeMinutes);
  }
}

// MEDHOST WebService Request method
// MEDHOSTgetAverageEDWaitTimeFormattedAsync
// Starts an asynchronous web service method to get the average ED wait time.
// A client callback function receives the web service request status and the method return value.
//  sample:
//    MEDHOSTgetAverageEDWaitTimeFormattedAsync(MEDHOSTDataWidgetUrlBase, getAverageEDWaitTimeFormattedCallback)
//
//  input:
//    String baseWebServiceUrl - The base url for the web service. For example, "http://localhost".
//    function clientCallback - A function to be called upon completion of the web service method.
//      The function should have the format: void functionName(Number requestStatus, Number averageEDWaitTimeMinutes, String averageEDWaitTimeFormatted, String lastComputedTimestamp).
//  return:
//    none
function MEDHOSTgetAverageEDWaitTimeFormattedAsync(baseWebServiceUrl, clientCallback)
{
  var webServicePath = MEDHOSTDataWidgetEdisKpiWebServicePath;
  var webServiceNamespace = MEDHOSTDataWidgetWebServiceNamespace;
  var webServiceMethodName = MEDHOSTGetAverageEDWaitTimeFormattedWebServiceMethodName;

  var webServiceRequestObj = MEDHOSTinstantiateWebServiceRequestObject();

  if (webServiceRequestObj == null)
  {
    MEDHOSTgetAverageEDWaitTimeFormattedCompleted(clientCallback);
    return;
  }

  if ((baseWebServiceUrl.length > 0) && (baseWebServiceUrl.substr(baseWebServiceUrl.length - 1) != '/'))
  {
    baseWebServiceUrl += '/';
  }
  var fullWebServiceUrl = baseWebServiceUrl + webServicePath;

  if (false)
  {
    // force a client-side refresh of the web service call by including an extraneous unique query parameter
    fullWebServiceUrl = fullWebServiceUrl + "?timestamp=" + MEDHOSTformatDateUniversalSortable(new Date());
  }

  var isAsynchronous = true;
  webServiceRequestObj.open("POST", fullWebServiceUrl, isAsynchronous);
  webServiceRequestObj.onreadystatechange = function()
  {
    if (webServiceRequestObj.readyState == 4)
    {
      MEDHOSTgetAverageEDWaitTimeFormattedCompleted(clientCallback);
    }
  };
  webServiceRequestObj.setRequestHeader("Content-Type", "text/xml");
  webServiceRequestObj.setRequestHeader("SOAPAction", webServiceNamespace + webServiceMethodName);

  var requestBody =
    "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>" +
      "<soap:Body>" +
        "<" + webServiceMethodName + " xmlns='" + webServiceNamespace + "'>" +
        "</" + webServiceMethodName + ">" +
      "</soap:Body>" +
    "</soap:Envelope>";
  webServiceRequestObj.send(requestBody);
}

// MEDHOST WebService Request method callback (internal)
// MEDHOSTgetAverageEDWaitTimeFormattedCompleted
// Handles notification of completion of the get average ED wait time web service method
// to notify the client of the return value and web service request status.
//  sample:
//    none
//
//  input:
//    function clientCallback - A function to be called upon completion of the web service method.
//  return:
//    none
function MEDHOSTgetAverageEDWaitTimeFormattedCompleted(clientCallback)
{
  var webServicePath = MEDHOSTDataWidgetEdisKpiWebServicePath;
  var webServiceNamespace = MEDHOSTDataWidgetWebServiceNamespace;
  var webServiceMethodName = MEDHOSTGetAverageEDWaitTimeFormattedWebServiceMethodName;

  var requestStatus = 0;
  var averageEDWaitTimeMinutes = -1;
  var averageEDWaitTimeFormatted = "";
  var lastComputedTimestamp = "";

  try
  {
    var webServiceRequestObj = MEDHOSTinstantiateWebServiceRequestObject();

    // retrieve the web service request status
    if (webServiceRequestObj == null)
    {
      requestStatus = 400;
    }
    else
    {
      requestStatus = webServiceRequestObj.status;
    }

    // retrieve the web service method return value
    if (requestStatus == 200)
    {
      // soap:Envelope
      var currentNode = webServiceRequestObj.responseXML.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != "soap:Envelope"))
      {
        currentNode = currentNode.nextSibling;
      }

      // soap:Body
      currentNode = currentNode.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != "soap:Body"))
      {
        currentNode = currentNode.nextSibling;
      }

      // methodnameResponse
      currentNode = currentNode.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != (webServiceMethodName + "Response")))
      {
        currentNode = currentNode.nextSibling;
      }

      // methodnameResult
      currentNode = currentNode.firstChild;
      while ((currentNode != null) && (currentNode.nodeName != (webServiceMethodName + "Result")))
      {
        currentNode = currentNode.nextSibling;
      }

      averageEDWaitTimeMinutes = MEDHOSTgetWebServiceMultipleResultValue(currentNode, 0, averageEDWaitTimeMinutes);
      averageEDWaitTimeFormatted = MEDHOSTgetWebServiceMultipleResultValue(currentNode, 1, averageEDWaitTimeFormatted);
      lastComputedTimestamp = MEDHOSTgetWebServiceMultipleResultValue(currentNode, 2, lastComputedTimestamp);
    }

    if (lastComputedTimestamp != "")
    {
      // fixup timestamp string to be Date compatible
      // replace date separator of minus character with foward slash character
      var regularExpressionDateFixup = /\-/g;
      lastComputedTimestamp = lastComputedTimestamp.replace(regularExpressionDateFixup, "/");
    }

    // check for invalid data
    if (averageEDWaitTimeMinutes < 0)
    {
      requestStatus = 0;
    }
  }
  catch (e)
  {
    //window.status = e.toString();
    requestStatus = 0;
  }

  if (clientCallback != null)
  {
    clientCallback(requestStatus, averageEDWaitTimeMinutes, averageEDWaitTimeFormatted, lastComputedTimestamp);
  }
}

