//begin_lib
<!-- This document created by WebScripter 3.1 copyright© Code Generation® 2000 -->
/* This script file contains all the general methods that generic routines

  CopyRight (C) Micro-Phyla Systems 2002, All Rights Reserved
  Developed by John B. Moore

Code conventions

function prefixes
   cvq - Crimeview functions found in this file
var prefixes:
	 g_  - global to this file
	 s    - string
	 n    - number
	 v   - anytype
	 b   - boolean
	 ar - array
	 the - object
	 arg_ - argument param of that function
	 <none> local to that function
function suffixes:
      _s - returns string
	  _n - returns number
	  _b - returns boolean
	  _r - returns array
	  _v - returns anytype
	  _obj - returns object reference
	  <none> - returns nothing (void)

Dependencies:
     <none>

	  */
//alert("loading utilTools");

// name to handle
var g_WHandles = new Array();
// order to name
var g_WinStack = new Array();
//Dialogs can query this value to determine if they need to keep focus and appear to
// behave like a modal window.
var g_sTopModalWindow = "";

var isNav = false;
var isIE = false;
// for browser reference building..
var col1 = "";
var styleObj = "";
// determine browser
if (parseInt(navigator.appVersion) >=4) {
   if (navigator.appName == "Netscape") {
      isNav = true;
   } else {
      isIE = true;
      col1 = "all.";
      styleObj = ".style"
   }
}

//month and days used by date time routines
var monthNames = new Array();
monthNames[0] = "ERROR";
monthNames[1] = "January";
monthNames[2] = "Febuary";
monthNames[3] = "March";
monthNames[4] = "April";
monthNames[5] = "May";
monthNames[6] = "June";
monthNames[7] = "July";
monthNames[8] = "August";
monthNames[9] = "September";
monthNames[10] = "October";
monthNames[11] = "November";
monthNames[12] = "December";
var daysNames = new Array()
daysNames[0] = "ERROR"
daysNames[1] = "Sunday";
daysNames[2] = "Monday";
daysNames[3] = "Tuesday";
daysNames[4] = "Wednesday";
daysNames[5] = "Thursday";
daysNames[6] = "Friday";
daysNames[7] = "Saturday";



function uValidateFileName(arg_sFileName){
    var _validReg="^[a-zA-Z0-9]+\.[a-zA-Z]{3}$";
    var _regex= new RegExp(_validReg);
    return _regex.test(arg_sFileName);
}

function uCheckFileName(arg_textField){
    var _fileName=arg_textField.value;
    if(!uValidateFileName(_fileName)){
      alert("File name provided is not valid. Please correct.\n"+
      "File names can only contain letters, numbers, underscores\n"+
      "and a single period. All other characters are prohibited.");
      arg_textField.value="";
      arg_textField.focus();
    }
}



/* Takes an array and sorts it alphanumerically and then extracts all
unique values and returns this as an array
    Returns: Array*/
function uSortUnique_r(arg_arSource) {
      arg_arSource.sort();
	  var nCount = arg_arSource.length;
	  var arUnique = new Array();
	  var tempVar;
	  var prevVar = "";
	  var nUniqueCnt = 0;
	  for (var i=0;i<nCount;i++) {
             tempVar = arg_arSource[i];
             if (tempVar == " ") {
                continue;
              } else {
                 if (tempVar != prevVar) {
                    arUnique[nUniqueCnt] = tempVar;
                    prevVar = tempVar;
                    nUniqueCnt = nUniqueCnt + 1
                  }
              }
	  }
     return arUnique;
}



// ==========  Word/Text count code =======================
var g_arWordCnts = new Array();
var g_arWordCntPos = new Array();
var g_undefined;

