    
var returnMethod = null;   

var m_DialogWindow = null;
    
var expressions;
var events;
var changeList;
var m_BlockEvents = false;
var m_PostBackInProcess = false;
var m_GridViewTriggerRow = null;


function getElement(id) {
      
  return document.getElementById(id);
}
    
function getValue(id) {

  var sVal = "";
  //need to try infragistics first - webcombo!!
  var bFound = false;
  var ig_element = null;
  if (typeof igcmbo_getComboById != "undefined") {
    ig_element = igcmbo_getComboById(id);
    if (ig_element != null) {
      bFound = true;
      sVal = ig_element.getValue();
    }
  }
  if (!bFound) {
    // if not combo try datetimechooser
    if (typeof igdrp_getComboById != "undefined") {
      ig_element = igdrp_getComboById(id);
      if (ig_element != null) {
        bFound = true;
        sVal = ig_element.getText();
      }
    }
  }
  if (!bFound) {
    if (typeof igedit_getById != "undefined") {
      ig_element = igedit_getById(id);
      if (ig_element != null) {
        bFound = true;
        sVal = ig_element.getValue();
      }
    }
  }
  if (!bFound) {
    sVal = getStandardValue(document.getElementById(id));
  }
  if (sVal == undefined || sVal == null)
    sVal = "";
  return sVal;
}

function getStandardValue(element) {

  var sVal = "";
  if (element != null) {
    if (element.value != null) {
      switch (element.type) {
        case "checkbox":
          sVal = element.checked;
          break;
        case "radio":
          if (element.checked)
            sVal = element.value;
          break;
        case "select-multiple":
          var opts = element.getElementsByTagName("OPTION");
          if (opts != null) {
            for (var i=0;i<opts.length;i++) {
              if (opts[i].selected) {
                if (i==0)
                  sVal = opts[i].value;
                else
                  sVal += "," + opts[i].value;
              }
            }
          }
          break;
        default:
          sVal = element.value;
          break;
      }
    }
    else {
      var chks = element.getElementsByTagName("input");
      if (chks != null && chks.length > 0) {
        for (var i=0;i<chks.length;i++) {
          if (chks[i].type == "radio") {
            if (chks[i].checked) {
              sVal = chks[i].value;
              break;
            }
          }
          else if (chks[i].type=="checkbox") {
            if (i==0)
              sVal = chks[i].checked;
            else
              sVal += "," + chks[i].checked;
          }
        }
      }
      else
        sVal = element.innerHTML;
    }
  }
  return sVal;
}


function setValue(id,value) {

  var sVal = "";
  var bChanged = false;
  var element = null;
   //need to try infragistics first - webcombo!!
  var bFound = false;
  var oldValue = null;
  if (typeof igcmbo_getComboById != "undefined") {
    ig_element = igcmbo_getComboById(id);
    if (ig_element != null) {
      bFound = true;
      oldValue = ig_element.getValue();
      if (oldValue != value) {
        bChanged = true;
        ig_element.setValue(value);
      }
    }
  }
  if (!bFound) {
    // if not combo try datetimechooser
    if (typeof igdrp_getComboById != "undefined") {
      ig_element = igdrp_getComboById(id);
      if (ig_element != null) {
        bFound = true;
        oldValue = ig_element.getText();
        if (oldValue != value) {
          bChanged = true;
          if (Blank(value)) {
            ig_element.setValue(null)
          }
          else {
            // weird bug on UnitTransfer when date typed in first
            try{
              ig_element.setValue(new Date(value));
            }
            catch(ex){};
          }
        }
      }
    }
  }
  if (!bFound) {
    if (typeof igedit_getById != "undefined") {
      ig_element = igedit_getById(id);
      if (ig_element != null) {
        bFound = true;
        oldValue = ig_element.getValue();
        if (oldValue != value) {
          bChanged = true;
          ig_element.setValue(value);
        }
      }
    }
  }
  if (!bFound) {
    bChanged = setStandardValue(document.getElementById(id),value);
  }
  return bChanged;
  
}

function setStandardValue(element, value) {

  var bChanged = false;
  
  if (element != null) {
    if (element.value != null) {
      switch (element.type) {
        case "checkbox":
        case "radio":
          if (element.checked != value) {
            element.checked = value;
            bChanged = true;
          }
          break;
        case "select-multiple":
          var opts = element.getElementsByTagName("OPTION");
          if (opts != null) {
            for (var i=0;i<opts.length;i++) {
              if (value.indexOf(opts[i].value) >=0 && !opts[i].selected) {
                opts[i].selected = true;
                bChanged = true;
              }
              else if (value.indexOf(opts[i].value) <0 && opts[i].selected) {
                opts[i].selected = false;
                bChanged = true;
              }
            }   
          }
          break;            
        default:
          if (element.value != value) {
            element.value = value;
            bChanged = true;
          }
          break;
      }
    }
    else if (element.innerHTML != null) {
      // TODO
//    var chks = element.getElementsByTagName("input");
//    if (chks != null) {
//      for (var i=0;i<chks.length;i++) {
//        if (chks[i].type == "radio") {
//          if (chks[i].checked) {
//            sVal = chks[i].value;
//            break;
//          }
//        }
//        else if (chks[i].type=="checkbox") {
//          if (i==0)
//            sVal = chks[i].checked;
//          else
//            sVal += "," + chks[i].checked;
//        }
//      }
//    }
//    else if (element.innerHTML != value) {
        if (element.tagName != "TABLE") {
          element.innerHTML = value;
          bChanged = true;
        }
//    }
    }
  }
  return bChanged;
}

function setFocus(id) {

  //need to try infragistics first
  if (id != null) {
    var bFound = false;
    var ig_element = null;
    if (typeof igcmbo_getComboById != "undefined") {
      ig_element = igcmbo_getComboById(id);
      if (ig_element != null) {
        bFound = true;
        ig_element.setFocusTop();
      }
    }
    if (!bFound) {
      // if not combo try datetimechooser
      if (typeof igdrp_getComboById != "undefined") {
        ig_element = igdrp_getComboById(id);
        if (ig_element != null) {
          bFound = true;
          ig_element.focus();
        }
      }
    }
    if (!bFound) {
      if (typeof igedit_getById != "undefined") {
        ig_element = igedit_getById(id);
        if (ig_element != null) {
          bFound = true;
          ig_element.focus();
        }
      }
    }
    if (!bFound) {
      var o = document.getElementById(id);
      if (o != null) { 
        try {
          o.focus();
        } catch(ex){}
      }
    }
  }
} 

function buildUrlParm(id) {

  return id + "=" + getValue(id);
}

