var PRODUCTS = new Array("Genesis", "Metadata", "MetaKLA", "Bitmap Classifier", "FLEXTRACT", "GenealogyBase", "Yield Base", "enTune");

var CURRENT_FEATURE = null;

var FIELD_DELIMITER = "::";

var DAYS_UNTIL_COOKIE_EXPIRATION = 365;

var COOKIE_FIELD_DELIMITER = "-";

function changeModule(element){
  var moduleName = getValueOfSelect(element);
  var productName = getValueOfSelect(document.getElementById('products'));
  var elementName = 'feature_'+getProductMappedName(productName)+"_"+moduleName;
  var newFeatureElement = document.getElementById(elementName);
  hideCurrentFeature();
  newFeatureElement.style.display='';
  CURRENT_FEATURE = newFeatureElement;
}

function changeProduct(element){
  var productName = getValueOfSelect(element);

  //Change Version
  var newVersionElement = document.getElementById('version_'+getProductMappedName(productName));
  hideCurrentVersion();
  newVersionElement.style.display = '';

  //Change OS
  var newOSElement = document.getElementById('os_'+getProductMappedName(productName));
  hideCurrentOS();
  newOSElement.style.display = '';

  //Change Module
  var newModuleElement = document.getElementById('module_'+getProductMappedName(productName));
  hideCurrentModule();
  newModuleElement.style.display = '';

  newModuleSelect = document.getElementById("module_select_"+getProductMappedName(productName));

  changeModule(newModuleSelect);
}

function hideCurrentModule(){
  try{
    var element = getCurrentShowingModule();
    element.style.display='none';
  }catch(e){}
}

function getCurrentShowingModule(){
  for(i=0; i<PRODUCTS.length; i++){
    var element = document.getElementById('module_'+getProductMappedName(PRODUCTS[i]));
    if(element.style.display == '') return element;
  }
  return null;
}

function hideCurrentOS(){
  try{
    var element = getCurrentShowingOS();
    element.style.display='none';
  }catch(e){}
}

function getCurrentShowingOS(){
  for(i=0; i<PRODUCTS.length; i++){
    var element = document.getElementById('os_'+getProductMappedName(PRODUCTS[i]));
    if(element.style.display == '') return element;
  }
  return null;
}

function hideCurrentVersion(){
  try{
    var element = getCurrentShowingVersion();
    element.style.display='none';
  }catch(e){}
}

function getCurrentShowingVersion(){
  for(i=0; i<PRODUCTS.length; i++){
    var element = document.getElementById('version_'+getProductMappedName(PRODUCTS[i]));
    if(element.style.display == '') return element;
  }
  return null;
}

function hideCurrentFeature(){
  if(CURRENT_FEATURE != null){
    CURRENT_FEATURE.style.display='none';
    CURRENT_FEATURE=null;
  }
  else{
    try{
      var element = getCurrentShowingFeature();
      element.style.display='none';
    }catch(e){}
  }
}

function getCurrentShowingFeature(){
  elements = document.getElementsByTagName("div");

  for(var i=0; i<elements.length; i++){
    var element = elements[i];
    try{
      var elementName = element.id;

      if(elementName.indexOf("feature_") == 0 && element.style.display == '') {
        return element;
      }
    }catch(e){}
  }

  return null;
}

function getValueOfSelect(element){
  try{
    return element.options[element.selectedIndex].value;
  }
  catch(e){ return ""; }
}

function getProductMappedName(name){
  if(name == "Genesis") return "genesis";
  if(name == "Metadata") return "metadata";
  if(name == "MetaKLA") return "metaKLA";
  if(name == "Bitmap Classifier") return "bitmap";
  if(name == "FLEXTRACT") return "flextract";
  if(name == "Yield Base") return "yieldbase";
  if(name == "GenealogyBase") return "genealogybase";
  if(name == "enTune") return "entune";
  return "";
}

function getValueFromCurrentShowingElement(element){
  var html = element.innerHTML;
  var index = html.indexOf("<select");
  html = html.substring(index, html.length);
  index = html.indexOf("name=");
  html = html.substring(index+5, html.length);
  index = html.indexOf(">");
  if(document.all){ html = html.substring(0, index); }
  else { html = html.substring(1, index-1); }

  var selectElement = document.getElementById(html);
  return getValueOfSelect(selectElement);
}

function updateCQFields(){
  document.getElementById('CQ_FIELD_version').value = getValueFromCurrentShowingElement(getCurrentShowingVersion());
  document.getElementById('CQ_FIELD_os').value = getValueFromCurrentShowingElement(getCurrentShowingOS());
  document.getElementById('CQ_FIELD_product').value = getValueOfSelect(document.getElementById('products'));
  document.getElementById('CQ_FIELD_module').value = getValueFromCurrentShowingElement(getCurrentShowingModule());
  document.getElementById('CQ_FIELD_feature').value = getValueFromCurrentShowingElement(getCurrentShowingFeature());
  document.getElementById('CQ_FIELD_priority').value = getValueOfSelect(document.getElementById('priority'));

  document.getElementById('CQ_FIELD_submitter').value = document.getElementById('CQ_FIELD_submitterInput').value;
  document.getElementById('CQ_FIELD_phone').value = document.getElementById('CQ_FIELD_phoneInput').value;
  document.getElementById('CQ_FIELD_eMail').value = document.getElementById('CQ_FIELD_eMailInput').value;
  document.getElementById('CQ_FIELD_headline').value = document.getElementById('CQ_FIELD_headlineInput').value;

  try { document.getElementById('CQ_FIELD_testFileNames').value = document.getElementById('CQ_FIELD_testFileNamesInput').value; }
  catch(e){}
  try { document.getElementById('CQ_FIELD_stepsToReproduce').value = document.getElementById('CQ_FIELD_stepsToReproduceInput').value; }
  catch(e){}
  try { document.getElementById('CQ_FIELD_actualResults').value = document.getElementById('CQ_FIELD_actualResultsInput').value; }
  catch(e){}
  try { document.getElementById('CQ_FIELD_expectedResults').value = document.getElementById('CQ_FIELD_expectedResultsInput').value; }
  catch(e){}
  try { document.getElementById('CQ_FIELD_comments').value = document.getElementById('CQ_FIELD_commentsInput').value; }
  catch(e){}
  try { document.getElementById('CQ_FIELD_description').value = document.getElementById('CQ_FIELD_descriptionInput').value; }
  catch(e){}

}