function uWordCounter(arg_field, arg_countfield,
                      arg_charcountfield, arg_maxlimit, arg_overflowfld) {
  var _wordcounter = 0;
  // set the default word count on first hit.
  if (g_arWordCnts[arg_field] == g_undefined) {
    _wordcounter = 0;
    for (x=0;x<arg_field.value.length;x++) {
       if ( ( (arg_field.value.charAt(x) == " ") &&
             (arg_field.value.charAt(x-1) != " ") ) ||
             ( (arg_field.value.charAt(x) == "\r") ||
               (arg_field.value.charAt(x) == "\n") ) ) {
         if ( (arg_field.value.charAt(x) == " ") &&
              (arg_field.value.charAt(x-1) == " ") &&
              (arg_field.value.charAt(x-2) == " ") ){
            // stop triple spaces
            arg_field.value = arg_field.value.substring(0, x);
          } else {
             _wordcounter++ // Counts the spaces while ignoring double spaces,
             if (_wordcounter > arg_maxlimit) {
               var _sCurrent = arg_field.value.substring(0, arg_maxlimit);
                // prepend overlow to overflow field if available
                if (arg_overflowfld != g_undefined) {
                  arg_overflowfld.value = arg_field.value.substring(250,arg_field.value.length) +
                                        arg_overflowfld.value;
                  // check overflow field
                  if (arg_overflowfld.value.length > 250) {
                     arg_overflowfld.value = arg_overflowfld.value.substring(0, 250)
                  }
                  //move to that field
                  arg_overflowfld.focus();
                }
                arg_field.value = _sCurrent;
                _wordcounter--;
             }
          }
       }
    }
    g_arWordCnts[arg_field] = _wordcounter;
    g_arWordCntPos[arg_field] = arg_field.value.length;
    arg_charcountfield.value = arg_field.value.length;
    arg_countfield.value = arg_maxlimit - _wordcounter;

  } else {
    // limit field to 250 characters maximum
    if (arg_field.value.length > 250) {
      var _sCurrent = arg_field.value.substring(0, 250);
      // prepend overlow to overflow field if available
      if (arg_overflowfld != g_undefined) {
         arg_overflowfld.value = arg_field.value.substring(250,arg_field.value.length) +
                                        arg_overflowfld.value;
         // check overflow field
         if (arg_overflowfld.value.length > 250) {
            arg_overflowfld.value = arg_overflowfld.value.substring(0, 250)
         }
         //move to that field
         arg_overflowfld.focus();
      }
      arg_field.value = _sCurrent;
      arg_charcountfield.value = arg_field.value.length;
      arg_countfield.value = 0;
      return;
    }
    // check for limits of field and any wierd stuff
    // (user can go into middle of text and add text that then
    //  goes beyond the limit)  Check it every 10 characters.
    if ( (arg_field.value.length > 229) &&
         (arg_field.value.length % 10 == 0) ) {
       // approaching limit of field. Recalc total words every 10 characters
       _wordcounter = 0;
       for (x=0;x<arg_field.value.length;x++) {
          if ( ( (arg_field.value.charAt(x) == " ") &&
             (arg_field.value.charAt(x-1) != " ") ) ||
             ( (arg_field.value.charAt(x) == "\r") ||
               (arg_field.value.charAt(x) == "\n") ) ) {
             if ( (arg_field.value.charAt(x) == " ") &&
                  (arg_field.value.charAt(x-1) == " ") &&
                  (arg_field.value.charAt(x-2) == " ") ){
               // stop triple spaces
               arg_field.value = arg_field.value.substring(0, x);
             } else {
               _wordcounter++ // Counts the spaces while ignoring double spaces,
               if (_wordcounter > arg_maxlimit) {
                  arg_field.value = arg_field.value.substring(0, x);
                  _wordcounter--;
               }
             }
          }
       }
       g_arWordCnts[arg_field] = _wordcounter;
       g_arWordCntPos[arg_field] = arg_field.value.length;
       arg_charcountfield.value = arg_field.value.length;
       arg_countfield.value = arg_maxlimit - _wordcounter;
       return;
    }

    // if length has not changed..
    if (arg_field.value.length == g_arWordCntPos[arg_field]) {
      return;
    }
    // begin regular processing
    _wordcounter = g_arWordCnts[arg_field];
    var _wordstart = g_arWordCntPos[arg_field];
    if (arg_field.value.length < g_arWordCntPos[arg_field]) {
      // user backspaced so reset and count from beginning
      _wordcounter = 0
      for (x=0;x<arg_field.value.length;x++) {
        if ( ( (arg_field.value.charAt(x) == " ") &&
             (arg_field.value.charAt(x-1) != " ") ) ||
             ( (arg_field.value.charAt(x) == "\r") ||
               (arg_field.value.charAt(x) == "\n") ) ) {
          if ( (arg_field.value.charAt(x) == " ") &&
              (arg_field.value.charAt(x-1) == " ") &&
              (arg_field.value.charAt(x-2) == " ") ){
            // stop triple spaces
            arg_field.value = arg_field.value.substring(0, x);
          } else {
             _wordcounter++ // Counts the spaces while ignoring double spaces,
             if (_wordcounter > arg_maxlimit) {
                arg_field.value = arg_field.value.substring(0, x);
                _wordcounter--;
             }
          }
        }
      }
      g_arWordCnts[arg_field] = _wordcounter;
      g_arWordCntPos[arg_field] = arg_field.value.length;
      arg_charcountfield.value = arg_field.value.length;
      arg_countfield.value = arg_maxlimit - _wordcounter;
      //alert("backspace:"+_wordcounter);
    } else {
       // handle new forward keystroks
       for (x=_wordstart;x<arg_field.value.length;x++) {
          if ( ( (arg_field.value.charAt(x) == " ") &&
             (arg_field.value.charAt(x-1) != " ") ) ||
             ( (arg_field.value.charAt(x) == "\r") ||
               (arg_field.value.charAt(x) == "\n") ) ) {
             if ( (arg_field.value.charAt(x) == " ") &&
                  (arg_field.value.charAt(x-1) == " ") &&
                 (arg_field.value.charAt(x-2) == " ") ){
                // stop triple spaces
                arg_field.value = arg_field.value.substring(0, x);
             } else {
                _wordcounter++ // Counts the spaces while ignoring double spaces,
                if (_wordcounter > arg_maxlimit) {
                   arg_field.value = arg_field.value.substring(0, x);
                   _wordcounter--;
                }
             }
          }
        }
        g_arWordCnts[arg_field] = _wordcounter;
        g_arWordCntPos[arg_field] = arg_field.value.length;
        arg_charcountfield.value = arg_field.value.length;
        arg_countfield.value = arg_maxlimit - _wordcounter;
    }
  }
}