function buildUrlList(IdList) {

  var url = "";
  var sId;
  if (IdList != null) {
    var list = IdList + ",";
    var ip2 = list.indexOf(",");
    var ip = 0
    while (ip2 > ip && ip < list.length-1) {
      sId = list.substring(ip,ip2);
      if (url.length > 0)
        url += "&";
       
      url += buildUrlParm(sId);
      ip = ip2 + 1;
      ip2 = list.indexOf(",",ip);
    }
  }
  return url;
}

function loadNewPage(sFunc) {

  var sRes
  var sFeatures =  "directories=no,location=no,maximize=no,minimize=no,menubar=no,resizable=yes,scrollbars=no,status=yes,titlebar=no,toolbar=no"

  if (document.all) { 
    window.open(sFunc,"_blank",sFeatures);
  }
  else {
    m_DialogWindow = window.open(sFunc,"_blank","dialog=no");
  }  

  return false;
  
}

function loadNewBrowser(sFunc) {

  var sRes

  if (document.all) { 
    window.open(sFunc,"_blank");
  }
  else {
    m_DialogWindow = window.open(sFunc,"_blank","dialog=no");
  }  

  return false;
  
 }

function LoadAttachments(url) {
   
  var sFeatures =  "directories=no,height=270,width=570,location=no,maximize=no,minimize=no,menubar=no,resizable=yes,scrollbars=no,status=yes,titlebar=no,toolbar=no"

  if (document.all) { 
    window.open(url,"_blank",sFeatures);
  }
  else {
    m_DialogWindow = window.open(url,"_blank","dialog=no");
  }  
   
}

function LoadArchivedEmail(url) {
   
  var sFeatures =  "directories=no,height=440,width=780,location=no,maximize=no,minimize=no,menubar=no,resizable=yes,scrollbars=no,status=yes,titlebar=no,toolbar=no"

  if (document.all) { 
    window.open(url,"_blank",sFeatures);
  }
  else {
    m_DialogWindow = window.open(url,"_blank","dialog=no");
  }  
}

function LoadSendEmail(url) {
   
  var sFeatures =  "directories=no,height=580,width=725,location=no,maximize=no,minimize=no,menubar=no,resizable=yes,scrollbars=no,status=yes,titlebar=no,toolbar=no"

  if (document.all) { 
    window.open(url,"_blank",sFeatures);
  }
  else {
    m_DialogWindow = window.open(url,"_blank","dialog=no");
  }  
}

function loadDialogPage2(sFunc, height, width) {

  var sFeatures =  "directories=no,location=no,maximize=no,minimize=no,menubar=no,resizable=yes,scrollbars=no,status=yes,titlebar=no,toolbar=no"

  if (document.all) { 
    if (height != null)
      sFeatures += ",height=" + height;
    if (width != null)
      sFeatures += ",width=" + width;  
    window.open(sFunc,"_blank",sFeatures);
  }
  else {
    sFeatures += ",dialog=no";
    if (height != null)
      opt += ",height=" + height;
    if (width != null)
      opt += "width=" + width;  
    m_DialogWindow = window.open(sFunc,"",sFeatures);
  }  

  return false;
  
 }

function loadDialogPage(sFunc,returnFunction, height, width) {

  var sRes
  // can't get rid of status over interenet
  var sFeatures =  "resizable:yes;help:no;scroll:no;status:yes;"

  returnMethod = returnFunction;  
  if (document.all) { 
 //    sRes = window.showModalDialog(sFunc,"",sFeatures) + ""
    if (height != null)
      sFeatures += "dialogHeight=" + height + "px;";
    if (width != null)
      sFeatures += "dialogWidth=" + width + "px;";  
    m_DialogWindow = window.showModelessDialog(sFunc,window,sFeatures);
  }
  else {
    var opt = "dialog=yes";
    if (height != null)
      opt += ",height=" + height;
    if (width != null)
      opt += "width=" + width;  
    m_DialogWindow = window.open(sFunc,"",opt);
  }  

  return false;
  
 }
 
function dialogReturn(sParms) {

  DialogWindow = null;
  if (returnMethod != null) {
    if (typeof returnMethod == "function")
      returnMethod(sParms);
    else {
  	  var sEventArgs = returnMethod + "(";
  	  for (i = 0; i < arguments.length; i++) {
  	    if (i == 0)
		      sEventArgs += "dialogReturn.arguments[" + i + "]";
		    else
		      sEventArgs += ", dialogReturn.arguments[" + i + "]";
		  }
	    sEventArgs += ");";
	    try{eval(sEventArgs);}
	    catch(ex){window.status = "DialogReturn: " + ex.message; return false;}
	  }
  }
}

function stripPX(size) {

  var n = size;
  var i = n.indexOf("px");
  if (i>0) 
    n = size.substring(0,i);

  return parseInt(n);
}

function sizeBrowser(elementId) { 
   
//  alert(document.getElementById(elementId).offsetWidth + "," + document.getElementById(elementId).offsetLeft + "," + stripPX(document.getElementById(elementId).style.width) )
//  debugger
//TODO browser resize with non-normal fonts
  var h = 55;   //35 normal font size, 38 larger font size, ?? xlarge
  var w = 16;

  if (parent.window.frames.length == 1) {
   // in iframe
 //   h += 110;
//    w += 4;
  }
  if (navigator.userAgent.indexOf("MSIE") > -1) {
    if (typeof(window.dialogWidth) == "undefined") {
      // not dialog
      window.resizeTo(stripPX(document.getElementById(elementId).style.width)+(2*document.getElementById(elementId).offsetLeft) + 24,document.getElementById(elementId).offsetHeight+65);
    }
    else {
      window.dialogHeight = document.getElementById(elementId).offsetTop + document.getElementById(elementId).offsetHeight + h + 'px';
      window.dialogWidth = document.getElementById(elementId).offsetLeft + document.getElementById(elementId).offsetWidth + w + 'px';
      window.scrollTo(0,0);
    }
  }
  else {
    window.resizeTo(stripPX(document.getElementById(elementId).style.width)+(2*document.getElementById(elementId).offsetLeft) + 4,document.getElementById(elementId).offsetHeight+65);
  }
}

function getHtmlRow(element) {

  var tdRow, nRow = 0
  
  tdRow = element
  do {
    if (tdRow.tagName == "TR") {
      nRow = tdRow.rowIndex;
      break;
     }   
    else  
      tdRow = tdRow.parentNode;
  }
  while (nRow == 0 && tdRow.parentNode != null && tdRow.nodeType==1); 
  return nRow;
}      
      