var PAGE_SUBMITTED = false;

function disableSubmitButton(){
  var elements = document.forms[0].elements;
  for(var i=0; i<elements.length; i++){
    var elementType = elements[i].type.toLowerCase();

    //Form elements not to disable
    if(elementType == "hidden"){} //hidden fields
    else if(elementType == "button" && elements[i].value.toLowerCase() == "help"){} //help button
    else { elements[i].disabled=true; }
  }
}

function submitPage(){
  if(PAGE_SUBMITTED) return;
  if(!confirm("Are you sure you want to submit this request?")) return;
  updateCQFields();
  if(validateCQFields()){
    PAGE_SUBMITTED = true;
    closeSymptomWindow();
    disableSubmitButton();
    showPageLoading(0);
    document['cqForm'].submit();
  }
}

function submitReportPage(){
  if(PAGE_SUBMITTED) return;

  PAGE_SUBMITTED = true;
  try{resetReportMode();}
  catch(e){}
  closeSymptomWindow();
  disableSubmitButton();
  showPageLoading(0);
  document['cqForm'].submit();
}

function submitGenerateReport(){ submitAndGenerateReport(true); }

function submitAndGenerateReport(validate){
  if(validate && !validateReportFilter()) return;
  if(PAGE_SUBMITTED) return;

  if(validate) setCookieReportInfo();

  PAGE_SUBMITTED = true;
  try{setGenerateReportMode();}
  catch(e){}
  closeSymptomWindow();
  disableSubmitButton();
  showPageLoading(0);
  document['cqForm'].submit();
}

function exportReport(){
  document.getElementById('CQ_MODE').value='EXPORT';
  var f = document['cqForm'];
  f.action = "/ClearQuest/Report.csv";
  f.submit();
  //setTimeout('resetReportMode()', 500);
}

function resetReportMode(){ document.getElementById('CQ_MODE').value='SETUP'; }
function setGenerateReportMode(){ document.getElementById('CQ_MODE').value='REPORT'; }

function submitToProblem(){
  if(PAGE_SUBMITTED) return;

  PAGE_SUBMITTED = true;
  var f = document['cqForm'];
  f.action = "/cgi-bin/CQ_Submit.pl";
  closeSymptomWindow();
  disableSubmitButton();
  showPageLoading(0);
  f.submit();
}

function submitToEnhancement(){
  if(PAGE_SUBMITTED) return;

  PAGE_SUBMITTED = true;
  var f = document['cqForm'];
  f.action = "/cgi-bin/CQ_Enhancement.pl";
  closeSymptomWindow();
  disableSubmitButton();
  showPageLoading(0);
  f.submit();
}

function submitToReport(){
  if(PAGE_SUBMITTED) return;

  PAGE_SUBMITTED = true;
  try{resetReportMode();}
  catch(e){}
  var f = document['cqForm'];
  f.action = "/cgi-bin/CQ_Report.pl";
  closeSymptomWindow();
  disableSubmitButton();
  showPageLoading(0);
  f.submit();
}

function logout(){
  if(PAGE_SUBMITTED) return;

  PAGE_SUBMITTED = true;
  document.getElementById('CQ_FIELD_userName').value = "";
  document.getElementById('CQ_FIELD_password').value = "";
  closeSymptomWindow();
  disableSubmitButton();
  document['cqForm'].action = "/cgi-bin/CQ_Submit.pl";
  showPageLoading(0);
  document['cqForm'].submit();
}

function validateEMail(eMail){
  if(eMail == ""){
    alert("Please enter your E-mail address.");
    return false;
  }

  var invalidValues = new Array(',', ':', ';', '!', '\'', '<', '>', '?', '\"', '/', '[', '{', ']', '}', '|', '=', '+', ')', '(', '*', '&', '^', '%', '$', '#', '~', '`');
  for(var i=0; i<invalidValues.length; i++){
    var invalidChar = invalidValues[i];
    if(eMail.indexOf(invalidChar) != -1){
      alert("E-mail address contains invalid character '"+invalidChar+"'.");
      return false;
    }
  }

  var countOfAtSymbol = 0;
  for(var i=0; i<eMail.length; i++){
    var character = eMail.charAt(i);
    if(character == '@') countOfAtSymbol++;
  }
  if(countOfAtSymbol < 1){
    alert("E-mail address missing '@' symbol.");
    return false;
  }
  if(countOfAtSymbol > 1){
    alert("E-mail address contains more then one '@' symbol.\n\nPlease enter only one e-mail address.");
    return false;
  }

  return true;
}

