/*htmlutil.js
  Created September 13, 2006 by Kerwin Tang
*/

var GRID_NORMAL_RECORD_COUNT = "Record(s) 1 to 10 of 500"
var GRID_SR_RECORD_COUNT = "Record(s) 1 to 10 of 500 Match(es)"

var HTMLUTIL_MODE_UPD = 'U';
var HTMLUTIL_MODE_VW = 'V';
var HTMLUTIL_MODE = HTMLUTIL_MODE_UPD;

function genRowStart(){
  startTr();
  startTd();
}

function genRowEnd(){
  endTd();
  endTr();
}

function startTr(){
  document.write("<tr>");
}

function endTr(){
  document.write("</tr>");
}

function startTd(aClass){
  if(!aClass)
    aClass="";
  document.write("<td class='"+aClass+"'>");
}

function endTd(){
  document.write("</td>");
}

function startTable(){
  document.write("<table>");
}

function endTable(){
  document.write("</table>");
}

function genStandardTr(aLabel1, anObject1, aLabel2, anObject2){
  //10-17-2006 leo  replace the sentences that is now after "//"
  //here just add an Id used for controlling this <tr>
  //function removeSpaces(...) provided by Jolin
  //genRowStart();
  document.writeln("<tr id='"+removeSpaces(aLabel1)+"'>");
  startTd();
  //10-17-2006 leo EndTag--------------
  startTable();
  startTr();
  genLabelTd(aLabel1);
  if(aLabel2)
    startValueTd();
  else
    startTd("value_long");
  document.write(anObject1);
  endTd();
  if(aLabel2){
    genLabelTd(aLabel2);
    startValueTd();
    document.write(anObject2);
  }
  endTr();
  endTable();
  genRowEnd();
}

function startLabelTd(){
  startTd("lbl");
}

function startValueTd(){
  startTd("value");
}


function genLabelTd(aLabel){
  document.writeln("<td class='lbl'>"+aLabel+"</td>");
}

function genValueTd(aValue){
  document.writeln("<td class='value'>"+aValue+"</td>");
}

function genTd(aValue){
  document.writeln("<td>"+aValue+"</td>");
}

function genAddressField(aName, aValue1, aValue2, aValue3){
   return genTextBoxAddress(aName+"1", 100, aValue1)+"<br>"+ 
              genTextBoxAddress(aName+"2", 60, aValue2)+"<br>"+
               genTextBoxAddress(aName+"3", 60, aValue3) ;
}

function genTextBoxAddress(aName, aLength, aValue){
  if(!aValue)
    aValue="";
  if (HTMLUTIL_MODE == HTMLUTIL_MODE_VW)
    return genStatic(aValue);
    
  var nSize = 100;
  var nMaxSize=90;
  if(window.top.dialogArguments)
    nMaxSize=59;
  if (nSize > nMaxSize)
    nSize = nMaxSize;
  return "<input type='text' name='"+aName+"' size='"+nSize+"' maxLength='"+aLength+"' value='"+aValue+"'>";
}

function genLabel(aLabel, aMandatory, aChinese) {
  var sLabel=aLabel;
  if (aChinese) sLabel = '<span class="chinese_lbl">'+aLabel+'</span>';
  if (aMandatory && HTMLUTIL_MODE==HTMLUTIL_MODE_UPD) sLabel += '<span class="mandatory"> *</span>';
  return sLabel
}
function genTextField(aLabel, aName, aLength, aValue,aMandatory,aClass){
  genStandardTr(genLabel(aLabel, aMandatory), genTextBox(aName, aLength, aValue,aClass));
}

function genTextFieldWithEllipsis(aLabel, aName, aLength, aValue, aUrl,aMandatory){
  genStandardTr(genLabel(aLabel, aMandatory), genTextBoxWithEllipsis(aName, aLength, aValue,aUrl));
}

function genDateField(aLabel, aName, aValue, aMandatory){
  genStandardTr(genLabel(aLabel, aMandatory),genDate(aName, aValue));
}

function genDateTimeField(aLabel, aName, aValue, aMandatory){
  genStandardTr(genLabel(aLabel, aMandatory),genDate(aName, aValue,true));
}


function genCurrencyTextBoxField(aLabel, aName, aLength,aValue, aMandatory, aReadOnly){ 
  genStandardTr(genLabel(aLabel, aMandatory),genCurrencyTextBox(aName, aLength,aValue,aReadOnly)); 
} 

function genReadOnlyTextBoxField(aLabel, aName, aLength, aValue,aMandatory,aClass) {
   genStandardTr(genLabel(aLabel, aMandatory), genReadOnlyTextBox(aName, aLength, aValue,aClass));
}


function genDate(aName, aValue, aHasTime, aNoViewMode){
  if (HTMLUTIL_MODE == HTMLUTIL_MODE_VW && !aNoViewMode)
    return genStatic(aValue);
    
  var nMaxlength=10;
  if (aHasTime) nMaxlength=19;
  var bWithDateFormat = true;
  
  return genTextBox(aName, nMaxlength, aValue, "calendar_class", aNoViewMode)+
    "&nbsp;<img name='"+aName+"CAL' id='"+aName+"CAL' title='Choose a date' class='date_picker' src='../images/calendar.gif' align='absmiddle' onclick='showCalendar(\""+aName+"\", \"%d/%m/%Y"+((aHasTime)?"%H:%M:%S":"")+"\", "+((aHasTime)?'true':'false')+", false, this);'>" +
    "&nbsp;"+genDateFormat(aHasTime);
}


function genDateFormat(anHasTime){
  var sTime='';
  if (anHasTime) sTime=' hh:mm:ss';
  return genSpan("(dd/mm/yyyy)" + sTime, "date_format");
}

// Framework change request #3. Date Range function.
function genDatePeriod(aLabel, aName, aValues){ 
  genStandardTr(aLabel,genDateRange(aName, aValues)); 
} 