function getContainerElement(tagName, element) {

  var container = null;
  if (element.parentNode != null) {
    var e = element.parentNode;
    do {
      if (e.tagName == tagName) {
        container = e;
        break;
       }   
      else  
        e = e.parentNode;
    }
    while (container == null && e.parentNode != null); 
  }
  return container;
}  
 
  
function getSelectedRowValue(tbl, id) {
      
  var value = ""
  var row = getSelectedRow(tbl);
  if (row != null) {
    value = getRowValue(row, id);
  }
  
  return value;
}
      
function getSelectedRow(tbl) {

  var row = null
  if (tbl != null) {
    var chks = tbl.getElementsByTagName("input");
    if (chks != null) {
      var id = "Selected";
      for (var i=0;i<chks.length;i++) {
        if (chks[i].type == "checkbox") {
          if (chks[i].id.length >= id.length) {
            if (chks[i].id.substr(chks[i].id.length-id.length,id.length) == id) {
              if (chks[i].checked) {
                row = getContainerElement("TR",chks[i]);
                break;
              }
            }
          }
        }
      }
    }
  }
  return row;
}

function getRowElement(parentElement,id) {
      
  var element = null;
  if (parentElement != null) {
    if (parentElement.id != null && (parentElement.id == id || parentElement.id.indexOf("_" + id) == parentElement.id.length-id.length-1)) {
      element = parentElement;
    }
    else if (parentElement.childNodes != null) {
      for (var i=0; i<parentElement.childNodes.length && element==null; i++) {
        element = getRowElement(parentElement.childNodes[i],id);
      }
    }
  }
  return element;
}

function getRowValue(element,id) {
      
  var value = ""
  if (element != null) {
    if (element.id != null && (element.id == id || element.id.indexOf("_" + id) == element.id.length-id.length-1)) {
      value = element.value;
      if (value == undefined)
        value = element.innerHTML;
    }
    else if (element.childNodes != null) {
      for (var i=0; i<element.childNodes.length && value == "";i++) {
        value = getRowValue(element.childNodes[i],id);
      }
    }
  }
  return value;
}

function getRowColumnValue(row, nColNo, id) {
      
  var value = ""
  var cols = row.getElementsByTagName("TD");
  if (cols != null && nColNo < cols.length) {
    value = getRowValue(cols[nColNo], id);
  }
  return value;
}

 function GetGridFirstRow(id) {
   
    var row = null;
    var grid = getElement(id);
    if (grid != null) {
      row = getChildElement("TR", grid);
      if (row != null) {
        if (getChildElement("TH", row) != null) {
          // header row, get next
          row = row.nextSibling;
        }
      }
    }
    return row;
  }
  
  function GetGridLastRow(id) {
   
    var row = null;
    var grid = getElement(id);
    if (grid != null) {
      var rows = grid.getElementsByTagName("TR");
      if (rows != null) {
        row = rows[rows.length-1];
      }
    }
    return row;
  }
  
  function GridColumnTotal(GridId, CellId) {
      
    var tot = 0;
    var row = GetGridFirstRow(GridId);
    while (row != null && row.nodeType==1) {
      tot += num(getRowValue(row,CellId));
      row = row.nextSibling;
    }
    return tot;
  }
  
  function GridColumnTotal2(GridId, nColNo, CellId) {
      
    var tot = 0;
    var row = GetGridFirstRow(GridId);
    while (row != null && row.nodeType==1) {
      tot += num(getRowColumnValue(row, nColNo, CellId));
      row = row.nextSibling;
    }
    return tot;
  }
   
  function getChildElement(tagName, element) {

    var child = null;
    if (element.childNodes != null) {
      for (var n=0;n < element.childNodes.length && child == null; n++) {
        var node = element.childNodes[n];
        if (node.tagName == tagName) {
          child = node;
          break;
        }
        else if (node.childNodes != null) {
          child = getChildElement(tagName, node);
        }
      }
    }
   
    return child;
  }  
      
function getRowCell(element,id) {
      
  var cell = null;
  if (element != null) {
    if (element.id != null && (element.id == id || element.id.indexOf("_" + id) == element.id.length-id.length-1)) {
      cell = element;
    }
    else if (element.childNodes != null) {
      for (var i=0; i<element.childNodes.length && cell == null;i++) {
        cell = getRowCell(element.childNodes[i],id);
      }
    }
  }
  return cell;
}
      
function setRowValue(element, id, value) {

  var bSet = false;
  if (element != null) {
    if (element.id != null && (element.id == id || element.id.indexOf("_" + id) == element.id.length-id.length-1)) {
      if (element.type == "checkbox")
        element.checked = value;
      else if (element.value == undefined)
        element.innerHTML = value;
      else
        element.value = value;
      bSet = true;
    }
    else if (element.childNodes != null) {
      for (var i=0; i<element.childNodes.length && !bSet;i++) {
        bSet = setRowValue(element.childNodes[i],id,value);
      }
    }
  }
  return bSet;
}

function setRowColumnValue(row, nColNo, id, value) {

  var bSet = false;
  var cols = row.getElementsByTagName("TD");
  if (cols != null && nColNo < cols.length) {
    bSet = setRowValue(cols[nColNo], id, value);
  }
  return bSet;
}

function SetGridColumnVisbility(GridId, nColNo, hide) {
      
  var row = GetGridFirstRow(GridId);
  while (row != null && row.nodeType==1) {
    var cols = row.getElementsByTagName("TD");
    if (cols != null && nColNo < cols.length) {
      SetElementDisplay(cols[nColNo],"C",hide);
    }
    row = row.nextSibling;
  }
  
  var tbl = getElement(GridId + "_hdr");
  if (tbl != null) {
    cols = tbl.getElementsByTagName("TD");
    if (cols != null && nColNo < cols.length) {
      SetElementDisplay(cols[nColNo],"C",hide);
    }
  }
}
   
function newExpression(exprType,id, expr) {

   var o = new Object();
   o.exprType = exprType
   o.id = id;
   o.expr = expr;
   
   return o;
   
}    

function addExpression(exprType,id, expr) {

  if (expressions == null)
    expressions = new Object();
  expressions[id] = newExpression(exprType,id, expr);
	
	}
	
function addTrigger(id, exprId) {

  if (events == null)
    events = new Object();
  ev = events[id];
  if (ev == null)
    ev = events[id] = new Array();
  ev[ev.length] = exprId;  

}
	


function fireExpressions(id) {

  if (!m_BlockEvents) {
    var ip = id.indexOf("igtxt");
    if (ip == 0) 
      id = id.substring(5);
    if (events != undefined && events != null) {
      var ev = events[id];
      if (ev != null) {
        for (var i = 0; i < ev.length; i++) {
          executeExpression(expressions[ev[i]]);
        }
      }
    }
  }
}