function trim(input){
  value = input;
  if(value == null) return "";
  for(i=0; i<value.length && (value.charAt(i) == ' ' || value.charAt(i) == '\n' || value.charAt(i) == '\r'|| value.charAt(i) == '\t'); i++){}
  if(i != 0 && i <= value.length) {
    value = value.substring(i, value.length);
  }
  for(i=value.length-1; i>=0 && (value.charAt(i) == ' ' || value.charAt(i) == '\n' || value.charAt(i) == '\r' || value.charAt(i) == '\t'); i--){}
  if(i >= 0 && i < value.length-1) {
    value = value.substring(0, i+1);
  }
  if(value.length > 0) return value;
  return "";
}

function validateCQFields(){
  if(document.getElementById('CQ_FIELD_submitter').value == ""){
    alert("Please enter your name.");
    document.getElementById('CQ_FIELD_submitterInput').focus();
    document.getElementById('CQ_FIELD_product').value = "";
    return false;
  }

  if(document.getElementById('CQ_FIELD_phone').value == ""){
    alert("Please enter your phone number.");
    document.getElementById('CQ_FIELD_phoneInput').focus();
    document.getElementById('CQ_FIELD_product').value = "";
    return false;
  }

  document.getElementById('CQ_FIELD_eMail').value = trim(document.getElementById('CQ_FIELD_eMail').value);
  if(!validateEMail(document.getElementById('CQ_FIELD_eMail').value)){
    document.getElementById('CQ_FIELD_eMailInput').focus();
    document.getElementById('CQ_FIELD_product').value = "";
    return false;
  }

  if(document.getElementById('CQ_FIELD_product').value == ""){
    alert("Please select a product.");
    document.getElementById('products').focus();
    document.getElementById('CQ_FIELD_product').value = "";
    return false;
  }

  if(document.getElementById('CQ_FIELD_headline').value == ""){
    alert("Please enter a headline.");
    document.getElementById('CQ_FIELD_headlineInput').focus();
    document.getElementById('CQ_FIELD_product').value = "";
    return false;
  }

  if(document.getElementById('CQ_FIELD_headline').value.length > 125){
    alert("Headline is too long.\nPlease enter a headline with less then 125 characters.");
    document.getElementById('CQ_FIELD_headlineInput').focus();
    document.getElementById('CQ_FIELD_product').value = "";
    return false;
  }

  return true;
}

function showHelp(){
  window.open("/ClearQuest/CQ_Help.html");
}

function toggleButton(element, state){
  if(state){
    element.style.backgroundColor='#999999';
    element.style.color='#ffffff';
  }
  else{
    element.style.backgroundColor='#ffffff';
    element.style.color='#999999';
  }
}

function toggleNavButton(element, state){
//alert(element.style.backgroundColor);
  if(element.style.backgroundColor == '#4f80bf' || element.style.backgroundColor == "rgb(79,128,191)"){
    if(state){
      element.style.color='#000000';
    }
    else{
      element.style.color='#ffffff';
    }
  }
  else {
    if(state){ element.style.color='#4f80bf'; }
    else{ element.style.color='#ffffff'; }
  }
}

function saveUserNameAndPassword(){
  /*
  if(document.getElementById('REMEMBER_USER_INFO').checked) return true;
  return false;
  */
}

function login(){
  if(PAGE_SUBMITTED) return;

  if(document.getElementById('CQ_FIELD_userName').value == ""){
    alert("Please enter a User Name");
    document.getElementById('CQ_FIELD_userName').focus();
    return false;
  }
  if(document.getElementById('CQ_FIELD_password').value == ""){
    alert("Please enter a Password");
    document.getElementById('CQ_FIELD_password').focus();
    return false;
  }

  if(saveUserNameAndPassword()){ setCookieUserNameAndPassword(document.getElementById('CQ_FIELD_userName').value, document.getElementById('CQ_FIELD_password').value); }
  else{ setCookieUserNameAndPassword("", ""); }

  PAGE_SUBMITTED = true;
  var f = document['cqForm'];
  f.action = "/cgi-bin/CQ_Submit.pl";
  showPageLoading(0);
  f.submit();
}

function showPageLoading(count){
  if(count == 4) count = 0;
  var value = "";
  for(var i=0; i<count; i++){value += ". "; }
  count++;
  window.status = "Please wait, page loading " + value;
  setTimeout('showPageLoading('+count+')', 1000);
}

/* Below for Symptoms Div */
var symptomWindow = null;
function toggleSymptomsDiv(){
  if(symptomWindow == null || symptomWindow.closed){
    var windowFeatures = "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,width=570,height=200";
    symptomWindow = window.open("/ClearQuest/Symptoms.html", "SymptomWindow", windowFeatures);
    symptomWindow.focus();
  }
  else { closeSymptomWindow(); }
}

function closeSymptomWindow(){
  try{ symptomWindow.close(); }
  catch(e){}
  symptomWindow = null;
}

//Called by Symptoms window to set value in main window
function setSymptomsValue(val){

  document.getElementById('CQ_SYMPTOM_SELECT_BOX').options.length=0;

  if(val == null || val.length == 0){
    document.getElementById('CQ_FIELD_symptoms').value = "";
    return;
  }

  for(var i=0; i<val.length; i++){
    document.getElementById('CQ_SYMPTOM_SELECT_BOX').options[document.getElementById('CQ_SYMPTOM_SELECT_BOX').options.length] = newOption(val[i]);
  }

  var result = "";
  for(var i=0; i<val.length; i++){
    if(i==0)result = val[i];
    else result += FIELD_DELIMITER + val[i];
  }

  document.getElementById('CQ_FIELD_symptoms').value = result;
}

function newOption(text){ return new Option(text, text, false, false); }

//Called by symptom window to get the current values
function getCurrentSymptoms(){
  var result = new Array();
  var values = document.getElementById('CQ_SYMPTOM_SELECT_BOX').options;
  for(var i=0; i<values.length; i++){ result[i] = values[i].value; }
  return result;
}