// Framework change request #3. Date Range function. 
function genDateRange(aName, aValues){ 
  var nMaxlength=10; 
  if (!aValues) 
    aValues = ["",""]; 
 
  return genTextBox(aName+"_F", nMaxlength, aValues[0], "calendar_class")+ 
    "&nbsp;<img name='"+aName+"_F"+"CAL' id='"+aName+"_F"+"CAL' title='Choose a date' class='date_picker' src='../images/calendar.gif' align='absmiddle' onclick='showCalendar(\""+aName+"_F"+"\", \"%d/%m/%Y\", false, true, this);'>" + 
    "&nbsp;&nbsp;to&nbsp;&nbsp;"+ 
    genTextBox(aName+"_T", nMaxlength, aValues[1], "calendar_class")+ 
    "&nbsp;<img name='"+aName+"_T"+"CAL' id='"+aName+"_T"+"CAL' title='Choose a date' class='date_picker' src='../images/calendar.gif' align='absmiddle' onclick='showCalendar(\""+aName+"_T"+"\", \"%d/%m/%Y\", false, true, this);'>" + 
    "&nbsp;"+ genDateFormat(); 
}

function genSpan(aLabel, aClass, aID){
	var sID = (!aID ? '' : 'id="'+aID+'"');
  return "<span "+sID+" class='"+aClass+"'>"+aLabel+"</span>";
}

function genTextBox(aName, aLength, aValue, aClass, aNoViewMode){
  if(!aValue)
    aValue="";
  if (HTMLUTIL_MODE == HTMLUTIL_MODE_VW && !aNoViewMode)
    return genStatic(aValue);
    
  var nSize = aLength+1;
  var nMaxSize=90;
  var sClass='';
  if(window.top.dialogArguments)
    nMaxSize=59;
  if (nSize > nMaxSize)
    nSize = nMaxSize;
  if (aClass) sClass='class=\"'+aClass+'\"'
  return "<input type='text' name='"+aName+"' size='"+nSize+"' maxLength='"+aLength+"' value='"+aValue+"' "+sClass+">";
}

function genCurrencyTextBox(aName, aLength, aValue,aReadOnly) {
  if (HTMLUTIL_MODE == HTMLUTIL_MODE_VW)
    return '$&nbsp;' + genStatic(aValue);
    
  var sConstruct='';
  sConstruct +='<span class=\"hk_dollar_sign\">$&nbsp;</span>';
  if (aReadOnly)
    sConstruct += genReadOnlyTextBox(aName,aLength, aValue,'currency');
  else
    sConstruct += genTextBox(aName,aLength, aValue,'currency');
  return sConstruct;
}

function genReadOnlyTextBox(aName, aLength, aValue, aClass){
  if(!aValue)
    aValue="";
  if (HTMLUTIL_MODE == HTMLUTIL_MODE_VW)
    return genStatic(aValue);

  var nSize = aLength+1;
  var nMaxSize=90;
  if(window.top.dialogArguments)
    nMaxSize=59;
  if (nSize > nMaxSize)
    nSize = nMaxSize;
  var sClass='readonly';
  if (aClass) sClass='readonly_'+aClass;
  return "<input type='text' name='"+aName+"' size='"+nSize+"' maxLength='"+aLength+"' value='"+aValue+"' readonly class='"+sClass+"'>";
}

function genTextBoxWithEllipsis(aName, aLength, aValue, aUrl) {
  if (HTMLUTIL_MODE == HTMLUTIL_MODE_VW)
    return genStatic(aValue);

  var sConstruct = '';
  sConstruct += '<table cellspacing="0" cellpadding="0" border="0" > <tr> <td>';
  sConstruct += genTextBox(aName, aLength, aValue); 
  sConstruct += '</td><td style="padding-right:6px">';
  sConstruct += genEllipsis(aUrl,aName);
  //sConstruct += "&nbsp;";
  sConstruct += '</td></table>';
  return sConstruct;
 // return genTextBox(aName, aLength, aValue) + "&nbsp;" + genEllipsis(aUrl,aName);
}

function genEllipsis(aUrl,aName){
  var gElipsis = new GroupButtons();
  gElipsis.addButton(showEllipsisButton, "USER_ELIPSIS_"+aName, aUrl, "");  
  
  return gElipsis.construct();
  //return showEllipsisButton("USER_ELIPSIS_"+aName,aUrl);
}

function genTextAreaField(aLabel, aName, aValue, aMandatory){
  genStandardTr(genLabel(aLabel, aMandatory),genTextArea(aName, aValue));
}
	
function genTextArea(aName, aValue, aReadOnly, aRows, aCols, aClass){
  if(!aValue)
    aValue = "";
  if (HTMLUTIL_MODE == HTMLUTIL_MODE_VW)
    return genStatic(aValue);

  if (!aRows)
     aRows = 3;
  if (!aCols) {
    aCols = 110;
    if (window.top.dialogArguments)
      aCols = 65;
  }
  var sClass = (!aReadOnly ? ((aClass) ?"class='"+aClass+"'":"") : "readonly class='readonly"+((aClass) ?"_"+aClass:"")+"'");
    
  
  return "<textarea name='"+aName+"' rows='"+aRows+"' cols='"+aCols+"' "+sClass+" >"+aValue+"</textarea>";
}

function genTextAreaHalf(aName, aValue, aReadOnly, aRows, aCols){
  if (!aRows)
    aRows = 3;
  if (!aCols) {
    aCols = 45;
    if (window.top.dialogArguments)
      aCols = 33;
  }
  
  return genTextArea(aName, aValue, aReadOnly, aRows, aCols);
}

function genSelectField(aLabel, aName, anOptionLabels, anOptionValues, aDefaultValue, aMandatory){
  genStandardTr(genLabel(aLabel, aMandatory),genSelect(aName, anOptionLabels, anOptionValues, aDefaultValue));
}