function uTextCounter(arg_field, arg_countfield, arg_maxlimit) {
  if (arg_field.value.length > arg_maxlimit) {
     arg_field.value = arg_field.value.substring(0, arg_maxlimit);
  } else {
     arg_countfield.value = arg_field.value.length;
  }
}

function uTextCounterRemaining(arg_field, arg_countfield, arg_maxlimit) {
  if (arg_field.value.length > arg_maxlimit) {
     arg_field.value = arg_field.value.substring(0, arg_maxlimit);
  } else {
     arg_countfield.value = arg_maxlimit - arg_field.value.length;
  }
}
// ============ end Word/Text count code ================


/* General function that moves a single item from one
    selectlist to another */
function uClickMoveItem(arg_theSrcList, arg_theTrgList) {
    var nSrcCnt = arg_theSrcList.options.length;
    var _doClearDuplicate = false;
    var undefined;
    // make sure we don't trigger an error in IE5
    if (nSrcCnt <=0)
       return;

     // grab value
     var nSelected = arg_theSrcList.selectedIndex;
     // insure minimum of first item selected
     if (nSelected == undefined) {
        nSelected = 0;
        arg_theSrcList.selectedIndex = 0;
     }

     var vSource = arg_theSrcList.options[nSelected].value ;
     var vSrcLabel = arg_theSrcList.options[nSelected].text ;
     var vSrcValuePair = vSrcLabel+"="+vSource;

     //verify new item is not on target List.. if it is we don't write it to
     // the target list.. just consume it..
     var nCount = arg_theTrgList.options.length;
     for(var i = 0 ; i<nCount ; i++){
        if (arg_theTrgList.options[i].value == vSource) {
          _doClearDuplicate = true;
          break;
        }
     }

     //extract options from source and return an array that omitts the value to be moved
     var arSrcOptions = uOptionToArray_r(arg_theSrcList,vSource) ;
     // reWrite options without the selected option
     uArrayToOption(arSrcOptions, arg_theSrcList);
     // reset select
     if (nSelected <= arSrcOptions.length-1) {
        arg_theSrcList.selectedIndex =  nSelected;
     } else {
        arg_theSrcList.selectedIndex = arSrcOptions.length-1;
     }

    if (!_doClearDuplicate) {
       //extract options from target and return an array
       var arTrgOptions = uOptionToArray_r(arg_theTrgList,"") ;
       // add new option
       arTrgOptions[arTrgOptions.length] = vSrcValuePair;
       // sort new array alphabetically
       arTrgOptions.sort();
       // reWrite options with new value
       uArrayToOption(arTrgOptions, arg_theTrgList);
       // insure that at least the first item is selected
       arg_theTrgList.selectedIndex = 0;
    }
}

/* Loads the Options ( text=value pair) from a given select object and returns an array, optionally it
   will leave out a matching value from the array if greater than ""
   Returns : Array */
function uOptionToArray_r(arg_theSelect,arg_sOmitVal) {
      var nCount = arg_theSelect.options.length;
      var arNew = new Array();
      var n = 0;
      for(var i = 0 ; i<nCount ; i++){
         if ( (arg_theSelect.options[i].value != arg_sOmitVal) &&
              (arg_theSelect.options[i].value != "novalue") ) {
            arNew[n] = arg_theSelect.options[i].text+"="+arg_theSelect.options[i].value;
            n++;
         }

      }
      return arNew;

}

/* Loads the Options from a given select object and returns a comma delimited List
   Returns : String of comma delimited values */
function uSelectedOptionToDelimList_s(arg_theSelect) {
      //extract options from source and return an array that omitts the possible "novalue" prompt
      // record
      var arOptions = uOptionToArray_r(arg_theSelect,"novalue") ;
      var nCount = arOptions.length;
      var sResult = "";
      var n = 0;
      for(var i = 0 ; i<nCount ; i++){
         var sVPair = arOptions[i];
         arPair = sVPair.split("=");
	 if (i == 0) {
            sResult = makeQueryStringSafe_s(arPair[1]);
	 } else {
           sResult = sResult+","+ makeQueryStringSafe_s(arPair[1]);
	 }
      }
      return sResult;
}

/* Loads the specified array into the target select object*/
function uArrayToOption(arg_arOptions, arg_theSelect) {
      var nCount = arg_arOptions.length;
      var arPair = new Array();
      //empty options object
      arg_theSelect.options.length = 0;
      //set new length
      arg_theSelect.options.length = nCount;
      //load options
      for(var i = 0 ; i<nCount ; i++){
         var sVPair = arg_arOptions[i];
         arPair = sVPair.split("=");
         if (isNav ) {
            arg_theSelect.options[i] = new Option(arPair[0],arPair[1]);
         } else {
            arg_theSelect.options[i].text = arPair[0];
            arg_theSelect.options[i].value = arPair[1];
         }
      }
}