//Called by report filter screen on submit to format select values into SQL syntax
function setFilters(){

  setSelectionState(document.getElementById('FIELD_SHOW_PRODUCT'), document.getElementById('FIELD_SHOW_PRODUCT_BOX'));
  setSelectionState(document.getElementById('FIELD_SHOW_MODULE'), document.getElementById('FIELD_SHOW_MODULE_BOX'));
  setSelectionState(document.getElementById('FIELD_SHOW_REQUEST_TYPE'), document.getElementById('FIELD_SHOW_REQUEST_TYPE_BOX'));
  setSelectionState(document.getElementById('FIELD_SHOW_PRIORITY'), document.getElementById('FIELD_SHOW_PRIORITY_BOX'));
  setSelectionState(document.getElementById('FIELD_SHOW_HEADLINE'), document.getElementById('FIELD_SHOW_HEADLINE_BOX'));
  setSelectionState(document.getElementById('FIELD_SHOW_DESCRIPTION'), document.getElementById('FIELD_SHOW_DESCRIPTION_BOX'));
  setSelectionState(document.getElementById('FIELD_SHOW_STATUS'), document.getElementById('FIELD_SHOW_STATUS_BOX'));
  setSelectionState(document.getElementById('FIELD_SHOW_FIXED_IN_VERSION'), document.getElementById('FIELD_SHOW_FIXED_IN_VERSION_BOX'));
  setSelectionState(document.getElementById('FIELD_SHOW_SUBMIT_DATE'), document.getElementById('FIELD_SHOW_SUBMIT_DATE_BOX'));

  document.getElementById('FIELD_FILTER_PRODUCT').value = formatFilterValues(document.getElementById('productFilter').options);
  document.getElementById('FIELD_FILTER_REQUEST_TYPE').value = formatFilterValues(document.getElementById('requestTypeFilter').options);
  document.getElementById('FIELD_FILTER_STATUS').value = formatFilterValues(document.getElementById('statusFilter').options);

}

function setSelectionState(element, checkboxElement){
  if(checkboxElement.checked) element.value="true";
  else element.value="false";
}

function formatFilterValues(opts){
  var value = "";
  for(var i=0; i<opts.length; i++){
    if(opts[i].selected){
      if(value == "") value = "'" + opts[i].value + "'";
      else value += ", '" + opts[i].value + "'";
    }
  }

  return value;
}

function validateReportFilter(){
  var dateRangeChoice = document.getElementById('FIELD_DATE_RANGE_TYPE_CHOICE').value;
  if(document.cqForm.FIELD_DATE_RANGE_TYPE[0].checked) document.getElementById('FIELD_DATE_RANGE_TYPE_CHOICE').value = "ALL";
  else document.getElementById('FIELD_DATE_RANGE_TYPE_CHOICE').value = "RANGED";

  if(validateDateRange()){
    document.getElementById('DATE_RANGE_START_YEAR_H').value = document.getElementById('DATE_RANGE_START_YEAR').value;
    document.getElementById('DATE_RANGE_START_MONTH_H').value = document.getElementById('DATE_RANGE_START_MONTH').value;
    document.getElementById('DATE_RANGE_START_DAY_H').value = document.getElementById('DATE_RANGE_START_DAY').value;
    document.getElementById('DATE_RANGE_END_YEAR_H').value = document.getElementById('DATE_RANGE_END_YEAR').value;
    document.getElementById('DATE_RANGE_END_MONTH_H').value = document.getElementById('DATE_RANGE_END_MONTH').value;
    document.getElementById('DATE_RANGE_END_DAY_H').value = document.getElementById('DATE_RANGE_END_DAY').value;

    return true;
  }
  return false;
}