function genSelect(aName, anOptionLabels, anOptionValues, aDefaultValue, aTopOption){
	var sDefLabel = '';
	var sTopOption = (!aTopOption ? "[Please Select One]" : aTopOption);
	
  var sSelect = "<select name='"+aName+"'>" +
    "<option value=>"+sTopOption+"</option>";
  for(var i = 0; i < anOptionLabels.length; i++){
    var sValue = "";
    var sSelected = "";
    if(anOptionValues){
      sValue = "value='"+anOptionValues[i]+"'";
      if(aDefaultValue == anOptionValues[i]) {
        sSelected="selected";
        sDefLabel=anOptionLabels[i]
      }
    }
    sSelect = sSelect + "<option "+sValue+" "+sSelected+">"+anOptionLabels[i]+"</option>";
  }
  sSelect = sSelect + "</select>";

  if (HTMLUTIL_MODE == HTMLUTIL_MODE_VW)
    return genStatic(sDefLabel);
    
  return sSelect;
}

function genCheckField(aLabel, aName, aValues, aLabels, aMandatory){
  genStandardTr(genLabel(aLabel, aMandatory), genCheck(aName, aValues, aLabels));
}

function genCheck(aName, aValues, aLabels){
  var sCheck ="";
  for(var i=0; i < aValues.length; i++){
    var sId="CHK_"+aName+"_"+aValues[i];
    sCheck = sCheck + "<input type='checkbox' id='"+sId+"' name='"+aName+"' value='"+aValues[i]+"'>" +
      "<span class='checkbox' onclick='checkboxCheck(document.getElementById(\""+sId+"\"))'>"+aLabels[i]+"</span>";
    if(i<aValues.length-1)
      sCheck=sCheck+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
  }
  return sCheck;
}

function checkboxCheck(aCheckbox){
  aCheckbox.checked=!aCheckbox.checked
}

////10-17-2006 leo  replace the part that is now between "/*" and "*/"
/*
function genRadioField(aLabel, aName, aValues, aLabels, aDefault){
  genStandardTr(aLabel, genRadio(aName, aValues, aLabels, aDefault));
}
*/
//new function just add an anOnClick into the parameters list and the function it calling.
function genRadioField(aLabel, aName, aValues, aLabels, aDefault, anOnClick, aMandatory){
  genStandardTr(genLabel(aLabel, aMandatory), genRadio(aName, aValues, aLabels, aDefault, anOnClick));
}
//10-17-2006 leo EndTag--------------

function genRadio(aName, aValues, aLabels, aDefault, anOnClick){
  var sCheck ="";
  var shownLabel="";
  for(var i=0; i < aValues.length; i++){
    var sObjName="document.frmSOP."+aName+"["+i+"]";
    var sChecked="";
    if(aValues[i]==aDefault) {
      sChecked="checked";
      shownLabel = aLabels[i];
    }
    ////10-17-2006 leo  replace the part that is now between "/*" and "*/"
    /*
    sCheck = sCheck + "<input type='radio' name='"+aName+"' value='"+aValues[i]+"' "+sChecked+">" +
      "<span class='checkbox' onclick='radioCheck("+sObjName+");'>"+aLabels[i]+"</span>&nbsp;&nbsp;&nbsp;&nbsp;";
    //*/
    //add anOnClick into the elements
    var sOnClick = "";
    if(anOnClick){
      if(anOnClick[i]){
        sOnClick = anOnClick[i];
      }else{
        sOnClick = anOnClick;
      }
    }
    sCheck = sCheck + "<input type='radio' name='"+aName+"' value='"+aValues[i]+"' onclick='"+sOnClick+"' "+sChecked+">" +
      "<span class='checkbox' onclick='radioCheck("+sObjName+");"+sOnClick+"'>"+aLabels[i]+"</span>";
    if(i<aValues.length-1)
      sCheck=sCheck+"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;";
    //10-17-2006 leo EndTag--------------
    
    
  }
  
    if (HTMLUTIL_MODE == HTMLUTIL_MODE_VW)
      return genStatic(shownLabel);
      
  return sCheck;
}

function radioCheck(aRadio){
  aRadio.checked=true
}

function genLineTR(){
  genRowStart();
  document.write("<hr size='1' width='100%' size='1'>");
  genRowEnd;
}

function genResultGrid(aTitle, aName,aSearchResultCount,aHeaders, aWidths, aSortable, aNumericCols, aColumns, anOnClick, aHasPages, aGroupButton, anAction, aClass){
  genRowStart();
  document.writeln("<table id='result_grid' class='result_grid' cellspacing='0' cellpadding='0'>");
  startTr();
  startTd();
  document.writeln("<a name='result_grid'></a>");
  document.writeln("<table class='grid' cellspacing='0' cellpadding='0'>");
  genGridTitle(aTitle,aHeaders.length);
  genGridHeader(aName, aHeaders, aWidths, aSortable);
  genGridContent(aNumericCols, aColumns, false, anOnClick,aHeaders.length);
  endTable();
  if(aHasPages || aGroupButton)
    //genItemsPerPage(aHasPages,aButtons, anAction, aClass);
    genItemsPerPage(aHasPages,aGroupButton, aSearchResultCount);
  endTd();
  endTr();
  endTable();
  genRowEnd();
 // hideGrid();
}

function genResultGridWithCheckbox(aTitle, aName,aSearchResultCount,aHeaders, aWidths, aSortable, aNumericCols, aColumns, anOnClick, aHasPages, aGroupButton, anAction, aClass){
  genRowStart();
  document.writeln("<table id='result_grid' class='result_grid'>");
  startTr();
  startTd();
  document.writeln("<a name='result_grid'></a>");
  document.writeln("<table class='grid' cellspacing='0' cellpadding='0'>");
  genGridTitle(aTitle,aHeaders.length+1);
  genGridHeader(aName, aHeaders, aWidths, aSortable, true, removeSpaces(aTitle));
  genGridContent(aNumericCols, aColumns, true, anOnClick, removeSpaces(aTitle),aHeaders.length);
  endTable();
  if(aHasPages || aGroupButton)
    genItemsPerPage(aHasPages,aGroupButton,aSearchResultCount);
  endTd();
  endTr();
  endTable();
  genRowEnd();
  hideGrid();
}