function fireLoadExpression(id) {

  var expr = expressions[id];
  if (expr != null) {
    changeList = new Array();
    executeExpression(expr);
    cascadeChanges();
  }
    
}

function cascadeChanges() {

  var cnt = 0;
  while (changeList.length > 0 && cnt < 20) {
    cnt ++
    var triggerList = changeList;
    changeList = new Array();
    for (var i=0; i<triggerList.length; i++) {
      fireExpressions(triggerList[i]);
    }
  }
}

function Blank(value) {

  var blank = true;
  if (typeof(value) != "undefined" && value != null) {
    if (typeof(value) == "number") {
      blank = false;
    }
    else if (typeof(value) == "string") {
      if (trim(value) != "")
        blank = false;
    }
    else
      blank = false;
  }
  
  return blank;
}

function substr(str,start,len) {

  var v = str;
  if (typeof(v) == "string") {
    if (start > v.length -1)
      v = 0;
    else {
      v = v.substr(start);
      if (len < v.length)
        v = v.substr(0,len);
    }
  }
  return v;

}

function num(sFunc) {

  var sNum, j

  if (typeof(sFunc) == "number") {
    return sFunc;
  }
  else if (sFunc == null)
    return 0;
  else {
    sNum = sFunc 
    j = sNum.indexOf(",")
    while (j>=0) {
      if (j==0)
        sNum = sNum.substr(j+1)
      else
        sNum = sNum.substr(0,j) + sNum.substr(j+1)
      j = sNum.indexOf(",")
     }

    sNum = trim(sNum)

    if (sNum.length == 0)
      sNum = "0"
    else if (sNum == "NaN")
      sNum = "0"
    else if (sNum.substr(0,1) == "$")
      sNum = sNum.substring(1);
    else if (sNum.substr(1,1) == "$")  // negative currency
      sNum = sNum.substring(0,1) + sNum.substring(2);

    if (parseFloat(sNum) < 0) 
      sNum = " " + sNum       // may get error on eval  50--6 vs 50- -6
    return parseFloat(sNum);
  } 

}
 
function trim(str) {

  var s, j, bStart

  s = str;
  if (typeof(s) == "string") {
    str += "";
    s = ""
    bStart = false;

    for (j=0;j<str.length && !bStart;j++) {
      if (str.substr(j,1) != " ") {
        s += str.substr(j,str.length);
        bStart = true;
       }
     }

    for (j=s.length-1, bStart=false; j>=0 && !bStart;j--) {
      if (s.substr(j,1) != " ") {
        bStart = true;
        s = s.substr(0,j+1);
       }
     }
   }

   return s;

 }
 
function sReplaceVar(sRes, nStart, nEnd, sVal) {

  var sNewRes;
  
  sNewRes = sRes;
  
  if (nStart == 0) {
    if (nEnd >= sRes.length - 1) 
      sNewRes = sVal;
    else
      sNewRes = sVal + sRes.substr(nEnd + 1);
   }   
  else  
    if (nEnd >= sRes.length - 1) 
      sNewRes = sRes.substr(0, nStart) + sVal;
    else
      sNewRes = sRes.substr(0, nStart) + sVal + sRes.substr(nEnd + 1);

  
  return sNewRes;
   
}

function Round(amount) {
  
  if (amount != null)
    return Math.round(amount* 100) / 100;
  else
    return 0;
}

function Round2(amount, nDec) {
  
  if (amount == null)
    return 0;
  else if (nDec == null || isNaN(nDec))
    return Round(amount);
  else
    return Math.round(amount * (Math.pow(10,num(nDec)))) / (Math.pow(10,num(nDec))) 
}
  
function FormatNumber(amount, nDec, IncludeCurrencySymbol) {

  var sVal = "0";
  if (typeof(nDec) == "undefined")
    nDec = 2;
  if (typeof(amount) != "undefined" && amount != null) {
    if (typeof(amount) == "string") {
      if (!Blank(amount))
        sVal = amount
    }
    else 
      sVal = amount.toString();
  }   
   
  var sRet = "";
  var nAmt = parseFloat(sVal);
  nAmt = Round2(nAmt, nDec);
  
  sVal = nAmt.toString();
  if (nDec > 0) {
    var ip = sVal.indexOf(".");
    if (ip < 0 && nDec > 0) {
      sVal += ".";
      ip = sVal.indexOf(".");
    }  
    if (ip >= 0) { 
      sRet = sVal.substr(ip);
      while (sRet.length < (nDec+1)) {
        sRet+= "0";  
       }
      ip--;
     }
     else {
      sRet = ".00";
      ip = sVal.length-1;
     }
   }
  else
    ip = sVal.length-1;

  var nCnt = 0;
  while (ip >= 0) { 
    sRet = sVal.substr(ip,1) + sRet;
    nCnt++;
    if (nCnt == 3 && ip > 0) {
      if (ip!=1 || sVal.substr(0,1) != "-") {       // avoid -,823.33
        nCnt = 0;
        sRet = "," + sRet;
       }
     }
    ip--;
   }

  if (IncludeCurrencySymbol)
    sRet = "$" + sRet;
  return sRet;
}
   
function executeExpression(expr) {

  if (expr != null) {
    var result = "";
    try{
      result = eval(expr.expr)
    }
    catch(ex){
      debugger
      window.status = "executeExpression: " + ex.message; alert("executeExpression: " + ex.message)
    }
    switch (expr.exprType) {
      case "E":
        if (setValue(expr.id,result)) {
          changeList[changeList.length] = expr.id;
        }
        break;
      case "H":
        // hide control
        setControlState("H",expr.id,result);
        break
      case "C":
        // hide control
        setControlState("C",expr.id,result);
        break        
      case "D":
        // disable control
        setControlState("D",expr.id,result);
        break;
    }
  }
}

function setControlState(type,id,value) {

  id = id.substr(2);
  var element = null;
  
    //need to try infragistics first - webcombo!!
  var bFound = false;
  var ig_element = null;
  if (typeof igcmbo_getComboById != "undefined") {
    ig_element = igcmbo_getComboById(id);
    if (ig_element != null) {
      //TODO - no method to disable
    }
  }
  if (!bFound) {
    // if not combo try datetimechooser
    if (typeof igdrp_getComboById != "undefined") {
      ig_element = igdrp_getComboById(id);
      if (ig_element != null) {
        bFound = true;
        if (type == "H") 
          ig_element.setVisible(!value);
        else if (type == "C") {
          //TODO
         //not tested or sure will work or needed
          //    element.element.
        }
        else if (type == "D")
          ig_element.setEnabled(!value);
     
      }
    }
  }
  if (!bFound) {
    if (typeof igedit_getById != "undefined") {
      ig_element = igedit_getById(id);
      if (ig_element != null) {
        bFound = true;
        if (type == "H") {
          if (ig_element.setVisible != null)
            ig_element.setVisible(!value);
        }
        else if (type == "C") {
          if (ig_element.setVisible != null)
            ig_element.setVisible(!value);
        }
        else if (type == "D")
          ig_element.setEnabled(!value);
        else if (type == "R")
          ig_element.setReadOnly(value);    
      }
    }
  }
  if (!bFound) {
    element = document.getElementById(id);
    if (element != null) {
      SetElementDisplay(element, type, value);
      if (element.type == "checkbox" || element.type == "radio") {
        var elem2 = element.nextSibling;
        if (elem2 != null) {
          var nd = elem2.getAttributeNode("for");
          if (nd != null && nd.nodeValue == element.id)
            SetElementDisplay(elem2, type, value);
        }
      }
    }
  }
}
    
