//-----------------------
// GeneralLib.js
//-----------------------

//--------------------------------
// Error identifiers. Treat these
// as contansts, never modify.
//--------------------------------
var errNone = 0;
var errBadValue = 1;
var errBadFormat = 2;
var errBeforeRange = 3;
var errAfterRange = 4;
//--------------------------------
var StandardDelimiter = '~||~'


function ReverseField(AObject)
{
  //Draw attention to an object by reversing it's normal colors
  var clrText;
  var clrBack;
  
  with (AObject)
  {
    if (style.color == '')
      clrText = 'black'
    else
      clrText = style.color;
      
    if (style.backgroundColor == '')
      clrBack = 'white'
    else
      clrBack = style.backgroundColor;
      
    style.color = clrBack;
    style.backgroundColor = clrText;

  }

}       //ReverseField()


function IsProduction()
{
  return ((IsHealthNet() || IsSaintFrancisDotCom()) && ! IsDev() && ! IsLocalHost());
  
}		//IsProduction()


function IsDev()
{
	return (location.href.toUpperCase().indexOf('DEV.') > -1);
}


function IsLocalHost()
{
  return (location.href.toUpperCase().indexOf('/LOCALHOST/') > -1);
}


function IsHealthNet()
{
  return ((location.href.toUpperCase().indexOf('HEALTHNET') > -1) ||
          (location.href.toUpperCase().indexOf('10.107.9.88') > -1));
}


function IsSaintFrancisDotCom()
{
  return location.href.toUpperCase().indexOf('SAINTFRANCIS.COM') > -1;
}


function ShowIf(AObject, ATrueFalse)
{
  if (ATrueFalse)
    AObject.style.display = '';
  else
    Hide(AObject);
} 


function InlineIf(AObject, ATrueFalse)
{

  if (ATrueFalse)
    AObject.style.display = 'inline';
  else
    Hide(AObject);

}       //InlineIf()


function FocusIf(AObject, ATrueFalse)
{
  var tr;
  
  if (ATrueFalse)
    with (AObject)
    {
      focus();
      if (AObject.type && Pos('text', type) > -1)
        SetCaretAtEnd(AObject);
    }

}         //FocusIf()


function EnableIf(AObject, ATrueFalse)
{

  AObject.disabled = ! ATrueFalse;

}         //EnableIf()


function DisableIf(AObject, ATrueFalse)
{

  AObject.disabled = ATrueFalse;

}


function ColorIf(AObject, ATrueFalse, ABackgroundColor, AOptionalAlternateColor)
{

  with (AObject.style)
    if (ATrueFalse)
      backgroundColor = ABackgroundColor
    else
      if (AOptionalAlternateColor)
        backgroundColor = AOptionalAlternateColor
      else
        backgroundColor = '';

}         //ColorIf()


function RedTextIf(AObject, ATrueFalse, AOptionalAlternateColor)
{

  with (AObject.style)
    if (ATrueFalse)
      color = 'red'
    else
      if (AOptionalAlternateColor)
        color = AOptionalAlternateColor
      else
        color = '';

}         //RedTextIf()


function BlueTextIf(AObject, ATrueFalse, AOptionalAlternateColor)
{

  with (AObject.style)
    if (ATrueFalse)
      color = 'blue'
    else
      if (AOptionalAlternateColor)
        color = AOptionalAlternateColor
      else
        color = '';

}         //BlueTextIf()


function Show(AObject)
{

  AObject.style.display = '';
  
}     //Show()


function Inline(AObject)
{

  AObject.style.display = 'inline';
  
}     //Inline()


function Hide(AObject)
{

  AObject.style.display = 'none';
 
}     //Hide()


function IsBetween(AValue, AStart, AEnd)
{

	return (AValue >= AStart) && (AValue <= AEnd);
	
}


function GetRandomInteger10()
{
	var sResult;
	
	sResult = 10;
	while (sResult > 9)
		with (Math)
			sResult = round(random() * 10);
			
	return sResult;
}


function GetRandomInteger100()
{
	return GetRandomInteger10() + (GetRandomInteger10() * 10);
}