function genGrid(aTitle, aName,aSearchResultCount,aHeaders, aWidths, aSortable, aNumericCols, aColumns, anOnClick, aHasPages, aGroupButton, anAction, aClass, aTotalValues){
  genRowStart();
  document.writeln("<table class='grid' cellspacing='0' cellpadding='0'>");
  genGridTitle(aTitle,aHeaders.length);
  genGridHeader(aName, aHeaders, aWidths, aSortable, aClass);
  genGridContent(aNumericCols, aColumns, false, anOnClick, null,aHeaders.length, aClass);
  if(aTotalValues)
    genTotalRow(aColumns,aTotalValues);
  endTable();
  if(aHasPages || aGroupButton)
    genItemsPerPage(aHasPages,aGroupButton,aSearchResultCount);
  genRowEnd();
}

/*function genGrid(aTitle, aName, aHeaders, aWidths, aSortable, aNumericCols, aColumns, anOnClick, aHasPages, aGroupButton, anAction, aClass, aTotalValues) {
  return genCustomGrid(aTitle, aName,"Record(s) 1 to 10 of 500",aHeaders, aWidths, aSortable, aNumericCols, aColumns, anOnClick, aHasPages, aGroupButton, anAction, aClass, aTotalValues);
} */

// framework request # 6 - requested by Jolin. 2006/10/16.
function genGridWithCheckbox(aTitle, aName, aSearchResultCount,aHeaders, aWidths, aSortable, aNumericCols, aColumns, anOnClick, aHasPages, aGroupButton, anAction, aClass){
  genRowStart();
  document.writeln("<table class='grid' cellspacing='0' cellpadding='0'>");
  genGridTitle(aTitle,aHeaders.length+1);
  genGridHeader(aName, aHeaders, aWidths, aSortable, true, removeSpaces(aTitle), aClass);
  genGridContent(aNumericCols, aColumns, true, anOnClick, removeSpaces(aTitle),aHeaders.length + 1, aClass);
  endTable();
  if(aHasPages || aGroupButton)
    genItemsPerPage(aHasPages, aGroupButton,aSearchResultCount);
  genRowEnd();
}

/*function genGridWithCheckbox(aTitle, aName, aHeaders, aWidths, aSortable, aNumericCols, aColumns, anOnClick, aHasPages, aGroupButton, anAction, aClass, aTotalValues) {
  return genCustomGridWithCheckbox(aTitle, aName,"Record(s) 1 to 10 of 500",aHeaders, aWidths, aSortable, aNumericCols, aColumns, anOnClick, aHasPages, aGroupButton, anAction, aClass, aTotalValues);
}*/