function SetElementDisplay(element, type, value) {

  if (type == "H") {
    if (value) 
      element.style.visibility = "hidden";
    else
      element.style.visibility = "visible";
  }
  else if (type == "C") {
//  if (value) 
//    element.runtimeStyle.width = element.style.width;
//  else
//    element.runtimeStyle.width = 0;
//  }
    var s = null
    if (document.all)
      s = element.runtimeStyle;
    else
      s = element.style;
      
    if (value) 
      s.display = "none";
    else if (element.style.display == "none")
      s.display = "block";
    else
      s.display = element.style.display;
  }
  else if (type == "D") {
    if (element.disabled != null)
      element.disabled = value;
  }
}        

function HideElement(element, hide) {

  if (element != null) {
    if (hide) {
      element.style.visibility = "hidden";
      element.style.display = "none"
    }
    else {
      element.style.visibility = "visible";
      element.style.display = "block"
    }
  }
}

function PositiveOnlyKeyDown(oEdit,keyCode,oEvent) {

 // block negative sign and ()
//  if (keyCode == 109 || keyCode == 189 || (oEvent.event.shiftKey && (keyCode == 57 || keyCode == 48))) {
//    oEvent.cancel = true;
//  }
  if (keyCode == 45 || keyCode == 40 || keyCode == 41) {
    oEvent.cancel = true;
  }
}

// when user enters more than 2 decimal places the currency control will round the display, but the
// value gets stored unrounded in the database.  Trap and prevent entry of more than 2 decimal places.
function CurrencyTextChange(oEdit, keyCode,oEvent) {

  var value = trim(oEdit.getNumber() + "");
  
  var ip = value.indexOf(".");
  if (ip > -1) {
    if (value.length > ip + 3) {
      oEdit.setNumber(value.substring(0,ip+3));
//    oEdit.setNumber(Math.round(value * 100)/100);
    }
  }
}

 function gridObject(id) {
      
        this.table  = document.getElementById(id);
        this._selectCountInit = false;
        this._selectedCount = 0;
        this.row = null;
        this._selectedCountChangeEvent = new Array();
           
      }    
      
      gridObject.prototype.onSelectedCountChange = function(exprId) {
        
        this._selectedCountChangeEvent[this._selectedCountChangeEvent.length] = exprId;
      
      }
      
      gridObject.prototype.checkBoxClick = function(element) {
  
        if (element != null) {
          this.row = getContainerElement("TR",element);
          if (this.row != null) {
            this.toggleSelectedRow(element.checked);
            if (element.checked)
              this._selectedCount++;
            else
              this._selectedCount--;
            this.fireSelectedCountChangeEvent();
          }
        }
      }
      
      gridObject.prototype.fireSelectedCountChangeEvent = function() {
      
        for (var i=0; i < this._selectedCountChangeEvent.length; i++) {
          executeExpression(expressions[this._selectedCountChangeEvent[i]])
        }
      }
      
      gridObject.prototype.toggleSelectedRow = function(checked) {

        var sColor = "transparent";
        if (checked) {
          sColor = "Beige";
        //row.style.backgroundColor = "highlight"
        }
        else {
          this.row.style.backgroundColor = "transparent";
        } 
        this.row.style.backgroundColor = sColor;

      }
      
      gridObject.prototype.selectedCount = function() {
      
        if (!this._selectCountInit) {
          this.init();
        }
        return this._selectedCount;
      
      }
      
      gridObject.prototype.init = function() {
      
        this._selectedCount = 0;
        if (this.table != null) {
          this._selectCountInit = true;
          var chks = this.table.getElementsByTagName("input");
          if (chks != null) {
            var id = "Selected";
            for (var i=0;i<chks.length;i++) {
              if (chks[i].type == "checkbox") {
                if (chks[i].id.length >= id.length) {
                  if (chks[i].id.substr(chks[i].id.length-id.length,id.length) == id) {
                    if (chks[i].checked)
                      this._selectedCount++;
                    this.row = getContainerElement("TR",chks[i]);
                    if (this.row != null) {
                      this.toggleSelectedRow(chks[i].checked);
                    }
                  }
                }
              }
            }
          }
        }
      }
      
      var iDIYEventCounter = 0;
      var nDIYEventDebugState = 0;
      var oDIYEventDebugElement = null;
      var LastEventTime;
        // for debugging
        
        function showEvent(eventName, value) {
        
                // get reference to html element that holds output records
          if (nDIYEventDebugState == 0) {
            nDIYEventDebugState = -1;
            oDIYEventDebugElement = getElement("OutputEvents");
            LastEventTime = new Date();
          }
          if (oDIYEventDebugElement == null)
            return;
          else {
            // get old records
//          var str = oDIYEventDebugElement.value;
            var str = oDIYEventDebugElement.innerHTML;
            if(str == null)
                return;
            var split = "<br>";
            if(str.indexOf(split) < 0)
                split = "<BR>";
            var strings = str.split(split);
            var i = -1, length = strings.length;
            // reset string for new value
            str = "";
            // restore last 12 from old records
            if(length > 18)
                i = length - 18;
            while(++i < length)
                str += strings[i] + split;
            // append new string
            str += iDIYEventCounter++ + ". " + eventName + " " + value;
            var eTime = new Date();
            str += " (" + (eTime.getTime() - LastEventTime.getTime())/1000 + ")"
            LastEventTime = eTime;
            // show new string
//          oDIYEventDebugElement.value = str;
            oDIYEventDebugElement.innerHTML = str;
          }
        }

var mbAllowAbandon = false;
//var mbCancelPostBack = false;
var mbFlagData = false;
var m_DataChangeFlagged = false;
var mbValueChange = false;
var msAbandonMessage = "";