function validateDateRange(){
  if(document.cqForm.FIELD_DATE_RANGE_TYPE[0].checked){ return true; }

  var errorMsg = null;
  var element = null;

  document.getElementById('DATE_RANGE_START_YEAR').value = trimNumber(document.getElementById('DATE_RANGE_START_YEAR').value);
  document.getElementById('DATE_RANGE_START_MONTH').value = trimNumber(document.getElementById('DATE_RANGE_START_MONTH').value);
  document.getElementById('DATE_RANGE_START_DAY').value = trimNumber(document.getElementById('DATE_RANGE_START_DAY').value);
  document.getElementById('DATE_RANGE_END_YEAR').value = trimNumber(document.getElementById('DATE_RANGE_END_YEAR').value);
  document.getElementById('DATE_RANGE_END_MONTH').value = trimNumber(document.getElementById('DATE_RANGE_END_MONTH').value);
  document.getElementById('DATE_RANGE_END_DAY').value = trimNumber(document.getElementById('DATE_RANGE_END_DAY').value);

  if(isNaN(parseInt(document.getElementById('DATE_RANGE_START_YEAR').value))){
    errorMsg = "Start Year is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_START_YEAR');
  }
  else if(isNaN(parseInt(document.getElementById('DATE_RANGE_START_MONTH').value))){
    errorMsg = "Start Month is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_START_MONTH');
  }
  else if(isNaN(parseInt(document.getElementById('DATE_RANGE_START_DAY').value))){
    errorMsg = "Start Day is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_START_DAY');
  }
  else if(isNaN(parseInt(document.getElementById('DATE_RANGE_END_YEAR').value))){
    errorMsg = "End Year is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_END_YEAR');
  }
  else if(isNaN(parseInt(document.getElementById('DATE_RANGE_END_MONTH').value))){
    errorMsg = "End Month is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_END_MONTH');
  }
  else if(isNaN(parseInt(document.getElementById('DATE_RANGE_END_DAY').value))){
    errorMsg = "End Day is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_END_DAY');
  }

  if(errorMsg != null){
    alert(errorMsg);
    element.focus();
    return false;
  }

  if(!validateYear(document.getElementById('DATE_RANGE_START_YEAR'))){
    errorMsg = "Start Year is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_START_YEAR');
  }
  else if(!validateMonth(document.getElementById('DATE_RANGE_START_MONTH'))){
    errorMsg = "Start Month is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_START_MONTH');
  }
  else if(!validateDay(document.getElementById('DATE_RANGE_START_DAY'))){
    errorMsg = "Start Day is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_START_DAY');
  }
  else if(!validateYear(document.getElementById('DATE_RANGE_END_YEAR'))){
    errorMsg = "End Year is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_END_YEAR');
  }
  else if(!validateMonth(document.getElementById('DATE_RANGE_END_MONTH'))){
    errorMsg = "End Month is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_END_MONTH');
  }
  else if(!validateDay(document.getElementById('DATE_RANGE_END_DAY'))){
    errorMsg = "End Day is invalid.\n\nPlease enter a valid value.";
    element = document.getElementById('DATE_RANGE_END_DAY');
  }

  if(errorMsg != null){
    alert(errorMsg);
    element.focus();
    return false;
  }

  //Check that start date is not after end date
  var sYear = parseInt(document.getElementById('DATE_RANGE_START_YEAR').value);
  var sMonth = parseInt(document.getElementById('DATE_RANGE_START_MONTH').value);
  var sDay = parseInt(document.getElementById('DATE_RANGE_START_DAY').value);

  var eYear = parseInt(document.getElementById('DATE_RANGE_END_YEAR').value);
  var eMonth = parseInt(document.getElementById('DATE_RANGE_END_MONTH').value);
  var eDay = parseInt(document.getElementById('DATE_RANGE_END_DAY').value);

  if(eYear < sYear){
    errorMsg = "Start Year is after End Year.\n\nPlease change so that the start date is before the end date.";
    element = document.getElementById('DATE_RANGE_START_YEAR');
  }
  else if(eYear == sYear){
    if(eMonth < sMonth){
      errorMsg = "Start Month is after End Month.\n\nPlease change so that the start date is before the end date.";
      element = document.getElementById('DATE_RANGE_START_MONTH');
    }
    else if(eMonth == sMonth){
      if(eDay < sDay){
        errorMsg = "Start Day is after End Day.\n\nPlease change so that the start date is before the end date.";
        element = document.getElementById('DATE_RANGE_START_DAY');
      }
    }
  }

  if(errorMsg != null){
    alert(errorMsg);
    element.focus();
    return false;
  }

  return true;
}

function validateYear(element){
  var num = parseInt(element.value);
  if(num < 1000) return false;
  return true;
}

function validateMonth(element){
  var num = parseInt(element.value);
  if(num < 1 || num > 12) return false;
  return true;
}

function validateDay(element){
  var num = parseInt(element.value);
  if(num < 1 || num > 31) return false;
  return true;
}

function trimNumber(number){
  var newNumber = "" + number;
  while(newNumber.charAt(0) == '0'){ newNumber = newNumber.substring(1, newNumber.length); }
  var num = parseInt(newNumber);
  if(isNaN(num)) return number;
  return num;
}

function toggleDateRangeFeatures(state){
  if(state){
    document.getElementById('DATE_RANGE_START_YEAR').disabled = true;
    document.getElementById('DATE_RANGE_START_MONTH').disabled = true;
    document.getElementById('DATE_RANGE_START_DAY').disabled = true;

    document.getElementById('DATE_RANGE_END_YEAR').disabled = true;
    document.getElementById('DATE_RANGE_END_MONTH').disabled = true;
    document.getElementById('DATE_RANGE_END_DAY').disabled = true;

    document.getElementById('FIELD_DATE_RANGE_TYPE_CHOICE').value = "ALL";
  }
  else {
    document.getElementById('DATE_RANGE_START_YEAR').disabled = false;
    document.getElementById('DATE_RANGE_START_MONTH').disabled = false;
    document.getElementById('DATE_RANGE_START_DAY').disabled = false;

    document.getElementById('DATE_RANGE_END_YEAR').disabled = false;
    document.getElementById('DATE_RANGE_END_MONTH').disabled = false;
    document.getElementById('DATE_RANGE_END_DAY').disabled = false;

    document.getElementById('FIELD_DATE_RANGE_TYPE_CHOICE').value = "RANGED";
  }
}

function setInitialDateRangeValues(){
  var d = new Date();

  document.getElementById('DATE_RANGE_START_YEAR').value = document.getElementById('DATE_RANGE_END_YEAR').value = d.getFullYear();
  document.getElementById('DATE_RANGE_START_MONTH').value = document.getElementById('DATE_RANGE_END_MONTH').value = d.getMonth() + 1;
  document.getElementById('DATE_RANGE_START_DAY').value = document.getElementById('DATE_RANGE_END_DAY').value = d.getDate();

  updateReportBasedOnCookieInfo();
}

function selectAllFilterFields(){ setSelectModeFilterFields(true); }
function unselectAllFilterFields(){ setSelectModeFilterFields(false); }

function setSelectModeFilterFields(value){
  setOptionSelectMode(document.getElementById('productFilter').options, value);
  setOptionSelectMode(document.getElementById('requestTypeFilter').options, value);
  setOptionSelectMode(document.getElementById('statusFilter').options, value);
}