function uClearOptionSelect(arg_theSelect) {

      var nCount = arg_theSelect.options.length;
      for(var i = 0 ; i<nCount ; i++){
          arg_theSelect.options[i].selected = false;
      }

}

function NoFeature(){
       alert("The Feature you have requested is still under\ndevelopment. This message is a function placeholder.")
}

//------Function examines each character of the value to make sure
//------that only numbers from 0 to 9 with no punctuation or other symbols exist

function isPosInteger(inputVal) {
  inputStr = inputVal.toString()
             for (var i = 0; i < inputStr.length; i++) {
               var oneChar = inputStr.charAt(i)
                          if (oneChar < "0" || oneChar > "9") {
                            return false
                          }
             }
             return true
}

function isNumber(inputVal) {
    oneDecimal = false;
    inputStr = inputVal.toString();
    for (var i = 0; i < inputStr.length; i++) {
      var oneChar = inputStr.charAt(i);
      if ( i == 0 && oneChar == "-") {
        continue;
      }
      if (oneChar == "." && !oneDecimal) {
        oneDecimal = true;
        continue
      }
      if (oneChar < "0" || oneChar > "9") {
        return false;
      }
    }
    return true;
}





function isInvalidChar(arg_sToCheck,arg_inputVal) {

     var _indx = arg_sToCheck.indexOf(arg_inputVal);
        if (_indx > 0) {alert ("You can not use the "+arg_inputVal+" symbol");
	return true;
        }
	return false;

}