function flagDataChanged() {

  if (!m_DataChangeFlagged) {
    m_DataChangeFlagged = true;
    if (typeof(DataChangedFieldId) != "undefined") {
      var elem = document.getElementById(DataChangedFieldId);
      if (elem != null) {
        elem.value = "true";
        fireExpressions(DataChangedFieldId)
      }
    }
  }
}

function clearDataChangedFlag() {

 m_DataChangeFlagged = false;
 if (typeof(DataChangedFieldId) != "undefined") {
    var elem = document.getElementById(DataChangedFieldId);
    if (elem != null) {
      elem.value = ""
    }
  }
}

function dataChanged() {

  if (typeof(DataChangedFieldId) == "undefined")
    return false;
  else {
    var elem = document.getElementById(DataChangedFieldId);
    if (elem != null && elem.value)
      return true;
    else
      return false;
  }
}


function AllowPostBackAndChange(elem) {

//  AllowPostBack(elem);
//  if (!mbCancelPostBack) {
//    flagDataChanged();
//  }
    mbFlagData = true;
    AllowPostBack(elem);

}

function window_beforeUnload(aEvent) {

//if (dataChanged() && !mbAllowAbandon && !mbCancelPostBack) {
  if (parent != null && parent.ClearDropDowns != null)
    parent.ClearDropDowns();
  if (dataChanged() && !mbAllowAbandon) {
    var evt = window.event ? window.event : aEvent;
    var msg = msStandardAbandonMessage;
    if (msAbandonMessage.length > 0) {
      msg = msAbandonMessage;
      msAbandonMessage = "";
    }
    if (window.event)
      event.returnValue = msg;
    else 
      evt.preventDefault();
  }
}

function flagDataAndValueChanged(elem) {

  flagDataChanged();
  valueChanged(elem);
  
}

function AllowPostBackAndValueChange(elem) {

//  AllowPostBack(elem);
//  if (!mbCancelPostBack) {
//    flagDataChanged();
//    valueChanged(elem);
//  }
  
  mbFlagData = true;
  mbValueChange = true;
  AllowPostBack(elem);
}


function getEvent(aEvent) {
  
  var myEvent = null;
  if (window.event)
    myEvent = window.event;
  else {
    if (typeof(aEvent) != "undefined" && aEvent.length && aEvent.length > 0)
      myEvent = aEvent[0];
  }
  return myEvent;
  
}



function InitCancelPostBack() {

//  var tags = document.getElementsByTagName("script");
//  for (var i=0;i<tags.length;i++) {
//    var ip = tags[i].text.indexOf("function __doPostBack");
//    if (ip >0 && tags[i].text.indexOf("sReplaceVar") <0) {
//      var s = tags[i].text;
//      ip = s.indexOf("if (!theForm.onsubmit",ip);
//      s = sReplaceVar(s,ip-1,ip-1," if (!mbCancelPostBack) { ");
//      ip = s.indexOf("}",ip);
//      s = sReplaceVar(s,ip+1,ip+1," } mbCancelPostBack=false; ");
//      tags[i].text = s;
//      break;
//    }
//  }
 
//  showEvent("PostBackEvents",PostBackEvents.length);

  if (typeof(PostBackEvents) != "undefined") {
    for (var c in  PostBackEvents) {
      var elem = document.getElementById(c);
      if (elem != null) {
        for (var x=0;x<elem.attributes.length;x++) {
          if (elem.attributes[x].name == "onclick"  || elem.attributes[x].name == "onchange") {
            var bClick = true;
            var sName = elem.attributes[x].name;
            if (elem.attributes[x].name == "onchange")
              bClick = false;
            if (elem.attributes[x].value != null) {
              var ip = elem.attributes[x].value.lastIndexOf(";");
              if (ip > 0) {
                PostBackEvents[c] = elem.attributes[x].value.substr(ip+1);
                var sEvent = elem.attributes[x].value.substring(0,ip-1);
                if (sEvent.indexOf("AllowPostBackAndChange") >= 0) {
                  if (bClick)
                    elem.onclick = null;
                  else
                    elem.onchange= null;
                  AttachEvent(elem, sName ,AllowPostBackAndChange);
                }
                else if (sEvent.indexOf("AllowPostBack") >= 0) {
                  if (bClick)
                    elem.onclick = null;
                  else
                    elem.onchange= null;
                  AttachEvent(elem,sName ,AllowPostBack);
                }
                if (sEvent.indexOf("valueChanged") >= 0) {
                  AttachEvent(elem,sName ,valueChanged);
                }
              }
            }
          }
        }
      }
    }
  }
}

function AttachEvent(elem, sEventName, fEventHandler) {

  if (navigator.userAgent.indexOf("MSIE") > -1) 
    elem.attachEvent(sEventName,fEventHandler);
  else {
    if (sEventName.indexOf("on") == 0)
      elem.addEventListener(sEventName.substring(2),fEventHandler,false);
    else
      elem.addEventListener(sEventName,fEventHandler,false);
  }

}

function valueChanged_r(elem) {

   if (elem != null && !m_BlockEvents) {
     // set current row in gridview
     m_GridViewTriggerRow = getContainerElement("TR", EventSource(elem));
     valueChanged(elem);
     m_GridViewTriggerRow = null;
   }
}

function valueChanged(elem) {

  if (elem != null && !m_BlockEvents) {
    var id = GetId(elem);
    if  (id != null) {
      changeList = new Array();
      fireExpressions(id);
      cascadeChanges();    
    }
  }
}	

function isIE() {

  if (navigator.userAgent.indexOf("MSIE") > -1) 
    return true;
  else
    return false;
}

function GetId(elem) {

  var id = null;
  elem = getEventSource(elem);
  if (typeof(elem) == "string")
    id = elem;
  else {
    var htmlElem = null;
    if (elem.Element != undefined) {
      id = elem.Element.id;
      htmlElem = elem.Element;
    }
    else if (elem.id != undefined) {
      id = elem.id;
      htmlElem = elem;
    }
    if (id != null && !isIE()) {
      // if firefox and event from checkboxlist or radiobuttonlist, need to trim _x from id
      if (htmlElem.type == "radio" || htmlElem.type == "checkbox") {
        var ip = id.lastIndexOf("_");
        if (ip > 0) {
          var tst = id.substring(0,ip);
          // make sure exists
          var tstElem = getElement(tst);
          if (tstElem != null) {
            // if just radio or checkbox (not list and in formview (i.e. id is FormView1_optxxx) will incorrectly give wrong id
            // if length after _ more than 2, assume not in a list
            if (id.length - ip < 2) 
              id = tst;
          }
        }
      }
    }
  }
  
  return id;
}

//function FormatCurrency(nm, numDec, IncludeSymbol) {