function setOptionSelectMode(opts, value){
  for(var i=opts.length-1; i>=0; i--){ opts[i].selected = value; }
}

function selectAllDisplayFields(){ setSelectModeDisplayFields(true); }
function unselectAllDisplayFields(){ setSelectModeDisplayFields(false); }

function setSelectModeDisplayFields(value){
  document.getElementById('FIELD_SHOW_PRODUCT_BOX').checked = value;
  document.getElementById('FIELD_SHOW_MODULE_BOX').checked = value;
  document.getElementById('FIELD_SHOW_REQUEST_TYPE_BOX').checked = value;
  document.getElementById('FIELD_SHOW_PRIORITY_BOX').checked = value;
  document.getElementById('FIELD_SHOW_HEADLINE_BOX').checked = value;
  document.getElementById('FIELD_SHOW_DESCRIPTION_BOX').checked = value;
  document.getElementById('FIELD_SHOW_STATUS_BOX').checked = value;
  document.getElementById('FIELD_SHOW_FIXED_IN_VERSION_BOX').checked = value;
  document.getElementById('FIELD_SHOW_SUBMIT_DATE_BOX').checked = value;
}

function updateReportBasedOnCookieInfo(){
  var reportCookieName = "cqweb_report_"+document.getElementById('CQ_FIELD_userName').value;;
  var visitordata = new Cookie(document, reportCookieName, (24 * DAYS_UNTIL_COOKIE_EXPIRATION));

  if (visitordata.load()){
    var displayColumnInfo = visitordata.reportDisplay;
    var productFilterInfo = visitordata.reportFilterProduct;
    var requestFilterInfo = visitordata.reportFilterRequest;
    var statusFilterInfo  = visitordata.reportFilterStatus;

    if(!displayColumnInfo) displayColumnInfo = "";
    if(!productFilterInfo) productFilterInfo = "";
    if(!requestFilterInfo) requestFilterInfo = "";
    if(!statusFilterInfo)  statusFilterInfo = "";

    var displayColumns = parseCookieReportFields(displayColumnInfo);
    var productFilter = parseCookieReportFields(productFilterInfo);
    var requestFilter = parseCookieReportFields(requestFilterInfo);
    var statusFilter = parseCookieReportFields(statusFilterInfo);

    if(displayColumns.length > 0){
      unselectAllDisplayFields();

      for(var i=0; i<displayColumns.length; i++){
        var element = document.getElementById(displayColumns[i]);
        if(element != null) element.checked=true;
      }
    }
    if(productFilter.length > 0){
      setOptionSelectMode(document.getElementById('productFilter').options, false);
      setFilterOptionsFromCookieInfo(document.getElementById('productFilter').options, productFilter);
    }
    if(requestFilter.length > 0){
      setOptionSelectMode(document.getElementById('requestTypeFilter').options, false);
      setFilterOptionsFromCookieInfo(document.getElementById('requestTypeFilter').options, requestFilter);
    }
    if(statusFilter.length > 0){
      setOptionSelectMode(document.getElementById('statusFilter').options, false);
      setFilterOptionsFromCookieInfo(document.getElementById('statusFilter').options, statusFilter);
    }
  }
}

function setFilterOptionsFromCookieInfo(opts, values){
  if(opts == null || values == null || opts.length < 1 || values.length < 1) return;

  for(var i=0; i<opts.length; i++){
    for(var j=0; j<values.length; j++){
      if(opts[i].value == values[j]) opts[i].selected = true;
    }
  }
}

function parseCookieReportFields(keys){
  var values = new Array();

  if(keys == null) return values;
  keys = trim(keys);
  if(keys == "") return values;

  var index = keys.indexOf(COOKIE_FIELD_DELIMITER);
  while(index >= 0){
    values[values.length] = keys.substring(0, index);
    keys = trim(keys.substring(index + COOKIE_FIELD_DELIMITER.length, keys.length));
    index = keys.indexOf(COOKIE_FIELD_DELIMITER);
  }

  if(keys != "") values[values.length] = keys;
  return values;
}

function setCookieReportInfo(){
  var displayColumnInfo = getDisplayColumnInfoForCookie();
  var productFilterInfo = getFilterInfoForCookie('productFilter');
  var requestFilterInfo = getFilterInfoForCookie('requestTypeFilter');
  var statusFilterInfo =  getFilterInfoForCookie('statusFilter');

  var reportCookieName = "cqweb_report_"+document.getElementById('CQ_FIELD_userName').value;;
  var visitordata = new Cookie(document, reportCookieName, (24 * DAYS_UNTIL_COOKIE_EXPIRATION));

  visitordata.reportDisplay = displayColumnInfo;
  visitordata.reportFilterProduct = productFilterInfo;
  visitordata.reportFilterRequest = requestFilterInfo;
  visitordata.reportFilterStatus = statusFilterInfo;
  visitordata.store();
}

function getFilterInfoForCookie(idValue){
  var opts = document.getElementById(idValue).options;

  var displayColumnSelectionsText = "";
  for(var i=0; i<opts.length; i++){
    if(opts[i].selected){
      var val = opts[i].value;
      if(displayColumnSelectionsText == ""){ displayColumnSelectionsText = val; }
      else { displayColumnSelectionsText += COOKIE_FIELD_DELIMITER + val; }
    }
  }

  return displayColumnSelectionsText;
}


