function validateForm(customValidationFunction, validationGroup) {
  var theForm = document.forms[0];
  var errorMsg = "";
  
  for (var i = 0; i < theForm.elements.length; i++) {
    if (validationGroup == "" || theForm.elements[i].ValidationGroup == validationGroup) {
      var element = theForm.elements[i];
      
      if (Boolean(element.Required) && element.value == "") {
        errorMsg += " - " + element.ValidationName + " is a required field.\n";
        eval(element.ValidationFailedJS);
        element.ValidationFailed = true;
      }
      
      if (Boolean(element.Required) && Boolean(element.DBSearchableTextBox) && !element.PrimaryKey) {
        errorMsg += " - " + element.ValidationName + " is a required field.\n";
        eval(element.ValidationFailedJS);
        element.ValidationFailed = true;
      }
      
      var integerRegExp = /^\d+$/;
      
      if (Boolean(element.Integer) && element.value != "" && integerRegExp.test(element.value) == false) {
        errorMsg += " - " + element.ValidationName + " must be an integer.\n";
        eval(element.ValidationFailedJS);
        element.ValidationFailed = true;
      }
      
      if (element.Double > 0 && element.value != "") {
				if (isNaN(element.value)) {
					errorMsg += " - " + element.ValidationName + " must be numeric.\n";
					eval(element.ValidationFailedJS);
					element.ValidationFailed = true;
				} else {
					var regExp1String = "new RegExp(/^[-]?[\\d]{0," + element.Double + "}\\.[\\d]{0,}$/)";
					var regExp2String = "new RegExp(/^[-]?[\\d]{0," + element.Double + "}$/)";
					
					var re1 = eval(regExp1String);
					var re2 = eval(regExp2String);
					
					if (!element.value.match(re1) && !element.value.match(re2)) {
						errorMsg += " - " + element.ValidationName + " is out of range.\n";
						eval(element.ValidationFailedJS);
						element.ValidationFailed = true;
					}
				}
			}
    }
  }
  
  var spans = document.getElementsByTagName("span");
  
  for (var i = 0; i < spans.length; i++) {
    if (spans[i].ValidationGroup == validationGroup && Boolean(spans[i].Required) && (spans[i].innerHTML == "" || spans[i].innerHTML == "&nbsp;")) {
      errorMsg += " - " + spans[i].ValidationName + " is a required field.\n";
      eval(spans[i].ValidationFailedJS);
    }
  }
  
  if (customValidationFunction != "" && customValidationFunction != undefined) {
    eval("errorMsg += " + customValidationFunction + "();");
  }
  
  if (errorMsg != "") {
    alert("Error:\n" + errorMsg);
    return false;
  } else {
    return true;
  }
}

function enableAllButtons() {
  var theForm = document.forms[0];
  
  for(var i = 0; i < theForm.elements.length; i++) {
    var tagName = theForm.elements[i].tagName.toUpperCase();
    
    if (theForm.elements[i].type) {
      var elementType = theForm.elements[i].type.toUpperCase();
    }
    
    if (tagName == 'INPUT' && elementType == 'BUTTON') {
      theForm.elements[i].className = "button";
      theForm.elements[i].disabled = false;
    }
  }
}

function disableAllButtons() {
  var theForm = document.forms[0];
  
  for(var i = 0; i < theForm.elements.length; i++) {
    var tagName = theForm.elements[i].tagName.toUpperCase();
    
    if (theForm.elements[i].type) {
      var elementType = theForm.elements[i].type.toUpperCase();
    }
    
    if (tagName == 'INPUT' && elementType == 'BUTTON') {
      theForm.elements[i].className = "disabledButton";
      theForm.elements[i].disabled = true;
    }
  }
}

function hideTab(tabName) {
  $(tabName).style.display = 'none';
  $(tabName + 'Divider').style.display = 'none';
  $(tabName + 'Content').style.display = 'none';
}

//Use this function to commit a text value set programatically, ensures OnChange event will fire properly.
function commitTextValue(target) {
  setTimeout("__reallySetValue('" + target.id + "');", 1);
}

//Don't call this function directly.
function __reallySetValue(id) {
  var control = $(id);
  control.value = control.value;
}

var lookupWindow;