//  nm = nm.toString().replace(/\$|\,/g,'');
//  if(isNaN(nm))
//    nm = "0";
//  sign = (nm == (nm = Math.abs(nm)));
//  nm = Math.floor(nm*100+0.50000000001);
//  cents = nm%100;
//  nm = Math.floor(nm/100).toString();
//  if(cents<10)
//    cents = "0" + cents;
//  for (var i = 0; i < Math.floor((nm.length-(1+i))/3); i++)
//    nm = nm.substring(0,nm.length-(4*i+3))+','+
//  nm.substring(nm.length-(4*i+3));
//  if (IncludeSymbol)
//    return (((sign)?'':'-') + '$' + nm + '.' + cents);
//  else
//    return (((sign)?'':'-') + nm + '.' + cents);
//}

function NumericEdit(element) {
  
  try{
    if (element != null) {
      if (element.readOnly == null || !element.readOnly) {
        var value =  getStandardValue(element);
        setStandardValue(element,StripNumericFormat(value));
        element.select();
      }
    }
  }
  catch(ex){}
}

function FormatControlValue(element, numDec, showCurrencySymbol) {

  try{
    if (element != null) {
      if (element.readOnly == null || !element.readOnly) {
        var value =  getStandardValue(element);
        setStandardValue(element,FormatNumber(value, numDec, showCurrencySymbol));
      }
    }
  }
  catch(ex){}
}

function StripNumericFormat(nm) {

  nm = nm.toString().replace(/\$|\,/g,'');
  return nm;
}

function RemovePageErrors() {

   if (typeof(Page_ValidationSummaries) != "undefined") {
     for (sums = 0; sums < Page_ValidationSummaries.length; sums++) {
       summary = Page_ValidationSummaries[sums];
       summary.style.display = "none";
     }
   }
 }

function AllowPostBack(elem) {

  var bDoPostBack = true;
  mbAllowAbandon = true;
//if (elem != null && !mbCancelPostBack) {
  if (elem != null) {
    var id = GetId(elem);
    if (id != null) {
      var ip = id.indexOf("igtxt");
      if (ip == 0) 
        id = id.substring(5);      
    }
    var prompt = null;
    if (typeof(PostBackPrompts) != "undefined" && PostBackPrompts != null && id != null)
      prompt = PostBackPrompts[id];
    var bSubmit = false;
    var bValid = true
    if (typeof m_Validate != "undefined" && m_Validate != null) {
      var v = m_Validate[id];
      if (v != null) {
        if (typeof(m_ValidGrid) != "undefined")
          m_ValidGrid = ValidateGrid();
        if (typeof Page_IsValid != "undefined") {
          if (!Page_ClientValidate("")) {
            bValid = false;
            // focus
            for (var i = 0; i < Page_Validators.length; i++) {
              if (!Page_Validators[i].isvalid) {
                if (typeof(Page_Validators[i].controltovalidate) != "undefined") {
                  setFocus(Page_Validators[i].controltovalidate);
                  break;
                }
              }
            }
          }
        }
      }
    }
    if (bValid) {
      var bAlwaysPrompt = false;
      if (prompt != null) {
        if (prompt.indexOf("__submit__") == 0) {
          bSubmit = true;
          prompt = prompt.substring(10);
        }
        if (prompt.indexOf("__always__") == 0) {
          bAlwaysPrompt = true;
          prompt = prompt.substring(10);
        }
        if (prompt.indexOf("__function__") == 0) {
          var f = prompt.substring(12);
          prompt = null;
          try{
            bValid = eval(f);
          }
	        catch(ex){
	          window.status = "AllowPostBack: " + ex.message; alert("Failed to execute AllowPostBack: " + ex.message)
	        }
        }
      }
    }
    if (bValid) {
      if (prompt != null) {
        if (bSubmit && (dataChanged() || bAlwaysPrompt)) {
          // link, can't cancel from here so set message for before unload event
          msAbandonMessage = prompt;
          mbAllowAbandon = false;
          bDoPostBack = false;
        }
        else if (dataChanged() || bAlwaysPrompt) {
          if (!confirm(prompt)) {
            mbAllowAbandon = false;
            bDoPostBack = false;
  //          mbCancelPostBack = true;
            
            // restore previous value
            var originalVal = null;
            if (typeof OriginalPostBackValues != "undefined" && OriginalPostBackValues != null)
              originalVal = OriginalPostBackValues[id];
            if (originalVal != null) {
              setValue(id,originalVal);
            }
          }
        }

      }
      if (bDoPostBack && mbFlagData) {
        flagDataChanged();
        if (mbValueChange)
          valueChanged(id)
      }
      mbFlagData = false;
      mbValueChange = false;
      if (bDoPostBack && typeof(PostBackEvents) != "undefined") {
        var evt = PostBackEvents[id];
        if (evt != undefined && evt != null) {
          if (!m_PostBackInProcess)
            eval(evt);
          // postback in evt may fail if any validation fails, don't set inprocess flag
          if (typeof Page_IsValid == "undefined" || Page_IsValid)            
            m_PostBackInProcess = true;
        }
      }       
    }
    else
      mbAllowAbandon = false;;
  }
}

function diy_cancelEvent(e) {

	if(e == null) if((e = window.event) == null) return;
	if(e.stopPropagation != null) e.stopPropagation();
	if(e.preventDefault != null) e.preventDefault();
	e.cancelBubble = true;
	e.returnValue = false;
}

function getEventSource(e) {

	if(e == null) if((e = window.event) == null) return e;
	if(e.target != null) return e.target;
	if(e.srcElement != null) return e.srcElement;
	return e;
}

function SendEmailDialog(useClient, toAddress, subject, body, BaseTable, EntityId) {

  if (useClient) {
    var url = "mailto:";
    if (!Blank(toAddress))
      url += toAddress;
    else
      url +="";
    var parms = false;
    if (!Blank(subject)) {
      url += "?subject=" + subject;
      parms = true;
    }
    if (!Blank(body)) {
      if (parms)
        url += "&body=" + body;
      else
        url += "?body=" + body;
    }
    NavigateTo(url);
  }
  else {
//  var  url = "DialogFrame.aspx?URL=Email.aspx&To=" + toAddress; 
    var  url = "Email.aspx?To=" + toAddress; 
    if (!Blank(subject)) {
      url += "?subject=" + subject;
    }
    if (!Blank(body)) {
      url += "&body=" + body;
    }
    if (!Blank(BaseTable)) {
      url += "&BaseTable=" + BaseTable;
    }
    if (num(EntityId) != 0) {
      url += "&EntityId=" + EntityId;
    }
    return loadDialogPage(url,null);
  }
  
}