function FindLeaderMatchesBinary(ALeaderString, ASortedArray)
{
  //----- Returns an array of Indexes for ASortedArray ---------
  var iIndex;
  var iLength;
  var iInputLength = ASortedArray.length;
  var Result = new Array;
  
  
  function GetFirstIndex(ALeaderString, ASortedArray)
  {
    var iFirstIndex = 0;
    var iLastIndex = ASortedArray.length - 1;
    var iMiddle;
    var iLeaderLength = ALeaderString.length;
    var sName;
  
  
    function FindFirstIndexMinusOne()
    {
    
      while (ALeaderString == sName)
        if (--iMiddle == -1)
          return
        else
        {
          sName = ASortedArray[iMiddle];
          if (sName > '')
            sName = sName.substr(0, iLeaderLength).toLowerCase();
        }
        
    }         //FindFirstIndexMinusOne()
    
    while (true)
    {
      iMiddle = iFirstIndex + Math.round((iLastIndex - iFirstIndex) / 2);
    
      if (iMiddle > iLastIndex)
        return -1;
        
      sName = ASortedArray[iMiddle];
      if (sName > '')
        sName = sName.substr(0, iLeaderLength).toLowerCase();
        
      if (ALeaderString == sName)
      {
        FindFirstIndexMinusOne();
        return ++iMiddle;
      }
      else
      {
        if (iFirstIndex >= iLastIndex)
          return -1;
          
        if (ALeaderString > sName)
          iFirstIndex = iMiddle + 1
        else
          iLastIndex = iMiddle - 1;
      }
    }

  }           //GetFirstIndex()
  
  
  ALeaderString = ALeaderString.toLowerCase();
  
  if (ALeaderString == '')
    return Result
  else
  {
    iIndex = GetFirstIndex(ALeaderString, ASortedArray);
    if (iIndex == -1)
      return Result
    else
    {
      iLength = ALeaderString.length;
      while (ALeaderString == ASortedArray[iIndex].substr(0, iLength).toLowerCase())
      {
        Result.push(iIndex);
        if (++iIndex >= iInputLength)
          break;
      }
    }
  }
  
  return Result;

}         //FindLeaderMatchesBinary()


function FindLeaderMatchesBinary2D(ALeaderString, ASortedArray, ASortIndex)
{
  //----- Returns an array of Indexes into ASortedArray ---------
  // ASortIndex is the index to search in the nested array
  var iIndex;
  var iLength;
  var iInputLength = ASortedArray.length;
  var Result = new Array;
  
  
  function GetFirstIndex(ALeaderString, ASortedArray)
  {
    var iFirstIndex = 0;
    var iLastIndex = ASortedArray.length - 1;
    var iMiddle;
    var iLeaderLength = ALeaderString.length;
    var sName;
  
  
    function FindFirstIndexMinusOne()
    {
    
      while (ALeaderString == sName)
        if (--iMiddle == -1)
          return
        else
        {
          sName = ASortedArray[iMiddle][ASortIndex];
          if (sName > '')
            sName = sName.substr(0, iLeaderLength).toLowerCase();
        }
        
    }         //FindFirstIndexMinusOne()
    
    while (true)
    {
      iMiddle = iFirstIndex + Math.round((iLastIndex - iFirstIndex) / 2);
    
      if (iMiddle > iLastIndex)
        return -1;
        
      sName = ASortedArray[iMiddle][ASortIndex];
      if (sName > '')
        sName = sName.substr(0, iLeaderLength).toLowerCase();
        
      if (ALeaderString == sName)
      {
        FindFirstIndexMinusOne();
        return ++iMiddle;
      }
      else
      {
        if (iFirstIndex >= iLastIndex)
          return -1;
          
        if (ALeaderString > sName)
          iFirstIndex = iMiddle + 1
        else
          iLastIndex = iMiddle - 1;
      }
    }

  }           //GetFirstIndex()
  
  
  ALeaderString = ALeaderString.toLowerCase();
  
  if (ALeaderString == '')
    return Result
  else
  {
    iIndex = GetFirstIndex(ALeaderString, ASortedArray);
    if (iIndex == -1)
      return Result
    else
    {
      iLength = ALeaderString.length;
      while (ALeaderString == ASortedArray[iIndex][ASortIndex].substr(0, iLength).toLowerCase())
      {
        Result.push(iIndex);
        if (++iIndex >= iInputLength)
          break;
      }
    }
  }
  
  return Result;

}         //FindLeaderMatchesBinary2D()


function FindSubstringMatches(ASubstring, AArray)
{
  //returns array of indexes for AArray
  var i;
  var sVal = TrimSpaces(ASubstring.toLowerCase());
  var Result = new Array;
  
  for (i = 0; i < AArray.length; i++)
    if (AArray[i].toLowerCase().indexOf(sVal) > -1)
      Result[Result.length] = i;
   
  return Result;
  
}           //FindSubstringMatches
 