function lookup(lookupScreenName, callBackFunction, extraCustomSQL, lookupButtonID, autoSearch) {
	if (extraCustomSQL == undefined) {
		extraCustomSQL = "";
	}
	
	if (lookupButtonID != undefined && lookupButtonID != '' && $(lookupButtonID).ExtraCustomSQL != undefined) {
		extraCustomSQL += " " + $(lookupButtonID).ExtraCustomSQL;
	}
  
  try {
    if (this.existingLookupWindow) {
      lookupWindow = this.existingLookupWindow;
      lookupWindow.opener = window;
          
      if (lookupWindow.location.pathname != "/Lookups/" + lookupScreenName + ".aspx") {
        lookupWindow.location = "../Lookups/" + lookupScreenName + ".aspx?callBackFunction=" + callBackFunction + "&extraCustomSQL=" + extraCustomSQL + "&lookupButtonID=" + lookupButtonID + "&autoSearch=" + autoSearch;
      }
    }
    
    if (!lookupWindow || lookupWindow.closed) {
      lookupWindow = window.open("../Lookups/" + lookupScreenName + ".aspx?callBackFunction=" + callBackFunction + "&extraCustomSQL=" + extraCustomSQL + "&lookupButtonID=" + lookupButtonID + "&autoSearch=" + autoSearch, "Lookup", "height=600,width=800,directories=no,location=no,menubar=no,resizable=yes,scrollbars=no,status=no,titlebar=no,toolbar=no");
      lookupWindow.opener = window;
      this.existingLookupWindow = lookupWindow;
    }
	} catch (e) {
	  lookupWindow = window.open("../Lookups/" + lookupScreenName + ".aspx?callBackFunction=" + callBackFunction + "&extraCustomSQL=" + extraCustomSQL + "&lookupButtonID=" + lookupButtonID + "&autoSearch=" + autoSearch, "Lookup", "height=600,width=800,directories=no,location=no,menubar=no,resizable=yes,scrollbars=no,status=no,titlebar=no,toolbar=no");
    lookupWindow.opener = window;
    this.existingLookupWindow = lookupWindow;
	}
	
	lookupWindow.focus();
}

function lookupReport(lookupScreenName, extraCustomSQL, defaultSQL, autoSearch) {
	if (extraCustomSQL == undefined) {
		extraCustomSQL = "";
	}
	
	if (defaultSQL == undefined) {
		defaultSQL = "";
	}
  
  try {
    if (this.existingLookupWindow) {
      lookupWindow = this.existingLookupWindow;
      lookupWindow.opener = window;
      
      var queryString = lookupWindow.location.href.substr(lookupWindow.location.href.indexOf("?"), lookupWindow.location.href.length);
      
      if (lookupWindow.location.pathname + queryString != "/Lookups/" + lookupScreenName + ".aspx?extraCustomSQL=" + extraCustomSQL + "&defaultSQL=" + defaultSQL + "&autoSearch=" + autoSearch) {
        lookupWindow.location = "../Lookups/" + lookupScreenName + ".aspx?extraCustomSQL=" + extraCustomSQL + "&defaultSQL=" + defaultSQL + "&autoSearch=" + autoSearch;
      }
    }
    
    if (!lookupWindow || lookupWindow.closed) {
      lookupWindow = window.open("../Lookups/" + lookupScreenName + ".aspx?extraCustomSQL=" + extraCustomSQL + "&defaultSQL=" + defaultSQL + "&autoSearch=" + autoSearch, "Lookup", "height=600,width=800,directories=no,location=no,menubar=no,resizable=yes,scrollbars=no,status=no,titlebar=no,toolbar=no");
      lookupWindow.opener = window;
      this.existingLookupWindow = lookupWindow;
    }
	} catch (e) {
	  lookupWindow = window.open("../Lookups/" + lookupScreenName + ".aspx?extraCustomSQL=" + extraCustomSQL + "&defaultSQL=" + defaultSQL + "&autoSearch=" + autoSearch, "Lookup", "height=600,width=800,directories=no,location=no,menubar=no,resizable=yes,scrollbars=no,status=no,titlebar=no,toolbar=no");
    lookupWindow.opener = window;
    this.existingLookupWindow = lookupWindow;
	}
	
	lookupWindow.focus();
}

var resizeTabContentHeightForIE7Timer;

function __schedualeResizeTabContentHeightForIE7() {
  clearTimeout(resizeTabContentHeightForIE7Timer);
  resizeTabContentHeightForIE7Timer = setTimeout(__resizeTabContentHeightForIE7, 20);
}

function __resizeTabContentHeightForIE7() {
  var pageDivs = document.getElementsByTagName("div");
  
  for (var i = 0; i < pageDivs.length; i++) {
    if (pageDivs[i].className == "tabContent") {
      pageDivs[i].style.height = (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight) - 75;
    }
  }
}

var viewReportWindow;