function NavigateTo(url) {

  window.location.href = url;
   
}

function navigateUrl(targetUrl, targetFrame)	{

  // infragistics code
  if(targetUrl == null || targetUrl.length == 0)
		return;
	var newUrl=targetUrl.toLowerCase();
	if(newUrl.indexOf("javascript:") == 0)
		eval(targetUrl);
	else {
	  var ip = targetUrl.indexOf("~/");
	  if (ip == 0)
	    targetUrl = targetUrl.substring(2);
	  if(targetFrame != null && targetFrame!="")	{
  	  if(getElement(targetFrame) != null) 
			  getElement(targetFrame).src = targetUrl;
  		else {
	  		var oFrame = searchFrames(top, targetFrame);
		  	if(oFrame != null)
			  	oFrame.location=targetUrl;
  			else if(targetFrame == "_self" 
				        || targetFrame == "_parent"
				        || targetFrame == "_media"
				        || targetFrame == "_top"
				        || targetFrame == "_blank"
				        || targetFrame == "_search")
				  window.open(targetUrl, targetFrame);
			  else
				  window.open(targetUrl);
		  }
  	}
	  else {
		  try {
			  location.href = targetUrl;
		  }
		  catch (x) {
		  }
		}
	}
}
	
function searchFrames(frame, targetFrame) {
  // infragistics
	if(frame.frames[targetFrame] != null)
		return frame.frames[targetFrame];
	var i;
	for(i=0; i<frame.frames.length; i++) {
		var subFrame = searchFrames(frame.frames[i], targetFrame);
		f(subFrame != null)
		return subFrame; 
  }
	return null;
}
function ContactTypeChange(aEvent) {

  var evt = getEvent(aEvent)
  if (evt != null && evt.srcElement != null && evt.srcElement.id != null) {
    var ip1 = evt.srcElement.id.indexOf("ContactType");
    var ip2 = evt.srcElement.id.indexOf("DropDownList");
    if (ip1 > -1 && ip2 > ip1) {
      var name = "";
      if (ip1 == 0)
        name = "ContactInfo";
      else
        name = evt.srcElement.id.substring(0,ip1) + "ContactInfo";
      name = name + evt.srcElement.id.substring(ip1+11,ip2) + "TextBox";
      var oTextBox = igedit_getById(name);
      if (oTextBox != null) {
        var mask = "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC";
        switch (evt.srcElement.value) {
          case "1" : // Home
          case "3" : // Mobile
          case "4" : // Fax
          case "5" : // Pager
            mask = "(###) ###-####";
            break;
          case "2" : // Work
            mask = "(###) ###-#### Ext. 99999";
            break;
        }
        oTextBox.setInputMask(mask);
      }
    }
  }
}

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();


function EventSource(aEvent) {

  var oEvent = window.event ? window.event : aEvent;
  if (navigator.userAgent.indexOf("MSIE") > -1) 
    return oEvent.srcElement;
  else
    return oEvent.target;

}

function ElementPosition(elem, stopTag) {

  this.LastElement = null;
  this.Top = 0;
  this.Left = 0;
  this.TopLevelWidth = 0;
  this.TopLevelHeight = 0;
  this.zIndex = 0;
  if (elem != null) {
    this.Top = elem.offsetTop;
    this.Left = elem.offsetLeft;
    var nextElem = elem.offsetParent;
    while (nextElem != null && (stopTag == null || nextElem.tagName != stopTag)) {
      this.LastElement = nextElem;
      if(nextElem.offsetLeft != null) this.Left += nextElem.offsetLeft;
		  if(nextElem.offsetTop != null) {
        if (nextElem.tagName == "DIV" && nextElem.scrollTop > 0) {
	  	    // in a scrolling DIV, adjust
		      this.Top -= nextElem.scrollTop
	      }
        this.Top += nextElem.offsetTop;
		  }
		  if (nextElem.style != null && nextElem.style.zIndex != null && nextElem.style.zIndex > this.zIndex)
		    this.zIndex = nextElem.style.zIndex;
		  this.TopLevelHeight = nextElem.offsetTop + nextElem.offsetHeight;
      this.TopLevelWidth = nextElem.offsetWidth;
      nextElem = nextElem.offsetParent;
    }
  }
}

function Date_ClientValidate(source, args) {

  if (!Blank(args.Value)) {
    if (!IsValidDate(args.Value)) {
      args.IsValid = false;
    }
  }
}

function GetDateFromString(sDate) {

  var dt = new Date(Date.parse(sDate));
  if (dt == "NaN" && typeof(sDate) == "string" && sDate.indexOf("-") > 0) {
    var ip = sDate.indexOf("-");
    if (ip > 0 && ip < sDate.length-1) {
      var ip2 = sDate.indexOf("-",ip+1);
      var sNew = sDate.substr(ip+1,ip2-ip-1) + "/" + sDate.substring(ip2+1) + "/" + sDate.substr(0,ip);
      dt = new Date(Date.parse(sNew));
    }
  }
  
  return dt;
}

function IsValidDate(sDate) {

  var valid = false;
  var dt = GetDateFromString(sDate);
  if (dt != null && dt.getFullYear() > 1900 && dt.getFullYear() < 2100)
    valid = true;
  
  return valid;

}

function dateAdd(p_Interval, p_Number, p_Date) {

  if(!IsValidDate(p_Date)){return "invalid date: '" + p_Date + "'";}
//  if(isNaN(p_Number)){return "invalid number: '" + p_Number + "'";} 

  p_Number = new Number(p_Number);
  var dt = new Date(p_Date);
  switch(p_Interval.toLowerCase()){
    case "yyyy": {// year
      dt.setFullYear(dt.getFullYear() + p_Number);
      break;
    }
    case "q": { // quarter
      dt.setMonth(dt.getMonth() + (p_Number*3));
      break;
    }
    case "m": { // month
      dt.setMonth(dt.getMonth() + p_Number);
      break;
    }
    case "y": // day of year
    case "d": // day
    case "w": { // weekday
      dt.setDate(dt.getDate() + p_Number);
      break;
    }
    case "ww": { // week of year
      dt.setDate(dt.getDate() + (p_Number*7));
      break;
    }
    case "h": { // hour
      dt.setHours(dt.getHours() + p_Number);
      break;
    }
    case "n": { // minute
      dt.setMinutes(dt.getMinutes() + p_Number);
      break;
    }
    case "s": { // second
      dt.setSeconds(dt.getSeconds() + p_Number);
      break;
    }
    case "ms": { // second
      dt.setMilliseconds(dt.getMilliseconds() + p_Number);
      break;
    }
    default: {
  
    }
  }
  return dt.localeFormat("d");
}

