///////////////////////////////////////////////////////////
// Global Code and Variables:
///////////////////////////////////////////////////////////

var iWaitBetweenKeystrokesInMilliseconds = 1000;
var iMinimumContentLengthBeforeSendingRequest = 2;
var isModalDialogBoxVisible = false;
var dtLastKeyPress = new Date();
var aCarriers = new Array();

var IsIE = true;

if(navigator.appName.indexOf("Explorer") < 0)
  IsIE = false;

var request;

if(window.XMLHttpRequest)
{
  //netscape.security.PrivilegeManager.enablePrivilege("UniversalPreferencesRead");
  request = new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
  try{request = new ActiveXObject("Msxml2.XMLHTTP");}
  catch(othermicrosoft){request = new ActiveXObject("Microsoft.XMLHTTP");}
}

///////////////////////////////////////////////////////////
// Functions:
///////////////////////////////////////////////////////////

function DelayUntilUserStoppedTyping(sControlId, sUrl, sContent, sFunctionName)
{
  var sControlText = document.getElementById(sControlId).value;
  
  dtLastKeyPress = new Date();
  if(sControlText != null && sControlText.length >= iMinimumContentLengthBeforeSendingRequest)
  {
    setTimeout("DelayUntilUserStoppedTypingCheck('" + sControlId + "', " + iWaitBetweenKeystrokesInMilliseconds + ", '" + sUrl + "', '" + sContent + "', " + sFunctionName + ")", iWaitBetweenKeystrokesInMilliseconds + 10);
  }
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function DelayUntilUserStoppedTypingCheck(sControlId, iMilliseconds, sUrl, sContent, fUpdateFunction)
{
  if((new Date()).getTime() - dtLastKeyPress.getTime() >= iMilliseconds )
  {
    var sControlText = document.getElementById(sControlId).value;
    
    if(sControlText != null && sControlText.length > 1)
    {
      request.open("POST", sUrl, true);
      request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      request.onreadystatechange = fUpdateFunction;
      request.send(sContent);
    }
  }
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function RequestIsComplete()
{
  try
  {
    if(request && request.readyState == 4 && request.status == 200)
      return true;
    else
      return false;
  }
  catch(wtf)
  {
    return false;
  }
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function WriteDebugLine(sString)
{
  document.getElementById("DebugOutput").innerHTML += sString + "<br>";
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function AddOptionToListBox(lb, sName, sValue)
{
  lb.options[lb.options.length] = new Option(sName, sValue);
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function ClearListBox(lb)
{
  for(var i=lb.options.length - 1; i>=0; --i)
    lb.options[i] = null;
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function GetCarId()
{
  return document.getElementById("CarrierDropDownList").value;
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function GetDbNameFromCarId(iCarId)
{
  for(var i=0; i<aCarriers.length; ++i)
  {
    if(aCarriers[i].CarId == iCarId)
      return aCarriers[i].DbName;
  }
  
  GetSynchronousResponse("/AuthVerificationService/Service1.asmx/GetCarrierDetails", "CarId=" + iCarId);
  if(!request.responseXML)
    throw new Exception("InformaDataService/Service1.asmx/GetCarrierDetails FAILED for CarID " + iCarId);
  
  var newCarrier = new Object();
  newCarrier.CarrierName = request.responseXML.documentElement.getElementsByTagName('CarrierName')[0].firstChild.data;
  newCarrier.CarId = iCarId;
  newCarrier.DbName = request.responseXML.documentElement.getElementsByTagName('DbName')[0].firstChild.data;
  aCarriers[aCarriers.length] = newCarrier;
  
  return newCarrier.DbName;
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function GetDbName()
{
  return GetDbNameFromCarId(GetCarId());
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function GetSynchronousResponse(sUrl, sPostData)
{
  request.open("POST", sUrl, false);
  request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  request.send(sPostData);
  return request.responseText;
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function GetAsynchResponse(sUrl, sPostData, fUpdateFunction)
{
  request.open("POST", sUrl, false);
  request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  if(fUpdateFunction != null)
    request.onreadystatechange = fUpdateFunction;
  request.send(sPostData);
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function GetDigitStringFromString(sFullString)
{
  var sDigitString = "";
  for(var i=0; i<sFullString.length; ++i)
  {
    switch(sFullString.charAt(i))
    {
      case '0': case '1': case '2': case '3': case '4':
      case '5': case '6': case '7': case '8': case '9':
        sDigitString += sFullString.charAt(i);
    } 
  }
  
  return sDigitString;
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function GetElementPosition(oElement)
{
  var iTotalLeft = 0;
  var iTotalTop = 0;
  var oCurrent = oElement;
  while(oCurrent)
  {
    iTotalLeft += oCurrent.offsetLeft;
    iTotalTop += oCurrent.offsetTop;
    oCurrent = oCurrent.offsetParent;
  }

  return [iTotalLeft, iTotalTop];
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function ClearModalDialog()
{
  document.body.removeChild(document.getElementById("ModalDialog"));
  isModalDialogBoxVisible = false;
  EnableButtons(true);
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function EnableButtons(bEnable)
{
  for(var iControlIndex=0; iControlIndex < document.form1.elements.length; ++iControlIndex)
  {
    if(bEnable)
      document.form1.elements[iControlIndex].disabled = false;
    else
      document.form1.elements[iControlIndex].disabled = true;
  }
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function ShowModalDialog(sDisplayText, arrayResponses, eElement, sReturnFunction)
{  
  var eModalDialog = document.getElementById("ModalDialog");
  if(eModalDialog == null)
  {
    eModalDialog = document.createElement("div");
    eModalDialog.id = "ModalDialog";
    eModalDialog.className = "ModalDialog";
  }
  
  var aElementPosition = GetElementPosition(eElement);
  var iTop = aElementPosition[1];
  var iLeft = aElementPosition[0];
  
  var sWidth = "";
  if(window.getComputedStyle)
  {
    sWidth = window.getComputedStyle(eElement, null).width;
  }
  else if(eElement.currentStyle)
  {
    sWidth = eElement.currentStyle.width;
  }

  if(sWidth == "auto")
    sWidth = "50px";
    
  iLeft += parseInt(sWidth);
  
  eModalDialog.style.top = iTop + "px";
  eModalDialog.style.left = (iLeft + 80) + "px";

  var eImageDiv = document.createElement("div");
  eImageDiv.style.top = "-15px";
  if(IsIE)
    eImageDiv.style.left = "-71px";
  else
    eImageDiv.style.left = "-67px";
  eImageDiv.className = "ModalDialogImage";
  
  var eImage = document.createElement("img");
  eImage.src = "Images/triangle.gif";
  eImageDiv.appendChild(eImage);
  
  eModalDialog.appendChild(eImageDiv);

  var eDisplayText = document.createElement("div");
  eDisplayText.innerHTML = sDisplayText + "<br/><br/>";
  eModalDialog.appendChild(eDisplayText);
  
  var sControlId;
  
  for(var i=0; i<arrayResponses.length; ++i)
  {
    if(i==0)
      sControlId = "defaultControl";
    else
      sControlId = "dialogBoxControl" + i;

    var eButton = document.createElement("input");
    eButton.setAttribute("type", "button");
    eButton.setAttribute("id", sControlId);
    eButton.setAttribute("value", arrayResponses[i].responseText);

    // IE6's JS/DOM model is messed up and won't load the onclick function correctly
    // so we have to hack it up a bit
    if(IsIE)
      eButton["onclick"] = new Function(sReturnFunction + "(" + arrayResponses[i].responseId + ");");
    else
      eButton.setAttribute("onclick", sReturnFunction + "(" + arrayResponses[i].responseId + ")");

    eModalDialog.appendChild(eButton);
  }
  document.body.appendChild(eModalDialog);
  document.form1.debug.value = eModalDialog.innerHTML;
  isModalDialogBoxVisible = true;
  EnableButtons(false);
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function getkeycode(evt)
{
  if(evt.which)
    return evt.which;

  if(window.event)
  {
    var keysrc = window.event.srcElement.type;
    if(keysrc == "text" || keysrc == "textarea")
      return window.event.keyCode;
    if(keysrc == "button")
      return window.event.button;
  }

  return 0;
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function GetDataFromResponseXml(sTagName)
{
  if(!request || !request.responseXML || !request.responseXML.documentElement)
    return null;
  var aElements = new Array();
  aElements = request.responseXML.documentElement.getElementsByTagName(sTagName);
  if(aElements == null || aElements.length < 1)
    return null;
  if(!aElements[0].firstChild)
    return null;
  return aElements[0].firstChild.data
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function FillNameIdListBox(lbListBox, aeNameIdElementArray)
{
  for(var i = 0; i < aeNameIdElementArray.length; ++i)
  {
    var sName = aeNameIdElementArray[i].getElementsByTagName("Name")[0].firstChild.nodeValue;
    var sId =  aeNameIdElementArray[i].getElementsByTagName("Id")[0].firstChild.nodeValue
    AddOptionToListBox(lbListBox, sName, sId);
  }
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function FillListBoxWithCarrierNames(lbListBox)
{
  GetSynchronousResponse("/RadMDPublicServices/Service.asmx/GetCurrentHealthCarriers", "");
  if(!request.responseXML)
    throw "/RadMDPublicServices/Service.asmx/GetCurrentHealthCarriers FAILED";

  var oAllCarriers  = request.responseXML.documentElement.getElementsByTagName("NameId");
  ClearListBox(lbListBox);
  AddOptionToListBox(lbListBox, "[Choose the carrier]", "0");
  FillNameIdListBox(lbListBox, oAllCarriers);
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function FillListBoxWithExamCategories(lbListBox)
{
  GetSynchronousResponse("/RadMDPublicServices/Service.asmx/GetExamCategories", "");
  if(!request.responseXML)
    throw "/RadMDPublicServices/Service.asmx/GetExamCategories FAILED";
  
  var oAllCategories = request.responseXML.documentElement.getElementsByTagName("NameId");
  ClearListBox(lbListBox);
  AddOptionToListBox(lbListBox, "[Choose the exam category]", "-1");
  AddOptionToListBox(lbListBox, "[All]", "0");
  FillNameIdListBox(lbListBox, oAllCategories);
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function FillListBoxWithExams(lbListBox, iCarId, iExamCategoryId)
{
  GetSynchronousResponse("/RadMDPublicServices/Service.asmx/GetExams", "iCarId=" + iCarId + "&iExamCategoryId=" + iExamCategoryId);
  if(!request.responseXML)
    throw "/RadMDPublicServices/Service.asmx/GetExams FAILED";
  
  var oAllExams =  request.responseXML.documentElement.getElementsByTagName("ClinicalGuidelineFile");
  ClearListBox(lbListBox);
  AddOptionToListBox(lbListBox, "[Choose exam]", "0");
  for(var i = 0; i < oAllExams.length; ++i)
  {
    var sExamName = oAllExams[i].getElementsByTagName("ExamName")[0].firstChild.nodeValue;
    var sFileName = oAllExams[i].getElementsByTagName("UrlFileName")[0].firstChild.nodeValue;
    AddOptionToListBox(lbListBox, sExamName, sFileName);
  }
}

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////

function SubmitSupportRequest(sEmail, sPhone, sText)
{
  GetSynchronousResponse("/RadMDPublicServices/Service.asmx/SupportRequest", "sEmailAddress=" + sEmail + "&sPhoneNumber=" + sPhone + "&sBody=" + sText);
  if(!request.responseXML)
    throw "Online Support Request is not available";
}