function getDisplayColumnInfoForCookie(){
  var displayColumnSelections = new Array();

  if(document.getElementById('FIELD_SHOW_PRODUCT_BOX').checked) displayColumnSelections[displayColumnSelections.length] = 'FIELD_SHOW_PRODUCT_BOX';
  if(document.getElementById('FIELD_SHOW_MODULE_BOX').checked) displayColumnSelections[displayColumnSelections.length] = 'FIELD_SHOW_MODULE_BOX';
  if(document.getElementById('FIELD_SHOW_REQUEST_TYPE_BOX').checked) displayColumnSelections[displayColumnSelections.length] = 'FIELD_SHOW_REQUEST_TYPE_BOX';
  if(document.getElementById('FIELD_SHOW_PRIORITY_BOX').checked) displayColumnSelections[displayColumnSelections.length] = 'FIELD_SHOW_PRIORITY_BOX';
  if(document.getElementById('FIELD_SHOW_HEADLINE_BOX').checked) displayColumnSelections[displayColumnSelections.length] = 'FIELD_SHOW_HEADLINE_BOX';
  if(document.getElementById('FIELD_SHOW_DESCRIPTION_BOX').checked) displayColumnSelections[displayColumnSelections.length] = 'FIELD_SHOW_DESCRIPTION_BOX';
  if(document.getElementById('FIELD_SHOW_STATUS_BOX').checked) displayColumnSelections[displayColumnSelections.length] = 'FIELD_SHOW_STATUS_BOX';
  if(document.getElementById('FIELD_SHOW_FIXED_IN_VERSION_BOX').checked) displayColumnSelections[displayColumnSelections.length] = 'FIELD_SHOW_FIXED_IN_VERSION_BOX';
  if(document.getElementById('FIELD_SHOW_SUBMIT_DATE_BOX').checked) displayColumnSelections[displayColumnSelections.length] = 'FIELD_SHOW_SUBMIT_DATE_BOX';

  var displayColumnSelectionsText = "";
  for(var i=0; i<displayColumnSelections.length; i++){
    if(displayColumnSelectionsText == ""){ displayColumnSelectionsText = displayColumnSelections[i]; }
    else { displayColumnSelectionsText += COOKIE_FIELD_DELIMITER + displayColumnSelections[i]; }
  }

  return displayColumnSelectionsText;
}

function setCookieUserNameAndPassword(name, pass){
/*
  var visitordata = new Cookie(document, "cqweb_login", (24 * DAYS_UNTIL_COOKIE_EXPIRATION));

  visitordata.name = name;
  visitordata.password = pass;

  visitordata.store();
*/
}

function showValidBrowserLogin(){
  updateLoginFieldFromCookie();
  document.getElementById('loginDiv').style.display='';
  document.getElementById('CQ_FIELD_userName').focus();
}

function updateLoginFieldFromCookie(){
/*
  var visitordata = new Cookie(document, "cqweb_login", (24 * DAYS_UNTIL_COOKIE_EXPIRATION));

  if (visitordata.load()){
    var userName = visitordata.name;
    var userPass = visitordata.password;
    if(!userName) userName = "";
    if(!userPass) userPass = "";
    document.getElementById('CQ_FIELD_userName').value = userName;
    document.getElementById('CQ_FIELD_password').value = userPass;

    if(userName != "" && userPass != ""){ document.getElementById('REMEMBER_USER_INFO').checked = true; }
    else { document.getElementById('REMEMBER_USER_INFO').checked = false; }
  }
  else {
    document.getElementById('REMEMBER_USER_INFO').checked = false;
  }
*/
}

function showLoginScreen(){
  document.getElementById('initiallyLoadedDiv').style.display='none';

  var errorMessage = "";

  if(isBrowserIE()){
    var version = getBrowserVersion();
    if(version >= 5.5){
      showValidBrowserLogin();
      return;
    }

    //Invalid IE version
    errorMessage = "Your version of Internet Explorer is not supported.<p>See Help for additional information and supported versions.";
  }
  else if(isBrowserNetscape()){
    var version = getBrowserVersion();
    if(version >= 7.0){
      showValidBrowserLogin();
      return;
    }

    //Invalid Netscape version
    errorMessage = "Your version of Netscape is not supported.<p>See Help for additional information and supported versions.";
  }
  else {
    //Invalid browser type
    errorMessage = "Your web browser is not supported.<p>See Help for additional information and supported web browsers.";
  }

  document.getElementById('browserDownloadDiv').innerHTML = errorMessage;
  document.getElementById('browserVersionDiv').style.display='';
}

function isBrowserIE(){
  if(navigator.appName != 'Microsoft Internet Explorer'){ return false; }
  return true;
}

function isBrowserNetscape(){
  if(navigator.appName != 'Netscape'){ return false; }
  return true;
}

function getBrowserVersion(){
  if(isBrowserIE()){
    browserVersionId = navigator.userAgent.indexOf('MSIE');
    browserVersionNumberPlusData = navigator.userAgent.substr(browserVersionId+5,navigator.userAgent.length);
    indexOfDelimeter = browserVersionNumberPlusData.indexOf(';');
    browserVersion = browserVersionNumberPlusData.substr(0, indexOfDelimeter);
    return parseFloat(browserVersion);
  }
  else if(isBrowserNetscape()){
    browserVersionId = navigator.userAgent.indexOf('Netscape');
    browserVersion = navigator.userAgent.substr(browserVersionId+9,navigator.userAgent.length);
    return parseFloat(browserVersion);
  }
  return -1;
}

/*
  Below code used for cookie management.  Taken from "JavaScript The Definitive Guide", David Flanagan, January 2002,  pg 270-273
*/