function IsItemInArray(AStringItem, AArray)
{
  var i;

  for (i=0; i < AArray.length; i++)
    if (AStringItem.toLowerCase() == AArray[i].toString().toLowerCase())
      return true;
      
  return false;

}       //IsItemInArray()


function GetMissingItems(ASourceArray, AArrayIsMissingItems)
//--------------------------------------------------------
// returns an array of items in ASourceArray
//  which are missing from AArrayIsMissingItems
//--------------------------------------------------------
{
  var ar = new Array;
  var i;
  
  for (i=0; i < ASourceArray.length; i++)
    if (! IsItemInArray(ASourceArray[i].toString(), AArrayIsMissingItems))
    {
      ar.length++;
      ar[ar.length - 1] = ASourceArray[i];
    }

  return ar;

}         //GetMissingItems()


function ArrayToString(AArray, ADelimiter)
{
	var i; 
	var sResult = '';
	
	for (i = 0; i < AArray.length - 1; i++)
		if (AArray[i] > '')
			sResult = sResult + AArray[i] + ADelimiter;
		
	if (AArray.length > 0)
		sResult = sResult + AArray[AArray.length - 1];
		
  return sResult;
		
}				//ArrayToString()


function ShowArray(AArray, ALabel)
{
  var sDelimiter = CrLf();
  var sLabel = ':' + CrLfx(2);
  var ar = new Array;
  var i;
  
  if (! ALabel)
    ALabel = '';
    
  if (ALabel > '')
    sLabel = ALabel + sLabel
  else
    sLabel = 'Array' + sLabel;
    
  ar.length = AArray.length;
  for (i=0; i < ar.length; i++)
    ar[i] = ' ' + i + ' > ' + AArray[i];
  
  alert(sLabel + ArrayToString(ar, sDelimiter));
  return;
  
  
}     //ShowArray()


function ArrayToDelimitedString(AArray, ADelimiter)
{
  var i;
  var Result = '';
  
  if (AArray.length > 0)
  {
    for (i=0; i < AArray.length - 1; i++)
      Result = Result + AArray[i].toString() + ADelimiter;
      
    Result = Result + AArray[AArray.length - 1].toString();
  }
  
  return Result;

}       //ArrayToDelimitedString()


function DelimitedStringToArray(AString, ADelimiter)
{
  var Result = new Array;
  var iPos;
  var s = AString;
  
  iPos = Pos(ADelimiter, s);
  while (iPos > -1)
  {
    Result[Result.length] = s.substr(0, iPos);
    s = s.substr(iPos + ADelimiter.length);
    iPos = Pos(ADelimiter, s);
  }  
  
  if (s > '')
    Result[Result.length] = s;
  
  return Result;
}


function IsInteger(AString)
{
  if (Number(AString) == NaN)
    return false
  else
    return Number(AString) == GetInteger(AString);
    
}       //IsInteger() 


function GetInteger(ANumber)
{
  var sResult = '';
  var i;
  var sNumber = ANumber.toString();
  
  for (i=0; i < sNumber.length; i++)
    if (sNumber.charAt(i) == '.')
      break
    else
    if ((sNumber.charAt(i) >= '0') && (sNumber.charAt(i) <= '9'))
      sResult = sResult + sNumber.charAt(i);

  return Number(sResult);
  
}       //GetInteger()  
  

function GetFraction(ANumber)
{
  var sResult = '';
  var i;
  var iStart;
  var sNumber = ANumber.toString();

  iStart = sNumber.indexOf('.');
  
  if (iStart == -1 || iStart == ANumber.toString().length - 1)
    return 0;
    
  for (i=iStart; i < sNumber.length; i++)
    if ((sNumber.charAt(i) >= '0') && (sNumber.charAt(i) <= '9'))
      sResult = sResult + sNumber.charAt(i);

  return Number('.' + sResult);
  
}       //GetFraction()  
  

function Round(ANumber, APlaces)
//-- Round to APlaces - 0 means to integer, 1 means to 1 decimal place, etc.
{
  var iInteger = GetInteger(ANumber);
  var iFraction = GetFraction(ANumber);
  
  if (APlaces < 1)
    return iInteger
  else
  {
    iFraction = Math.round(iFraction * (pow(10, APlaces)));
    iFraction = iFraction / pow(10, APlaces);
    return iInteger + iFraction;
  }

}       //Round()