// Use:  mystring = makeQueryStringSafe(mystring);
function makeQueryStringSafe_s(arg_sStrVal) {
   var undefined ;
   if ( (arg_sStrVal != "") && (arg_sStrVal != undefined) ) {
      arg_sStrVal = arg_sStrVal.replace(/#/g,"]");
      arg_sStrVal = arg_sStrVal.replace(/ /g,"+");
      arg_sStrVal = arg_sStrVal.replace(/&/g,"[");
      arg_sStrVal = arg_sStrVal.replace(/\n/g,"|");
   }
   return arg_sStrVal;
}

//=================Math helper functions =======================================

// quicky mod function
function isModZero(arg_nTest, arg_nDivisor) {

   var nBy = parseInt(arg_nTest/arg_nDivisor);
   var nX = (nBy * arg_nDivisor);
   if(arg_nTest == nX)  {
      return  true;
   } else {
      return  false;
   }

}


//================Date and Time Helper Functions ==========================

function uIsValidDate_l(arg_sDate) {

      var sDate = arg_sDate;

      //alert("Date validation for "+sDate);
      //load some arrays to be used for error messages
      var arrmonthNo = new Array(13);
      for (i = 1; i <= 12; i++) {
          arrmonthNo[i] = i;
      }
      var arrmonthChar = new Array(13);
             arrmonthChar[1] = 'January';
             arrmonthChar[2] = 'February';
             arrmonthChar[3] = 'March';
             arrmonthChar[4] = 'April';
             arrmonthChar[5] = 'May';
             arrmonthChar[6] = 'June';
             arrmonthChar[7] = 'July';
             arrmonthChar[8] = 'August';
             arrmonthChar[9] = 'September';
             arrmonthChar[10] = 'October';
             arrmonthChar[11] = 'November';
             arrmonthChar[12] = 'December';



      // First break it apart into Month, day, year and check for raw formating
      if (sDate.indexOf("-") != -1) {
         var sToken = sDate.split("-");
      } else {
         var sToken = sDate.split("/");
      }
      if (sToken.length != 3) {
         alert("Date must be in format MM/DD/YYYY \n Or format MM-DD-YYYY");
         return false;
      }

	  //******** we have three tokens - validate each****************

      //Month token
      if (sToken[0].length > 2) {
          alert("Invalid Month format, Must be two digits or less");
          return false;
      }
      var nMonth = parseInt(sToken[0]);
      if ((nMonth < 0) || (nMonth > 12)) {
         alert("Invalid Month,  01 through 12 required");
         return false;
      }


      // Day token
      var nDay = parseInt(sToken[1]);
      // check for months with only 30 days
      if ((nMonth==4 || nMonth==6 || nMonth==9 || nMonth==11) && (nDay >= 31))  {
         alert("Month "+arrmonthChar[nMonth]+" has only 30 days!");
         return false;
      }

      // Year token
      if (sToken[2].length !=4) {
         alert("Year format invalid. Four digit year required.");
         return false;
      }
      var nYear = parseInt(sToken[2]);
      var sYear = ""+nYear;
      if (sYear.length != 4) {
         dTempDate = new Date(sDate);
         if (!confirm("The year chosen has been converted to the year "+dTempDate.getFullYear()+" \n\n "+dTempDate+"\n\n If this is correct click OK")) return false;
      }

      // Leap year check
      if (nMonth == 2) {
         var l_isLeapYear = uIsLeapYear_l(nYear);

         if(l_isLeapYear == true) {
             if(nDay > 29)  {
                alert("February never has more than 29 days!");
                return false;
             }
         }

         if(l_isLeapYear == false) {
            if(nDay > 28) {
              alert("February in "+ nYear +" has only 28 days!");
              return false;
            }
        }
      }
      return true;
}

// determine leap year
function uIsLeapYear_l(arg_nYear) {

   // check if divisible by..
   var Mod4Check = isModZero(arg_nYear, 4);
   var Mod100Check = isModZero(arg_nYear, 100);
   var Mod400Check = isModZero(arg_nYear, 400);

   return ((Mod4Check == true) && (Mod100Check != true) || (Mod400Check == true))

}


function uNow_s(arg_style) {
    var now = new Date();
    var hours= now.getHours();
    var minutes= now.getMinutes();
    var seconds= now.getSeconds();
    var ampm="A.M."
     if (hours >= 12) {
         ampm = "P.M."
    }
	//default is 24 hour, unless explicitly set for 12
	if (arg_style =='12') {
        if (hours == 0) {
            hours = 12
        }
        if(hours >= 13){
            hours -= 12;
        }
    }
    var timeValue = hours
	if (arg_style =='12') {
	   timeValue += ((minutes < 10) ? ":0":":") + minutes + " " + ampm
	} else {
	    timeValue += ((minutes < 10) ? ":0":":") + minutes
	}
	return timeValue
}

function uToday_s(arg_format) {
    var now = new Date();
    var months= now.getMonth()+1;
    var dates= now.getDate();
    var years= now.getFullYear();
    var dateValue = ""
	if (arg_format == 'short') {
        dateValue = ((months < 10) ? ":0":":") + months
        dateValue +="/"+ ((dates < 10) ? ":0":":") + dates
        dateValue +="/"+  years
	} else {
	    var theDayOfWeekStr = daysNames[now.getDay() +1]
        var theMonthStr = monthNames[now.getMonth() +1]
        var daypostfix="th"
        if ((dates == 1) || (dates == 21) || (dates == 31)) {
            daypostfix="st";
        }
        if ((dates == 2) || (dates ==22)) {
            daypostfix="nd";
        }
        if ((dates== 3) || (dates  == 23)) {
            daypostfix="rd";
        }
        dateValue = theDayOfWeekStr + ", " + theMonthStr + " " + dates + daypostfix +", "+years;
	}
	return dateValue

}

function uDateTimeIsAfter_l(arg_date1, arg_date2) {

   // work backwards from year
   if (arg_date1.getFullYear() < arg_date2.getFullYear() ) {
      return true;
   } else if (arg_date1.getFullYear() != arg_date2.getFullYear() ) {
      // if not equal then further comparison is not possible
      return false;
   }
   // month
   if (arg_date1.getMonth() < arg_date2.getMonth() ) {
      return true;
   } else if (arg_date1.getMonth() != arg_date2.getMonth() ) {
      // if not equal then further comparison is not possible
      return false;
   }
   // day
   if (arg_date1.getDate() < arg_date2.getDate() ) {
      return true
   } else if (arg_date1.getDate() != arg_date2.getDate() ) {
      // if not equal then further comparison is not possible
      return false;
   }
   // hours
   if (arg_date1.getHours() < arg_date2.getHours() ) {
      return true;
   } else if (arg_date1.getHours() != arg_date2.getHours() ) {
      // if not equal then further comparison is not possible
      return false;
   }
   // minutes
   if (arg_date1.getMinutes() < arg_date2.getMinutes() ) {
      return true;
   } else if (arg_date1.getMinutes() != arg_date2.getMinutes() ) {
      // if not equal then further comparison is not possible
      return false;
   }

   return false;

}

function uDateIsEqual_l(arg_date1, arg_date2) {
   var _isOK = true;
   // work back wards from year
   if (arg_date1.getFullYear() == arg_date2.getFullYear() ) {
      // continue
   } else if (arg_date1.getFullYear() != arg_date2.getFullYear() ) {
      // if not equal then further comparison is not possible
      return false;
   }
   // month
   if (arg_date1.getMonth() == arg_date2.getMonth() ) {
      //continue
   } else if (arg_date1.getMonth() != arg_date2.getMonth() ) {
      // if not equal then further comparison is not possible
      return false;
   }
   // day
   if (arg_date1.getDate() == arg_date2.getDate() ) {
      //continue
   } else if (arg_date1.getDate() != arg_date2.getDate() ) {
      // if not equal then further comparison is not possible
      return false;
   }
   return _isOK;
}

function uIsValidTime_s(arg_sSHr, arg_sSMin, arg_sEHr, arg_sEMin) {
       //alert(arg_sSHr +" "+arg_sSMin+" - "+arg_sEHr+" "+arg_sEMin);
       if ( ((arg_sSHr != "00") || (arg_sSMin != "00")) || ((arg_sEHr != "00") || (arg_sEMin != "00")) ) {
          if ((arg_sSHr > 24) || (arg_sEHr > 24) ) {
             alert("The largest hour entry is 23.");
             return "-1"
          }
          if ((arg_sSMin > 59) || (arg_sEMin > 59) ) {
             alert("The largest minute entry is 59.");
             return "-1"
          }
          var sSTime = arg_sSHr + arg_sSMin;
          var sETime = arg_sEHr + arg_sEMin;

          return '( (CVTIME >= "'+sSTime+'") AND ( CVTIME <= "'+sETime+'") )';

       } else {

         return "-1"

      }

}

//================= UI Navigation functions ==============================

function uSetFirstTextFocus(arg_TextObj) {
    arg_TextObj.focus();
}

// ================= Auto Focus =============================

// Scan the current document, looking for text fields inside forms
  function uPlaceFocus(){
   var formNode = document.getElementsByTagName("form")[0];
   if(formNode){
    var inputNodes = formNode.getElementsByTagName("input");
    uFocusFirst(inputNodes);
   }
  }

  // Put focus and cursor inside the first field of a node list
  function uFocusFirst(nodelist){
   for(var i=0; i<nodelist.length; i++){
    var fieldType = nodelist[i].getAttribute("type").toLowerCase();
    if ( (fieldType == "text") ||
    (fieldType == "password") ||
    (fieldType == "radio") ||
    (fieldType == "checkbox") ){
     nodelist[i].focus();
     // if text or password, select text
     if ( (fieldType == "text") ||
        (fieldType == "password") ) {
       nodelist[i].select();
    }
     break;
    }
   }
  }




//==============Window management helper functions========================

function uFullSizeWinChrome(){
     if (screen.width == 640 && window.resizeTo) {self.resizeTo(635,400);}
    else if (screen.width == 800 && window.resizeTo) {self.resizeTo(795,520);}
    else if (screen.width == 1024 && window.resizeTo) {self.resizeTo(1020,640);}
    else if (screen.width == 1280 && window.resizeTo) {self.resizeTo(1275,920);}
    else if (screen.width == 1600 && window.resizeTo) {self.resizeTo(1595,1010);}
    else if (window.resizeTo) {self.resizeTo(640,400);}
}

function uMaxSizeWindow(){
   if (window.resizeTo) {
        self.resizeTo(screen.width,screen.height);
   }
}

function uDockIt(){
    if (window.moveTo) {self.moveTo(0,0);}
}

/*
   Centers a window with optional "offset" from center.
   arg_sWinName = name of window used in cvuWinOpen_obj(..)
   arg_nXWin = pixel width of window
   arg_nYWin = pixel heigth of window
   arg_n#Offset = pixels offset from center on X/Y position from center where 0 is center
*/
function uCenterMoveTo(arg_sWinName,arg_nXWin, arg_nYWin, arg_nXOffset, arg_nYOffset) {

    var xPos = (screen.width/2 - (arg_nXWin/2) + arg_nXOffset);
	var yPos = (screen.height/2 - (arg_nYWin/2) + arg_nYOffset);
	if ((arg_sWinName != "") && (g_WHandles[arg_sWinName] != null)) {
	     var WHandle = g_WHandles[arg_sWinName];
    } else {
        var WHandle = self;
    }
    if (WHandle.moveTo) {WHandle.moveTo(xPos,yPos);}

}

function uCornerMoveTo(arg_whandle,arg_corner,arg_x, arg_y) {

    var _xScreen = screen.width;
	var _yScreen = screen.height;
	switch (arg_corner){
    case "topleft":
        var _xPos = 0;
        var _yPos = 0;
        break;
    case "topright":
        var _xPos = _xScreen - arg_x;
        var _yPos = 0;
        break;
	case "bottomleft":
        var _xPos = 0;
        var _yPos = _yScreen - arg_y;
        break;
    case "bottomright":
        var _xPos = _xScreen - arg_x;
        var _yPos = _yScreen - arg_y;
        break;
    default:
        var _xPos = 0;
        var _yPos = 0;
    }

    if (arg_whandle.moveTo) {arg_whandle.moveTo(_xPos,_yPos);}


}

/*Open window with addtition of window to stack, make sure to add the following methods to
this window if these feature are needed..

      function setFocus() {
		    if (opener) {
		        if (opener.g_sTopModalWindow == "ThisWindowNamehere") {
				   opener.cvuStackDiagWindows();
			       self.focus()
			    }
		    }
		}

		function winClose() {
		      if (opener) {
			      opener.g_sTopModalWindow = "";
			      opener.cvuRemoveStackWindow("ThisWindowNamehere");
			      opener.cvuStackDiagWindows();
			}
		}

     And add this to the Body tag

	 ONBLUR="javascript:setFocus()" ONLOAD="javascript:LoadDateTime();"

	 ..as needed..
*/
function uWinOpen_obj(arg_sURL,arg_sWinName,arg_sList ) {

     var nCount = g_WinStack.length;
     g_WHandles[arg_sWinName] = open(arg_sURL,arg_sWinName,arg_sList);
     g_WinStack[nCount] = arg_sWinName;
     g_sTopModalWindow = arg_sWinName;

     return g_WHandles[arg_sWinName];

}

function uWinLocalOpen_obj(arg_sHTML,arg_sWinName,arg_sList ) {

     //alert(arg_sHTML);
     var nCount = g_WinStack.length;
     g_WHandles[arg_sWinName] = open("",arg_sWinName,arg_sList);
     g_WHandles[arg_sWinName].document.open();
     g_WHandles[arg_sWinName].document.write(arg_sHTML);
     g_WHandles[arg_sWinName].document.close();
     //alert("write closed");
     g_WinStack[nCount] = arg_sWinName;
     g_sTopModalWindow = arg_sWinName;

     return g_WHandles[arg_sWinName];

}


function uStackDiagWindows() {

      var nCount = g_WinStack.length;
      if (nCount == 0) {
         return;
      }
      var theWin;
      for (var i=0;i<nCount;i++) {
          theWin = g_WHandles[g_WinStack[i]];
          if (theWin != null) {
             theWin.focus();
          }

      }

}

function uRemoveStackWindow(arg_sWinName) {

      var nCount = g_WinStack.length;
      if (nCount == 0) {
         g_sTopModalWindow = "";
         return;
      }
      var tempWHAr = new Array();
      var tempWSAr = new Array();
      var nWcount = 0;
      for (var i=0;i<nCount;i++) {
         if (g_WinStack[i] != arg_sWinName) {
            tempWHAr[g_WinStack[i]] = g_WHandles[g_WinStack[i]]
            tempWSAr[nWcount] = g_WinStack[i];
            //update top window flag
            g_sTopModalWindow = g_WinStack[i];
            nWcount += 1
         }
      }
      // empty old arrays
      g_WinStack.length = 0;
      g_WHandles.length = 0;
      // re assign to updated array stacks
      g_WinStack = tempWSAr;
      g_WHandles = tempWHAr;

}

/* ===========================================
    String Functions
   ===========================================
*/


function uBalanceQuotes(inText) {
    var darray = inText.match(/'/g);
    if (darray != null) {
       var dcount = darray.length;
       if (!isModZero(dcount, 2)) {
          inText += "\'"
      }
   }
   var darray = inText.match(/"/g);
   if (darray != null) {
      var dcount = darray.length;
      if (!isModZero(dcount, 2)) {
         inText += '\"'
      }
  }

  return inText;

}

function uIgnoreSpaces_s(arg_String) {
    var temp = "";
    arg_String = '' + arg_String;
    splitstring = arg_String.split(" ");
    for(i = 0; i < splitstring.length; i++) {
      temp += splitstring[i];
    }
    return temp;
}


function uTrimTrailing_s(arg_String) {
    while(''+arg_String.charAt(arg_String.length-1) == ' ') {
         arg_String=arg_String.substring(0,arg_String.length-1);
    }
    return arg_String;
}

function uTrimLeading_s(arg_String) {
    while(''+arg_String.charAt(0)==' ') {
        arg_String = arg_String.substring(1, arg_String.length);
    }
    return arg_String;
}

// clear out leading  and trailing spaces
function uTrim_s(arg_String) {
    arg_String = uTrimLeading_s(arg_String);
    arg_String = uTrimTrailing_s(arg_String);
    return arg_String;
}


// find if one string is contained another
function uIsInString_l(arg_sFind, arg_Str) {
   var pos = 0;
   pos = arg_Str.indexOf(arg_sFind);
   if (pos!=-1) {
      return true;
   } else {
      return false;
   }
}

function uSwapQuotes(arg_sText) {
	arg_sText = arg_sText.replace(/"/g, "'");
	return arg_sText;
}

// convert hexidecimal rgb number to delimited decimal rgb
function uConvertHexToDec(arg_sHexColor) {
	var pos = arg_sHexColor.indexOf(",");
	var decString = arg_sHexColor;
	if (pos==-1) {
           pos = hexColor.indexOf("#");
           if (pos!=-1) {
              hexColor = hexColor.substring((pos + 1),(pos + 7));
           }

           var redHex = hexColor.substring(0,2);
           var greenHex = hexColor.substring(2,4);
           var blueHex = hexColor.substring(4,6);
           decString = parseInt(redHex,16) + "," + parseInt(greenHex,16) + "," + parseInt(blueHex,16);

	}

	return decString;

}


// swap out one interior string with another
function uSwapStrings(arg_Str,arg_sTarget,arg_sNew) {
	var pos = 0;
	var rpos = 0;
	var epos = 0;
	var leftString = "";
	var rightString = "";
	pos = arg_Str.indexOf(arg_sTarget);
	while (pos!=-1) {
      	   epos = arg_Str.length;
          rpos = pos + arg_sTarget.length;
          leftString = arg_Str.substring(0,pos);
          rightString = arg_Str.substring(rpos,epos);
          arg_Str = leftString + arg_sNew + rightString;
          pos = arg_Str.indexOf(arg_sTarget);
	}
	leftString=null;
	rightString=null;
	return arg_Str;
}

// replace single quotes with double single quotes
//	set up interior single qoutes and apostrophes for queries
function uFixSingleQuotes(arg_Str) {
	var outString = arg_Str.replace(/'/g, "''");
	return outString;
}

// replace common HTML entitys with the characters they represent
function uParseEntity(arg_Str) {
	arg_Str = uSwapStrings(arg_Str,"&apos;","'");
	arg_Str = uSwapStrings(arg_Str,"&divide;","/");
	arg_Str = uSwapStrings(arg_Str,"&ge;",">=");
	arg_Str = uSwapStrings(arg_Str,"&gt;",">");
	arg_Str = uSwapStrings(arg_Str,"&le;","<=");
	arg_Str = uSwapStrings(arg_Str,"&lt;","<");
	arg_Str = uSwapStrings(arg_Str,"&ne;","<>");
	arg_Str = uSwapStrings(arg_Str,"&quot;",'"');
	//arg_Str = uSwapStrings(arg_Str,"&amp;","&");

	return arg_Str;
}

// replace the five problem characters for the server's XML parser
function uMakeXMLsafe(arg_Str) {

	arg_Str = uSwapStrings(arg_Str,"'","&apos;");
	arg_Str = uSwapStrings(arg_Str,">","&gt;");
	arg_Str = uSwapStrings(arg_Str,"<","&lt;");
	arg_Str = uSwapStrings(arg_Str,'"',"&quot;");

	return arg_Str;
}


// replace +  in string with space to allow parsing of unescaped xml response
function uReplacePlus(arg_Str) {
	var pos=9;
	while (pos != -1) {
           pos = arg_Str.indexOf('+');
           if (pos!=-1) {
              var lastpos = arg_Str.length;
              var midend = pos;
              var midstart = pos + 1;
              var leftSide = arg_Str.substring(0,midend);
              var rightSide = arg_Str.substring(midstart,lastpos);
              arg_Str = leftSide + " " + rightSide;
          }
	}
	return arg_Str;
}

// get the substring between beforeString and afterString, starting at startpos
// 		must be found before limitpos (0 for no limit)
// 		caseSensitive = true or false
function getInsideString(arg_Str,arg_sBefore,arg_sAfter,arg_iStartPos,arg_iLimitPos,arg_isCaseSensitive) {
	var returnString = "";
	var ucInString = arg_Str;
	var ucBefore = arg_sBefore;
	var ucAfter = arg_sAfter;
	if (arg_iLimitPos==0) arg_iLimitPos = arg_Str.length;
	if (!arg_isCaseSensitive) {
		ucInString = arg_Str.toUpperCase();
		ucBefore = arg_sBefore.toUpperCase();;
		ucAfter = arg_sAfter.toUpperCase();;
	}
	pos = ucInString.indexOf(ucBefore,arg_iStartPos);
	//alert(arg_iStartPos);
	if ((pos != -1) && (pos<arg_iLimitPos)) {
		pos = pos + ucBefore.length;
		var endpos = ucInString.indexOf(ucAfter,pos);
		returnString = arg_Str.substring(pos,endpos);
	}

	return returnString;
}

// Popup Calendar
function uPopDatePicker(arg_theTarg,arg_nXOffset, arg_nYOffset) {
   //update global reference to target field - defined in this file
    g_theDateTarget = arg_theTarg;
    var width = 285;
    var length = 295;
    // set popup position from center
    var xPos = (screen.width/2 - (width/2) + arg_nXOffset);
    var yPos = (screen.height/2 - (length/2) + arg_nYOffset);

    uWinOpen_obj("calendar.htm","PopDate","screenX="+xPos+",screenY="+yPos+",width="+width+",height="+length+",menubar=no,resizable=no,scrollbars=no,toolbar=no");

}

function uShowLayerCenter(arg_sLayerId) {

    var _obj = document.getElementById(arg_sLayerId);

    // get Width and Heigth of Layer
    var _iLayerWidth = _obj.style.width;
    var _iLayerHeight = _obj.style.height;
    if (_iLayerWidth.indexOf("px") != -1) {
       //strip off "px" part..
       _iLayerWidth = _iLayerWidth.substring(0,_iLayerWidth.indexOf("px"));
       _iLayerHeight = _iLayerHeight.substring(0,_iLayerHeight.indexOf("px"));
    }

    // find center of screen
    var _iWinWidth = uGetInsideWindowWidth();
    var _iWinHeight = uGetInsideWindowHeight();

    var xPos = Math.round((_iWinWidth/2) - (_iLayerWidth/2) );
    var yPos = Math.round((_iWinHeight/2) - (_iLayerHeight/2));

    _obj.style.left = xPos+"px";
    _obj.style.top = yPos+"px";
    _obj.style.visibility='visible';

}

//================= utilities for finding locations in windows===============

function uGetObjHeight(arg_obj) {
   if (isNav) {
      return arg_obj.clip.height;
   } else {
      return arg_obj.clientHeight;
   }
}

function uGetObjWidth(arg_obj) {
   if (isNav) {
     return arg_obj.clip.width;
   } else {
     return arg_obj.clientWidth;
   }
}

function uGetInsideWindowWidth() {
  if (isNav) {
     return window.innerWidth;
  } else {
     return document.body.clientWidth;
  }
}

function uGetInsideWindowHeight() {
   if (isNav) {
      return window.innerHeight;
   } else {
      return document.body.clientHeight;
   }
}

function uMoveTo(arg_obj, arg_iX, arg_iY) {
   if (isNav) {
      arg_obj.moveTo(arg_iX, arg_iY);
   } else {
      arg_obj.pixelLeft = arg_iX;
      arg_obj.pixelTop  = arg_iY;
   }
}


//end_lib