function viewReport(reportName) {
  try {
    if (this.existingReportWindow) {
      viewReportWindow = this.existingReportWindow;
      viewReportWindow.opener = window;
      
      var queryString = viewReportWindow.location.href.substr(viewReportWindow.location.href.indexOf("?"), viewReportWindow.location.href.length);
      
      if (viewReportWindow.location.pathname + queryString != "/Pages/ViewReport.aspx?reportName=" + reportName) {
        viewReportWindow = window.open("../Pages/ViewReport.aspx?reportName=" + reportName, "ViewReport", "height=600,width=800,directories=no,location=no,menubar=no,resizable=yes,scrollbars=no,status=no,titlebar=no,toolbar=no");
        viewReportWindow.opener = window;
        this.existingReportWindow = viewReportWindow;
      }
    }
    
    if (!viewReportWindow || viewReportWindow.closed) {
      viewReportWindow = window.open("../Pages/ViewReport.aspx?reportName=" + reportName, "ViewReport", "height=600,width=800,directories=no,location=no,menubar=no,resizable=yes,scrollbars=no,status=no,titlebar=no,toolbar=no");
      viewReportWindow.opener = window;
      this.existingReportWindow = viewReportWindow;
    }
	} catch (e) {
	  viewReportWindow = window.open("../Pages/ViewReport.aspx?reportName=" + reportName, "ViewReport", "height=600,width=800,directories=no,location=no,menubar=no,resizable=yes,scrollbars=no,status=no,titlebar=no,toolbar=no");
    viewReportWindow.opener = window;
    this.existingReportWindow = viewReportWindow;
	}
	
	viewReportWindow.focus();
}

function populateCheckBoxListBox(checkBoxName, checkBoxListBoxDivID) {
  var checkBoxes = document.forms[0].elements[checkBoxName];
  var checkBoxListBoxDiv = $(checkBoxListBoxDivID);
  checkBoxListBoxDiv.innerText = "";
  var comma = "";
  var checkBoxListBoxText = "";

  for (var i = 0; i < checkBoxes.length; i++) {
    if (checkBoxes[i].checked) {
      checkBoxListBoxText += comma + checkBoxes[i].ValidationName;
      comma = ", ";
    }
  }
  
  if (!checkBoxes.length && document.forms[0][checkBoxName].checked) {
    checkBoxListBoxText = document.forms[0][checkBoxName].ValidationName;
  }
  
  checkBoxListBoxDiv.innerText = checkBoxListBoxText;
  checkBoxListBoxDiv.title = checkBoxListBoxText;
}

function parseToJS(input) {
  var output = input;
  
  output.replace("'", "\\'");
  output.replace('"', '\\"');
  output.replace("\r", "");
  output.replace("\n", "\\n");
  
  return output;
}

function plusMinusClick(img, containerID) {
  if (img.src.indexOf("/images/plusNoPadding.gif") == -1) {
    img.src = "/images/plusNoPadding.gif";
    $(containerID).style.display = "none";
  } else {
    img.src = "/images/minusNoPadding.gif";
    $(containerID).style.display = "block";
  }
}



//BEGIN: Freeze Grid Header.
var gridDiv;
var newDiv;
var resizeGridWidthsTimer;
var userAgent = navigator.userAgent.toLowerCase();

function freezeGridHeader(gridDivName) {
  gridDiv = $(gridDivName);
  
  if (gridDiv && gridDiv.clientHeight > 0) {
    var grid = gridDiv.getElementsByTagName("table")[0];
    
    if (grid.className == "grid" || grid.className == "lookupGrid") {
      if (grid.rows.length > 1) {
        newDiv = document.createElement('div');
        newDiv.className = "frozenGridHeader";
        newDiv.style.width = gridDiv.clientWidth + 18;
        newDiv.style.borderTop = "solid 1px #000";
        newDiv.style.borderBottom = "solid 1px #000";

        var newTable = grid.cloneNode(false);
        newTable.cellspacing = 0;
        newTable.cellpadding = 0;
        newTable.id = "Header" + grid.id;
        newTable.style.borderLeft = "solid 1px";

        var tableBody = grid.tBodies(0).cloneNode(false);
        var headerRow = grid.rows[0].cloneNode(true);
    		
  		  var endCell = grid.rows[0].cells[0].cloneNode(false);
  		  endCell.style.borderRight = "0px";
        headerRow.appendChild(endCell);
    		
        tableBody.appendChild(headerRow);
        newTable.appendChild(tableBody);
        newDiv.appendChild(newTable);
	      
        grid.style.width = grid.clientWidth;
        newTable.style.width = grid.clientWidth + 19;
	      
        if (window.attachEvent) {
          window.attachEvent("onresize", __schedualeResizeGridWidths);
        }
    		
	      gridDiv.parentElement.insertBefore(newDiv, gridDiv);
    		
	      for (var i = 0; i < newTable.rows[0].cells.length; i++) {
          if (i < newTable.rows[0].cells.length - 1) {
            newTable.rows[0].cells[i].style.width = grid.rows[0].cells[i].clientWidth - 8;
            grid.rows[1].cells[i].style.width = grid.rows[0].cells[i].clientWidth - 8;
          }
          
          newTable.rows[0].cells[i].style.borderTop = "0px";
          newTable.rows[0].cells[i].style.borderBottom = "0px";
        }
        
        grid.deleteRow(0);
        
        if (((userAgent.indexOf("msie") != -1) && (userAgent.indexOf("opera") == -1)) && (parseInt(navigator.appVersion) == 4) && (userAgent.indexOf("msie 6.")!=-1)) {
          gridDiv.style.width = (document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth) - 46 + "px";
          newDiv.style.width = gridDiv.clientWidth + 18;
        }
        
        setInterval(__syncHorizontalScroll, 250);
      }
    } else {
      gridDiv.style.display = "none";
    }
  }
}