function OnButtonFocus(ALabel)
{

  with (ALabel.style)
  {
    backgroundColor = 'blue';
    color = 'white';
    borderStyle = 'solid';
    borderColor = 'aqua';
    borderWidth = '1px';
  }

}       //OnButtonFocus()


function OnButtonBlur(ALabel)
{

  with (ALabel.style)
  {
    backgroundColor = '';
    color = '';
    borderStyle = '';
  }

}       //OnButtonBlur()


function xxxxxxxxxFormValidator()
{
  //---------------------------------------------------------
  //  The function requires the presence of
  //  the javascript arrays "arFormValidations" and
  //  "arFormValidationConditionals" which are products
  //  of the the server side class ClientFormValidationsArray.
  //---------------------------------------------------------
  var i;
  
  for (i=0; i < arFormValidations.length; i++)
    if (eval(arFormValidationConditionals[i]))
      if (! eval(arFormValidations[i]))
        return false;
      
  return true;

}       //FormValidator()


function GetItemIndexInArray(AStringItem, AArray)
{
  var i;

  AStringItem = AStringItem.toLowerCase();
  for (i=0; i < AArray.length; i++)
    if (AStringItem == AArray[i].toString().toLowerCase())
      return i;
      
  return -1;
}


function Trunc(ANumber)
{

  if (ANumber >= 0)
    return Math.floor(ANumber)
  else
    return Math.ceil(ANumber);
    
}         //Trunc()


function Status(AStatusMessage)
{

  window.status = AStatusMessage;
  
}


function ClearStatus()
{

  window.status = '';
  
}
  

function ToggleBlockDisplay(AObject)
{
  
  with (AObject)
  {
    if (style.display.toLowerCase() == 'block')
      style.display = 'none'
    else
      style.display = 'block';
  }  

}     //ToggleBlockDisplay


function ToggleDisplay(AObject)
{

  if (AObject.style.display == '')
    AObject.style.display = 'none'
  else
    AObject.style.display = '';

}     //ToggleDisplay


//Roggle = Radio Button Toggle
function RoggleDisplay(AObjectArray, AShowIndex)
{
  var i;
  
  for (i=0; i < AObjectArray.length; i++)
    AObjectArray[i].style.display = 'none';
    
  if (AShowIndex > -1)
    AObjectArray[AShowIndex].style.display = '';

}           //RoggleDisplay()


function RoggleColor(AObjectArray, AHighlightColor, AColorIndex, AOptionalNormalColor)
{
  var i;
  var sNormalColor;
  
  if (arguments.length == 3)
    sNormalColor = ''
  else
    sNormalColor = AOptionalNormalColor;
  
  for (i=0; i < AObjectArray.length; i++)
    AObjectArray[i].style.color = sNormalColor;
    
  AObjectArray[AColorIndex].style.color = AHighlightColor;

}           //RoggleColor()


function SpanButtonMouseOver(AButton)
{
  AButton.style.borderColor = 'blue';
  AButton.style.color = 'blue';
}


function SpanButtonMouseOut(AButton)
{
  AButton.style.borderColor = '';
  AButton.style.color = '';
}


function AbsoluteX(AObject)
{
  var x = 0;
  
  while (AObject)
  {
    x += AObject.offsetLeft;
    AObject = AObject.offsetParent;
  }
  return x;
}


function AbsoluteY(AObject)
{
  var y = 0;
  
  while (AObject)
  {
    y += AObject.offsetTop;
    AObject = AObject.offsetParent;
  }
  return y;
}


function DoHorizontalCenter(ATargetObject, AReferenceObject)
{
  var iRefCenter = AbsoluteX(AReferenceObject) + (AReferenceObject.offsetWidth / 2);
  var iTargCenter = AbsoluteX(ATargetObject) + (ATargetObject.offsetWidth / 2);

  ATargetObject.style.position = 'absolute';
  ATargetObject.style.left = iRefCenter - (ATargetObject.offsetWidth / 2);
  
}


function ScrollToObject(AObject, AVerticalAdjustment)
{
  //Scroll AObject to top of viewable area
  if (AVerticalAdjustment)
    window.scrollTo(0,AbsoluteY(AObject) + AVerticalAdjustment);
  else
    window.scrollTo(0,AbsoluteY(AObject));
}