// framework request # 6 - requested by Jolin. 2006/10/16.
function removeSpaces(aStr) {
  var r, re;
//  re = /[ \-+()\*\/\$\.]/g;
  re = /[ \-\+\*\/\$@#%&\.\,:;?\(\)\|\[\]\{\}<>=_]/g;
  r = aStr.replace(re, "");
  return(r);
}

function genItemsPerPage(aHasPages,aGroupButton, aSearchResultCount){
  genRowStart();
  document.writeln("<table class='button' width='100%' border='0' cellpadding='0' cellspacing='0'>");
  if (aHasPages || aSearchResultCount) {
    document.writeln("<tr style='padding-top:8px;'>");
  }
  
  if (aSearchResultCount) {
    document.writeln('<td class="search_result_count">');
    document.writeln('<span class="search_result_count">'+aSearchResultCount+'</span>');
    endTd();
  }
  if (aHasPages) { 
    var sPage ='';
    for (var i=2; i<11; i++) {
     sPage +=' <a class="ipp_link" href="#result_grid"\>'+i+'</a> ';
    }
    document.writeln("<td class='prev_next_button'>"+genIPPButtonLink("first",true)+genIPPButtonLink("prev5",true)+genIPPButtonLink("prev",true)+"<span class='ipp_cur_link'>1</span> "+sPage+"&nbsp;"+genIPPButtonLink("next")+genIPPButtonLink("next5")+genIPPButtonLink("last")+"</td>");
  }
  
  if (aHasPages || aSearchResultCount) {
    endTr();
  }

  if (aGroupButton!=null) {
    document.writeln("<tr style='padding-top:8px;'> <td colspan='2'>");
    aGroupButton.execute();
    endTd();
    endTr();
  }

  endTable();
  genRowEnd();
}

function genIPPButtonLink(aClass, aNotLink) {
  var sTitle='';
  if (aClass=='next') sTitle='Next';
  else if (aClass=='prev') sTitle='Previous';
  else if (aClass=='next5') sTitle='Next 10';
  else if (aClass=='prev5') sTitle='Previous 10';
  else if (aClass=='first') sTitle='First';
  else if (aClass=='last')  sTitle='Last';
  return "<a class='btn_list_"+aClass+"' style=\""+(aNotLink?"cursor:default;":"")+"\" title=\""+sTitle+"\" onclick=\"\">&nbsp;</a>";
}

function genGridTitle(aTitle, aColSpan){
  startTr();
  document.writeln("<td class='grid_title' colspan='"+aColSpan+"'>");
  document.writeln("<table class='grid_hdr' cellpadding='0' cellspacing='0'>");
  startTr();
  document.writeln("<td class='grid_title'>"+aTitle+"</td>");
  //document.write("<td class='back_to_top'><a class='back_to_top' onclick='javascript:window.location.href=\"#\"'>Back to Top</a></td>");
  document.write("<td class='back_to_top'>&nbsp;</td>"); // back to top not needed-mike
  endTr();
  endTable();
  endTd();
  endTr();
}

// framework request # 6 - requested by Jolin. 2006/10/16.
function genGridHeader(aName,aHeaders,aWidths, aSortable, aHasCheck, aTitle, aClass){
  document.writeln("<tr id='HEADER_"+aName+"' class='grid_hdr'>");
  if(aHasCheck){
    document.write("<td width='4%' style='text-align:center;'>");
    document.write("<input type='checkbox' name='GRID_CHK_ALL_"+aTitle+"'onclick='checkAll(this.checked,document.frmSOP.GRID_CHK_"+aTitle+")'>");
    //document.write(genImage("check.gif")+"all");
    document.writeln("</td>");
  }
  for(var i = 0; i < aHeaders.length;i++){
    var sClass="";
    var sClassFromParam="";
    if (aClass) sClassFromParam = aClass[i];
    if(aSortable[i]== true) {
      sClass="class='grid_hdr_sort"+((sClassFromParam)?"_"+sClassFromParam:"")+"'";
      // sClas="class='grid_hdr_sort_chinese'";
    } else {
      if (sClassFromParam) {
        sClass="class='grid_hdr_"+sClassFromParam+"'";
      }
    }
    
    document.writeln("<td "+sClass+" width='"+aWidths[i]+"'>"+aHeaders[i]+"</td>");
  }
  endTr();
 // alert(document.getElementById("HEADER_"+aName))
  //initSorting('HEADER_'+aName,sSortArray);	
}

// framework request # 6 - requested by Jolin. 2006/10/16.
function genGridContent(aNumericCols, aColumns, aHasCheck, anOnClick, aTitle,aLength){
  var sClass;
  var i;
  if (!aColumns) {
    document.writeln("<tr class='grid_row_odd'> <td class='no_records_retrieved' colspan=\""+aLength+"\">");
    document.writeln("No Rows Retrieved");
    document.writeln("</td> </tr>");
    return;
  }
  for(i = 0; i < aColumns.length; i++){
    var values=aColumns[i];
    sClass="grid_row_even";
    if(i%2 == 0)
      sClass="grid_row_odd";
    var sOnClick="";
    if(anOnClick){
      if(anOnClick[i])
        sOnClick="onclick=\""+anOnClick[i]+"\"";
      else
        sOnClick="onclick=\""+anOnClick+"\"";
    }
    if(anOnClick)
      document.writeln("<tr class='"+sClass+"' onmouseover='highlightRow(this);return true;' onmouseout='unhighlightRow(this);return true;'>");
    else
      document.writeln("<tr class='"+sClass+"'>");
   
    if(aHasCheck)
      document.writeln("<td class='grid_cell' style='text-align:center;'><input type='checkbox' name='GRID_CHK_"+aTitle+"'onclick='checkCheckAll(document.frmSOP.GRID_CHK_ALL_"+aTitle+", document.frmSOP.GRID_CHK_"+aTitle+")' onclick=''></td>");
  
   // if(anOnClick)
   //   document.writeln("<a "+sOnClick+">");
    for(var j = 0; j < values.length; j++){
      var sCellClass="grid_cell";
      if(aNumericCols[j]){
        sCellClass="grid_cell_numeric";
        if(aNumericCols[j]=="middle")
          sCellClass="grid_cell_center";
      }
      if(values[j]=="")
        values[j]="&nbsp;" 
      document.writeln("<td class='"+sCellClass+"' "+sOnClick+">"+values[j]+"</td>");
    }
    endTr(); 
   // document.writeln("</a>");
  }
}

function genTotalRow(aColumns, aTotalValues){
  var nLength = 1;
  var sClass;
  alert(aColumns);
  if(!aTotalValues[0])
    aTotalValues=new Array(aTotalValues);
  if (aColumns.length>1) 
    nLength = aColumns[0].length-aTotalValues.length;
  if(i%2 == 0)
    sClass="grid_odd";
  else sClass="grid_even";
  document.writeln("<tr class='"+sClass+"'>"); 
  document.writeln("   <td class='grid_total' colspan='"+(nLength).toString()+"'>Total:</td>");   
  for(var i=0;i<aTotalValues.length;i++)
    document.writeln("   <td class='grid_cell_numeric'>"+aTotalValues[i]+"</td>");   
  endTr();
}



function genButtonRow(aButtons, aOnClick, aCss) {
  genExtendedButtonRow(false,false,false,aButtons, aOnClick, aCss);
}

function genExtendedButtonRow(aLButtons, aLOnClick, aLCss, aRButtons, aROnClick, aRCss){
  genRowStart();
  
  document.writeln("<table class='button' border='0'>");
  startTr();
  document.writeln("<td class='button_left'>");
 // document.write("<a class='back_to_top' href='#'>Back to Top</a>");
  if (aLButtons) document.writeln(genButtonString(aLButtons, aLOnClick, aLCss));
  document.write("&nbsp;");
  endTd();
  document.writeln("<td class='button'>");
  if (aRButtons) document.writeln(genButtonString(aRButtons, aROnClick, aRCss));
  endTd();
  endTr();
  endTable();
  genRowEnd();
}

function genButtonString(aButtons, aOnClick, aCss) {
  var s="";
  for(var i=0;i<aButtons.length; i++){
    var sOnClick="";
    var sClass="btn";
    if(aOnClick)
      sOnClick=aOnClick[i];
    if (aCss) {    
      if (aCss[i]!='') sClass = aCss[i];
    }
    s = s + genButton(aButtons[i], sOnClick, sClass);
  }
  return s;
}

function genButton(aLabel, aOnClick, aClass){
  var sOnClick="";
  var sClass="btn";
  if(aOnClick)
    sOnClick="onclick=\""+aOnClick+"\"";
  if (aClass) 
    sClass = aClass;
  return "<a class='"+sClass+"' onmouseover='highlight(this);' onmouseout='unhighlight(this);' "+sOnClick+">"+aLabel+"</a>";
}

function genGridButtonRow(aButtons, aOnClick, aButtonClass){
  genRowStart();
  var sClass
  document.writeln("<table class='button' border='0'>");
  startTr();
  startTd();
  endTd();
  document.writeln("<td class='button'>");
  for(var i=0;i<aButtons.length; i++){
    sOnClick="";
    sClass="btn";
    if (aButtonClass) {    
      if (aButtonClass[i]!='') sClass = aButtonClass[i];
    }
    if(aOnClick)
      sOnClick="onclick=\""+aOnClick[i]+"\"";
    document.writeln("<a class='"+sClass+"' onmouseover='highlight(this);' onmouseout='unhighlight(this);' "+sOnClick+">"+aButtons[i]+"</a>");
  }
  endTd();
  endTr();
  endTable();
  genRowEnd();
}

function genGridButtonRow2(aButtons, aOnClick){
  
  document.writeln("<td class='button'>");
  for(var i=0;i<aButtons.length; i++){
    sOnClick="";
    if(aOnClick)
      sOnClick="onclick=\""+aOnClick[i]+"\"";
    document.writeln("<a class='btn' onmouseover='highlight(this);' onmouseout='unhighlight(this);' "+sOnClick+">"+aButtons[i]+"</a>");
  }
    endTd();
}

function genDiffButtonRow(aButtons, aOnClick, aCss){
  genRowStart();
  
  document.writeln("<table class='button' border='0'>");
  startTr();
  startTd();
 // document.write("<a class='back_to_top' href='#'>Back to Top</a>");
  document.write("&nbsp;");
  endTd();
  document.writeln("<td class='button'>");
  for(var i=0;i<aButtons.length; i++){
    sOnClick="";
    if(aOnClick)
      sOnClick="onclick=\""+aOnClick[i]+"\"";

    document.writeln("<a class='" + aCss[i] + "' href='#' onmouseover='highlight(this);' onmouseout='unhighlight(this);' "+sOnClick+">"+aButtons[i]+"</a>");
  }
  endTd();
  endTr();
  endTable();
  genRowEnd();
}

function genStandardSpaceTR(){
  genRowStart();
  document.write("<br>");
  genRowEnd;
}

function genSpaceTR(aSpace){
  document.write("<tr height=\""+aSpace+"px\">");
  document.write("<td> &nbsp; </td>");
  document.write("</tr>")
 // document.write("<br>");
}

function genLink(aLabel, aLink){
  var sHref = "";
  if(aLink)
    sHref="href='"+aLink+"' ";
  return "<a "+sHref+"class='out' onmouseover='this.className=\"over\"' onmouseout='this.className=\"out\"'>"+aLabel+"</a>";
}

function genSectionHeader(aLabel){
  genRowStart();
  document.write("<table cellpadding='0' cellspacing='0' class='section_hdr'>");
  startTr();
  genTd(aLabel);
  endTr();
  endTable();
  genRowEnd();
}

function genPageHeader(aLabel,isModal){
  genRowStart();
  document.writeln("<table width='100%' cellspacing='0' cellpadding='0'>");
  document.writeln("<tr>");
  document.writeln("<td class='page_hdr'>"+aLabel+"</td>");
  document.writeln("</tr>");
  //genSpaceTR('2');
  if (isModal) 
    genLineTR();
  else
    document.writeln("<tr><td class='page_hdr_line'><img width=\"840px\" src=\"../../images/hr_section_hdr.gif\"></td></tr>")
  document.writeln("</table>");
  genRowEnd();
}

function genNavLink(aLabels, aLinks){
  document.writeln("<tr class='navi_row'>");
  startTd();
  document.writeln("<table width='100%' cellspacing='0' cellpadding='0'>");
  document.writeln("<tr class='navi_bar'>");
  document.writeln("<td>");
  for(var i=0;i<aLabels.length;i++){
    if(i!=0)
      document.write("<span>>></span>");
    document.write(genLink(aLabels[i],aLinks[i]));
  }
  document.writeln("</td>");
  document.writeln("</tr>");
  document.writeln("</table>");
  genRowEnd();
}

// copied from error_msg.js
function genJsErrorRow(){
  genRowStart();
  document.writeln("<TABLE  id='_ERROR_TABLE' BORDER=0 CELLPADDING=0 CELLSPACING=0 class=\"error_test\">");
  document.writeln("  <TR>");
  document.writeln("    <TD class='ErrorHeader' id='_ERROR_HDR'></TD>");
  document.writeln("  </TR>");
  document.writeln("  <TR>");
  document.writeln("    <TD class='ErrorItem' id='_ERROR_ITEM'></TD>");
  document.writeln("  </TR>");
  document.writeln("</TABLE>");  
  genRowEnd();
}

function genInfoRow(){

  genRowStart();
  document.writeln("<TABLE  id='_INFO_TABLE' BORDER=0 CELLPADDING=0 CELLSPACING=0>");
  document.writeln("  <TR>");
  document.writeln("    <TD class='InfoMsg' id='_INFO_MSG'></TD>");
  document.writeln("  </TR>");
  document.writeln("</TABLE>");  
  genRowEnd();
}

function genMessagesRow() {
  genInfoRow();
  genJsErrorRow();
}

function showPageAck(anAckMsg) {
  var infoMsg =window.top.document.getElementById("_INFO_MSG");
  var sStr='';
  sStr += '<TABLE  BORDER=0 CELLPADDING=0 CELLSPACING=0> <tr> <td class=\"status_info_img\">';
  sStr += '&nbsp;</td><td class=\"InfoMsg\">';
  sStr += anAckMsg;
  sStr += '</td></tr></table><br>';
  infoMsg.innerHTML += sStr;
}

function showPageWarn(anWarnMsg) {
  var warnMsg =window.top.document.getElementById("_INFO_MSG");
  var sStr='';
  sStr += '<TABLE  BORDER=0 CELLPADDING=0 CELLSPACING=0> <tr> <td class=\"status_warn_img\">';
  sStr += '&nbsp;</td><td class=\"WarnMsg\">';
  sStr += anWarnMsg;
  sStr += '</td></tr></table> <br>';
  warnMsg.innerHTML += sStr;
}


function showPageError(aHeader, ErrorMsg) {
 // if (ErrorMsg.length <= 0) return;
  // Write error header.
  var errTable=window.top.document.getElementById("_ERROR_TABLE");
  var errHeader=window.top.document.getElementById("_ERROR_HDR");
  var errItem =window.top.document.getElementById("_ERROR_ITEM");
  errTable.style.display="";
  // Write error messages.
  var sStr='';
  sStr += '<TABLE  BORDER=0 CELLPADDING=0 CELLSPACING=0> <tr> <td class=\"status_error_img\">';
  sStr += '&nbsp;</td><td class=\"ErrorMsg\">';
  sStr += aHeader;
  sStr += '</td></tr></table>';
  
  errHeader.innerHTML += sStr;
  if (ErrorMsg) {
  
    for (var i=0; i<ErrorMsg.length; i++) {
      var sErrMsg = ErrorMsg[i];
      if ( sErrMsg.substring(sErrMsg.length-2, sErrMsg.length) == ".." )
        sErrMsg = sErrMsg.substring(0, sErrMsg.length-1);
      var iIndex = sErrMsg.indexOf("(Item ");
      var iItemNo="-1";
      if (iIndex>-1) iItemNo = sErrMsg.substring(iIndex+6,sErrMsg.length-1); 
      iItemNo = parseInt(iItemNo)-1;   
      sErrMsgLink = "<a class=\"error_link\" name=\"_ERROR_ITEM_"+(i+1)+"\" href=\"\">"+ sErrMsg +"</a>";
      errItem.innerHTML += (i+1) + ". " +  sErrMsgLink + "<br>";    
    }
  } else {

  }
  
   errItem.innerHTML += "<br>";
}

function checkAll(aCheck, aCheckboxes){
  if(aCheckboxes.length){
    for (var i=0;i<aCheckboxes.length;i++){
      aCheckboxes[i].checked= aCheck;
    }
  }else if (aCheckboxes != null){
    aCheckboxes.checked=aCheck;
  }
}

function checkCheckAll(aCheckAll, aCheckboxes){
  if(aCheckboxes.length){
    var bChecked=true;
    for (var i=0;i<aCheckboxes.length;i++){
      if(!aCheckboxes[i].checked){
        bChecked=false;
      }
    }
    aCheckAll.checked=bChecked;
  }else if (aCheckboxes != null){
    aCheckAll.checked=aCheckboxes.checked;
  }
}

function genTabs(anArrayName, anArrayLink, aSelName) {
  document.writeln("<div class=\"submenu\"> ");
  document.writeln("  <ul>");
  document.writeln("    <li class=\"lpad\"><a>&nbsp;</a></li> ");
  
  for (var i=0; i<anArrayName.length; i++) {
  //    alert("    <li "+ ((aSelName.toUpperCase()==anArrayName[i].toUpperCase())?"class=\"sel\"":"")+"><a href=\""+(anArrayLink[i]?anArrayLink[i]:"#")+"\">"+anArrayName[i]+"</a></li> ");
    document.write("    <li "+ ((aSelName.toUpperCase()==anArrayName[i].toUpperCase())?"class=\"sel\"":"")+">");
    if(aSelName.toUpperCase()==anArrayName[i].toUpperCase())
      document.write("<a>"+anArrayName[i]+"</a>");
    else
      document.write("<a href=\""+(anArrayLink[i]?anArrayLink[i]:"#")+"\">"+anArrayName[i]+"</a>");
    document.write("</li> ");
  }
  
  document.writeln("    <li class=\"rpad\"><a>&nbsp;</a></li> ");
  document.writeln("   </ul>");
  document.writeln(" </div>");
}

function genImage(aFilename){
  return "<img border='0' src='../../images/"+aFilename+"'>";
}

// framework request # 1 - requested by Jolin. flexible function for creating row
function genMultiTextTrSpa(aTdTexts,aTdClasses,aTdStyles){
  genRowStart();
  document.writeln("<table width='100%'>");
  startTr();
  for(var i = 0; i < aTdTexts.length; i++){
    var sTd = "<td class='"+aTdClasses[i]+"'";
    if (aTdStyles) {
      sTd = sTd + " style='"+aTdStyles[i]+"'";
    }
    sTd = sTd + ">" + aTdTexts[i]+"</td>";
    document.writeln(sTd);
  }
  endTr();
  endTable();
  genRowEnd();
}

function displayGrid(){
  document.getElementById("result_grid").style.display="";
  window.location.href="#result_grid";
}

function hideGrid(){
  document.getElementById("result_grid").style.display="none";
}

function genBuGrid(){
  genGridWithCheckbox("Bring-Up Items",
    ["Recipient(s)","Subject","Notification Date"],
    ["30%","48%","22%"],
    [false, true, true],
    [false, false, true],
    [["XXX","XXXXXXXXXX","01/10/2006"],
    ["XXX","XXXXXXXXXX","31/08/2006"]],
    "openSOPDialog('../bu/sbu00203.html','Bring-up Item')"
  );
  genGridButtonRow(["Add","Delete"],["openCMSDialog('../bu/sbu00202.html','Bring-up Item')",""]);
}

function genReportLinks(aLabels, aLinks){
  for (var i=0;i<aLabels.length;i++){
    genRowStart();
    document.writeln("<a href='#' onclick='reportWin=window.open(\""+aLinks[i]+"\",\"REPORT_WIN\",\"toolbar=no,resizable=yes,left=0,width=785\");reportWin.focus();'>"+aLabels[i]+"</a>");
    genRowEnd();
  }
}

function genFileField(aLabel, aName, aLength){
  genStandardTr(aLabel, genFile(aName, aLength));
}

function genFile(aName,aLength){
  var nSize = aLength+1;
  var nMaxSize=90;
  if(window.top.dialogArguments)
    nMaxSize=59;
  if (nSize > nMaxSize)
    nSize = nMaxSize;
  return "<input type='file' name='"+aName+"' size='"+nSize+"' maxLength='"+aLength+"'>";
}

function genScreenLabel(aScreenId) {
  document.writeln(" <table class='left_pane_lbl' width='100%' cellspacing='0' cellpadding='0' border='0'> ");
  genRowStart();
  document.writeln("<span class='ScreenLabel'>"+aScreenId+"</span>");
  genRowEnd();
  genRowStart();
  document.writeln("<br>");
  genRowEnd();
  document.writeln("</table>");
}

function createFunctionBox(aFuncBoxName, anItems, aScripts) {
  genRowStart();
  document.writeln("<table class='grid_leftpane' cellspacing='0' cellpadding='0' border='0'>");
  document.writeln("  <tr>");
  document.writeln("  <td class='grid_leftpane_hdr'> <span class='collapser_up' onclick='toggle_sidebox(this)'>"+aFuncBoxName+"&nbsp;</span></td>");
  document.writeln("  </tr>");
  document.writeln("  <tr class='grid_leftpane_items_dummy' > <td>");
  document.writeln(" <table class='grid_leftpane_items' cellspacing='0' border='0'>");
  
  for (i=0; i<anItems.length; i++) {
    var sScript="";
    if (aScripts) {
      if (aScripts[i]) {
        sScript = aScripts[i];
      } 
    }
    document.writeln("<tr onmouseover=\"section_highlight(this,true);window.top.status='"+anItems[i]+"';return true;\" onmouseout=\"section_highlight(this,false); window.top.status = \'\'; return true;\" onclick=\""+sScript+";\">");
    document.writeln("<td class='grid_leftpane_items_ptr'><img src='../../images/bullet.gif' border=0></td>");
    document.writeln("  <td class='grid_leftpane_items'>");
    document.write("   <a ");
    document.write("   onmouseout=\"this.style.textDecoration='none'; window.top.status = ''; return true;\""); 
    document.write("   onmouseover=\"this.style.cursor='hand'; this.style.textDecoration='none'; window.top.status='"+anItems[i]+"'; return true;\""); 
    document.write("   onfocus=\"window.top.status ='"+anItems[i]+"'; return true;\"");
    document.write("   onblur=\"window.top.status = ''; return true;\"");
    document.write("   >"+anItems[i]+"</a>");
    document.writeln("                    </td>");
    document.writeln("                   </tr> ");
  }
  
  document.writeln("</table>");
  genRowEnd();
  document.writeln("</table><br>");
  genRowEnd();

}

function leftColumnStart() {
  document.writeln("<td class=\"left_col\">");
  document.writeln("  <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">");
  genStandardSpaceTR();
  document.writeln("    </table>");
}

function leftColumnEnd() {
  document.writeln("    </td>");
}

function genBackToTopLink() {
  document.writeln("<tr> <td class=\"back_to_top_link\">");
  document.writeln(genLink("Back to Top", "#"));
  document.writeln("</td> </tr>");
}


// WIP - Mike


function genFilter() {
  var sStr='';
  sStr+="<tr><td><table><tr>";
  sStr+="  <td class='lbl'>&nbsp;</td>";
  sStr+="  <td class='filter_label'><i>Field</i></td>";
  sStr+="  <td class='filter_label'><i>Condition</i></td>";
  sStr+="  <td class='filter_label'><i>Value</i></td>";
  sStr+="  <td class='filter_label'>&nbsp;</td>";
  sStr+="</tr><tr>";
  sStr+= "  <td class='lbl'>"+genLabel("Filter",false)+ "</td>";
  sStr+= "  <td>"+genSelect("FILTER_SELECT1", ["Name","Others"], ["1","2"], "1")+"</td>"
  sStr+= "  <td>"+ genSelect("FILTER_SELECT2", ["Equals","dsa"], ["1","2"], "1")+"</td>"
  sStr+= "  <td>"+genTextBox("FILTER_TEXT1", 30, "")+"</td>"
  sStr+= "  <td>"+genFilterButton("FILTER", "Apply", "")+"</td>";
  sStr+="  </tr>";
  sStr+="</table></td></tr>";
    
  document.writeln(sStr);
  //genStandardTr(),genSelect("TEST", ["1","2"], ["1","2"], "1") + genSelect("TEST", ["1","2"], ["1","2"], "1") + genSelect("TEST", ["1","2"], ["1","2"], "1"))
}

function genFilterButton(aName, aButtonName, anAction){
//return '';
  var gButton = new GroupButtons();
  gButton.addButton(showFilterButton, "TBBOT_" + aName, aButtonName, anAction,LEFT);  
  
  return gButton.construct(LEFT);
  //return showEllipsisButton("USER_ELIPSIS_"+aName,aUrl);
}

function genStatic(aValue) {
  if (!aValue || aValue=='') {
    return '-';
  } else {
    return aValue;
  }
}

function getDateToday() {
  var dNow = new Date();
  var sdf = new SimpleDateFormat('dd/MM/yyyy');
  var sToday = sdf.format(dNow);
    
  return sToday;
}

function genTBodyStart(aID, aShow) {
	var sShow = (!aShow ? 'display:none' : '');
	document.writeln("<tbody id='"+aID+"' style='"+sShow+"'>");
	//return '<tbody id=tbDtl style="display:none">';
}

function genTBodyEnd(aID) {
	document.writeln("</tbody>");
}

function insertCheck() {
  var img=""
  img += "<table cellpadding='0' border='0' cellshading='0' width='100%' height='100%'>"
  img += "<tr> <td style=\"text-align:'center';\">"
  img += "<img src=\"../../images/check.gif\">";
  img +="</td> </tr> </table>"
  return img;
}