function __schedualeResizeGridWidths() {
  clearTimeout(resizeGridWidthsTimer);
  resizeGridWidthsTimer = setTimeout(__resizeGridWidths, 20);
}

function __resizeGridWidths() {
  if (((userAgent.indexOf("msie") != -1) && (userAgent.indexOf("opera") == -1)) && (parseInt(navigator.appVersion) == 4) && (userAgent.indexOf("msie 6.")!=-1)) {
    gridDiv.style.width = (document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.clientWidth) - 46 + "px";
  }
  
  newDiv.style.width = gridDiv.clientWidth + 18;
}

function __syncHorizontalScroll() {
  newDiv.scrollLeft = gridDiv.scrollLeft;
}
//END: Freeze Grid Header.


//BEGIN: Disable F keys & backpsace = back button.
function disableAnnoyingKeys() {
  document.onkeydown = keyhandler;

  /*if (typeof window.event == 'undefined') {
    document.onkeypress = function(e) {
      var test_var = e.target.nodeName.toUpperCase();
      
      if (e.target.type) var test_type = e.target.type.toUpperCase();
      
      if ((test_var == 'INPUT' && (test_type == 'TEXT' || test_type == 'PASSWORD') && event.srcElement.className == 'textBox') || test_var == 'TEXTAREA') {
        return e.keyCode;
      } else if (e.keyCode == 8) {
        e.preventDefault();
      }
    }
  }*/

  document.onhelp = function() {
    event.returnValue = false;
    return false;
  }
}

function keyhandler(e) {
  var sourceElement = event.srcElement;
  var tagName = sourceElement.tagName.toUpperCase();
    
  if (sourceElement.type) {
    var elementType = sourceElement.type.toUpperCase();
  }

  if (window.event && window.event.keyCode > 111 && window.event.keyCode < 124) {
    switch (window.event.keyCode) {
      case 112: window.event.keyCode = 501; break;
      case 113: window.event.keyCode = 502; break;
      case 114: window.event.keyCode = 503; break;
      case 115: window.event.keyCode = 504; break;
      case 116: window.event.keyCode = 505; break;
      case 117: window.event.keyCode = 506; break;
      case 118: window.event.keyCode = 507; break;
      case 119: window.event.keyCode = 508; break;
      case 120: window.event.keyCode = 509; break;
      case 121: window.event.keyCode = 510; break;
      case 122: window.event.keyCode = 511; break;
      case 123: window.event.keyCode = 512; break;
      default: break;
    }

    switch (window.event.keyCode) {
      case 501: /*alert('F1 key was pressed');*/ break;
      case 502: /*alert('F2 key was pressed');*/ break;
      case 503: /*alert('F3 key was pressed');*/ break;
      case 504: /*alert('F4 key was pressed');*/ break;
      case 505: /*alert('F5 key was pressed');*/ break;
      case 506: /*alert('F6 key was pressed');*/ break;
      case 507: /*alert('F7 key was pressed');*/ break;
      case 508: /*alert('F8 key was pressed');*/ break;
      case 509: /*alert('F9 key was pressed');*/ break;
      case 510: /*alert('F10 key was pressed');*/ break;
      case 511: /*alert('F11 key was pressed');*/ break;
      case 512: /*alert('F12 key was pressed');*/ break;
      default: break;
    }

    return false;
  } else {
    if ((tagName == 'INPUT' && (elementType == 'TEXT' || elementType == 'PASSWORD' || elementType == 'FILE') && (sourceElement.className == 'textBox' || sourceElement.className == 'disabledTextBox' || sourceElement.className == 'disabledDateBox' || sourceElement.className == 'file')) || tagName == 'TEXTAREA') {
      if (sourceElement.ResetValidationJS != "") {
        eval(sourceElement.ResetValidationJS);
      }
      
      if (sourceElement.readOnly) {
        event.returnValue = false;
      } else {
        return event.keyCode;
      }
    } else if (event.keyCode == 8 && tagName != 'INPUT') {
      event.returnValue = false;
    }
  }
}
//END: Disable F keys & backpsace = back button.