// The constructor function: creates a cookie object for the specified
// document, with a specified name and optional attributes.
// Arguments:
//   document: The Document object that the cookie is stored for. Required.
//   name:     A string that specifies a name for the cookie. Required.
//   hours:    An optional number that specifies the number of hours from now
//             that the cookie should expire.
//   path:     An optional string that specifies the cookie path attribute.
//   domain:   An optional string that specifies the cookie domain attribute.
//   secure:   An optional Boolean value that, if true, requests a secure cookie.
//
function Cookie(document, name, hours, path, domain, secure)
{
    // All the predefined properties of this object begin with '$'
    // to distinguish them from other properties which are the values to
    // be stored in the cookie.
    this.$document = document;
    this.$name = name;
    if (hours)
        this.$expiration = new Date((new Date()).getTime() + hours*3600000);
    else this.$expiration = null;
    if (path) this.$path = path; else this.$path = null;
    if (domain) this.$domain = domain; else this.$domain = null;
    if (secure) this.$secure = true; else this.$secure = false;
}

// This function is the store() method of the Cookie object.
Cookie.prototype.store = function () {
    // First, loop through the properties of the Cookie object and
    // put together the value of the cookie. Since cookies use the
    // equals sign and semicolons as separators, we'll use colons
    // and ampersands for the individual state variables we store
    // within a single cookie value. Note that we escape the value
    // of each state variable, in case it contains punctuation or other
    // illegal characters.
    var cookieval = "";
    for(var prop in this) {
        // Ignore properties with names that begin with '$' and also methods.
        if ((prop.charAt(0) == '$') || ((typeof this[prop]) == 'function'))
            continue;
        if (cookieval != "") cookieval += '&';
        cookieval += prop + ':' + escape(this[prop]);
    }

    // Now that we have the value of the cookie, put together the
    // complete cookie string, which includes the name and the various
    // attributes specified when the Cookie object was created.
    var cookie = this.$name + '=' + cookieval;
    if (this.$expiration)
        cookie += '; expires=' + this.$expiration.toGMTString();
    if (this.$path) cookie += '; path=' + this.$path;
    if (this.$domain) cookie += '; domain=' + this.$domain;
    if (this.$secure) cookie += '; secure';

    // Now store the cookie by setting the magic Document.cookie property.
    this.$document.cookie = cookie;
}

// This function is the load() method of the Cookie object.
Cookie.prototype.load = function() {
    // First, get a list of all cookies that pertain to this document.
    // We do this by reading the magic Document.cookie property.
    var allcookies = this.$document.cookie;
    if (allcookies == "") return false;

    // Now extract just the named cookie from that list.
    var start = allcookies.indexOf(this.$name + '=');
    if (start == -1) return false;   // Cookie not defined for this page.
    start += this.$name.length + 1;  // Skip name and equals sign.
    var end = allcookies.indexOf(';', start);
    if (end == -1) end = allcookies.length;
    var cookieval = allcookies.substring(start, end);

    // Now that we've extracted the value of the named cookie, we've
    // got to break that value down into individual state variable
    // names and values. The name/value pairs are separated from each
    // other by ampersands, and the individual names and values are
    // separated from each other by colons. We use the split method
    // to parse everything.
    var a = cookieval.split('&');    // Break it into array of name/value pairs.
    for(var i=0; i < a.length; i++)  // Break each pair into an array.
        a[i] = a[i].split(':');

    // Now that we've parsed the cookie value, set all the names and values
    // of the state variables in this Cookie object. Note that we unescape()
    // the property value, because we called escape() when we stored it.
    for(var i = 0; i < a.length; i++) {
        this[a[i][0]] = unescape(a[i][1]);
    }

    // We're done, so return the success code.
    return true;
}

// This function is the remove() method of the Cookie object.
Cookie.prototype.remove = function() {
    var cookie;
    cookie = this.$name + '=';
    if (this.$path) cookie += '; path=' + this.$path;
    if (this.$domain) cookie += '; domain=' + this.$domain;
    cookie += '; expires=Fri, 02-Jan-1970 00:00:00 GMT';

    this.$document.cookie = cookie;
}

function validateFindRecord(){
  var value = document.getElementById('FIELD_PRODUCT_ID_TO_FIND').value;
  var intID = parseInt(value);
  if(isNaN(intID) || intID < 0){
    alert("Request ID to find is invalid.");
    document.getElementById('FIELD_PRODUCT_ID_TO_FIND').focus();
    return false;
  }
  else if(intID != parseFloat(value)){
    alert("Request ID to find is invalid.");
    document.getElementById('FIELD_PRODUCT_ID_TO_FIND').focus();
    return false;
  }
  document.getElementById('FIELD_PRODUCT_ID_TO_FIND').value = intID;
  document.getElementById('FIELD_FIND_MODE').value='ID';
  return true;
}

//Used by new ydyn.com web site look, side bar images
function random_imglink() {
  var myimages = new Array()
  myimages[1] = "/ClearQuest/images/art/1.jpg"
  myimages[2] = "/ClearQuest/images/art/2.jpg"
  myimages[3] = "/ClearQuest/images/art/3.jpg"
  myimages[4] = "/ClearQuest/images/art/4.jpg"
  myimages[5] = "/ClearQuest/images/art/5.jpg"
  myimages[6] = "/ClearQuest/images/art/6.jpg"
  myimages[7] = "/ClearQuest/images/art/7.jpg"

  var rx = Math.floor(Math.random() * myimages.length)
  if (rx == 0) rx = 1

  var ry = rx + 1
  if (ry == myimages.length) ry = 1

  var html = '<img border="1" src="' + myimages[rx] + '" width="120" height="120"></td></tr>';
  html += '<tr><td>&nbsp;</td></tr>';
  html += '<tr><td><img border="1" src="' + myimages[ry] + '" width="120" height="120">';
  return html;
}

