var RECORDSET_filter_or_rows = 20;
var RECORDSET_filter_win;

function RECORDSET_isNumber(str) {
  var validChars = "0123456789";
  var seen_decpoint = false;
  for (var i=0; i<str.length; i++) {
    if (str.charAt(i) == '.' && ! seen_decpoint) seen_decpoint = true;
    else if (validChars.indexOf(str.charAt(i)) == -1) return false;
  }
  return true;
}

function RECORDSET_isDate(str) {
  var ar = str.match(/^(\d\d?)\/(\d\d?)\/(\d\d+)$/);
  if (! ar) return false;
  var m = ar[1]; var d = ar[2]; var y = ar[3];
  if (!(m<=12 && m>0)) return false;
  if (!(d<=31 && d>0)) return false;
  if (!(y.length == 2 || y.length == 4)) return false;
  if ((m==4||m==6||m==9||m==11) && d==31) return false;
  if ((m==2)&&(d>29||(d==29&&(!(y%4==0&&(y%100!=0||y%400==0)))))) return false; 
  return true;
}


function RECORDSET_apply_filter() {
  var f = RECORDSET_filter_win.frames[0].document.forms[0];

  var filter = '';
  var arg = '';

  // collect all where clauses
  for (var i=0; i < RECORDSET_filter_or_rows; i++) {

    var col = f.elements['col'+i].options[f['col'+i].selectedIndex].value;
    var op  = f.elements['op'+i].options[f['op'+i].selectedIndex].value;
    var cs  = f.elements['cs'+i].checked; // case sensitive
    var fs  = f.elements['fs'+i].checked; // fuzzy search

    var val_ref;
    var d = RECORDSET_filter_win.frames[0].document;

    // Wierd! - can't access val by form name in IE because it 
    // might been been manipulated using DOM methods
    // added using DOM methods
    if (d.getElementById) {
      var td = d.getElementById('val'+i);
      val_ref = td.firstChild;
    } 
    // ns4 does not use DOM so just get val_ref by name
    else {
      val_ref = f.elements['val'+i];
    }

    // if user wants to filter on this col (col is defined)
    if (col != '') {
      var val = '';
      if (val_ref.type == 'text') {
        val = val_ref.value;
      }

      // val must be a multi-select so set tmp = selected opts
      else {
        for (var val_idx=0; val_idx < val_ref.options.length; val_idx++) {
          if (val_ref.options[val_idx].selected) {
            if (val != '') val += '~,~';
            val += val_ref.options[val_idx].value;
          }
        }  
      }

      // verify data
      if (op != 'like' && op != 'not like' && op != 'in' && op != 'not in') {
        if (RECORDSET_schema[col][1] == 'num') {
          if (! RECORDSET_isNumber(val)) {
            RECORDSET_filter_win.alert('invalid number');
            if (val_ref.focus)  val_ref.focus();
            if (val_ref.select) val_ref.select();
            return false;
          }   
        }
        else if (RECORDSET_schema[col][1] == 'date') {
          if (! RECORDSET_isDate(val)) {
            RECORDSET_filter_win.alert('invalid date - use format mm/dd/yyyy');
            if (val_ref.focus)  val_ref.focus();
            if (val_ref.select) val_ref.select();
            return false;
          }   
        }
      }

      // if fuzzy search and applicable operator then add stars
      else if (fs == true && (op == 'like' || op == 'not like')) {
        val = '*'+val+'*';
      }

      if (arg != '') arg += '~|~';
      arg += col + '~,~' + op + '~,~' + val;

      // add case sensitive flag if were doing case sensitive
      if (cs == true) arg += '~CS~';
    } 
  }

  // close filter window
  RECORDSET_filter_win.close();
  RECORDSET_filter_win = null;

  //window.alert(arg);

  // update parent recordset with new filter
  var f = window.document.RecordSet;
  f.RECORDSET_cmd.value = 'add_filter_v2';
  f.RECORDSET_arg1.value = arg;
  f.submit();
}

// automatically includes IN and NOT IN options if 
// browser supports DOM standard and option list exists
function RECORDSET_update_op(i) {

  // if browser doesn't support DOM just return
  if (!(document.createElement && document.getElementById)) return false;

  var d = RECORDSET_filter_win.frames[0].document;
  var f = d.forms[0];
  var sel = d.getElementById('op'+i);
  var tmp = d.getElementById('col'+i);
  var col_alias = tmp.options[tmp.selectedIndex].value;
  var td = d.getElementById('val'+i);
  var val = td.firstChild;

  // if no IN/NOT IN operator - add them if options are available
  if (RECORDSET_schema[col_alias][2] && sel.length == 8) {

    var o;

    o = d.createElement('option');  
    o.value = 'in';
    o.appendChild( d.createTextNode('in') );
    sel.appendChild(o);

    o = d.createElement('option');  
    o.value = 'not in';
    o.appendChild( d.createTextNode('not in') );
    sel.appendChild(o);

    // autoselect IN if no value defined
    if (val.type == 'text' && val.value == '') {
      f['fs'+i].checked = false; 
      
      sel.selectedIndex = 8;

      // WIERD bug in IE sometimes does not visabiliy change the operator
      // so user is misinformed - when this happens just
      // select the 'like' option
      if (sel.options[sel.selectedIndex].selected == false)
        sel.selectedIndex = 0;

    }

  }

  // else if there are no options and there is IN/NOT IN operators - delete them
  else if ( (! RECORDSET_schema[col_alias][2]) && sel.length == 10) {
    if (sel.selectedIndex > 7) sel.selectedIndex = 0;
    sel.remove(9);
    sel.remove(8);
  }

  // if op is not IN/NOT IN 
  // and type == char autoselect fuzzy search
  if (sel.selectedIndex < 2) {
    f['fs'+i].checked = true; 
  }

  // else don't select fuzzy search
  else {
    f['fs'+i].checked = false; 
  } 

  // update value html element
  RECORDSET_update_val(i);


  return true;
}

// update val input type (text box || select list) i = where clause index 
function RECORDSET_update_val(i) {

  // if browser doesn't support DOM just return
  if (!(document.createElement && document.getElementById)) return false;


  var d = RECORDSET_filter_win.frames[0].document;
  var tmp;
  tmp = d.getElementById('col'+i);
  var col_alias = tmp[tmp.selectedIndex].value;
  tmp = d.getElementById('op'+i);
  var op = tmp[tmp.selectedIndex].value;
  var td = d.getElementById('val'+i);
  var val = td.firstChild;

  // if input type is TEXT and it should be select box => change to select box
  if (val.type == 'text' && (op == 'in' || op == 'not in')) {
    var select = d.createElement('select');
    select.name = 'val' + i;
    select.multiple = true;
    var opts = RECORDSET_schema[col_alias][2];
    for (var i=0; i<opts.length; i++) {
      var o = d.createElement('option');
      o.value = opts[i];
      o.appendChild(d.createTextNode(opts[i]));
      select.appendChild(o);
    }
    if (select.length > 5) {
      select.size = 5;
    } else {
      select.size = select.length;
    }
    td.replaceChild(select,val);
  }

  // if input type is SELECT box and it should be text => change to text
  else if (val.type == 'select-multiple' && op != 'in' && op != 'not in') {
    var txt_input = d.createElement('input');
    txt_input.type = 'text';
    txt_input.name = 'val' + i;
    td.replaceChild(txt_input,val);
  }

  // focus on value field
  if (val.focus) RECORDSET_filter_win.setTimeout(
    "var d = window.frames[0].document;" +
    "var td = d.getElementById('val"+i+"');" +
    "var val = td.firstChild;"            +
    "if (val.focus) val.focus(); " , 100);

  return true;
}

function RECORDSET_filter(col_name) {

  // is there already a filter window open?
  if (RECORDSET_filter_win && RECORDSET_filter_win.close) {
    RECORDSET_filter_win.close();
    RECORDSET_filter_win = null;
  }
  

  // open filter framset window
  var w = RECORDSET_opwin('','FilterParent','resizable,scrollbars',520,160);

//  w.onerror = function (message) {
//    window.alert(message);
//    window.close();
//  }


  RECORDSET_filter_win = w;
  w.focus();
  var d = w.document.open();
  d.write("<HTML><HEAD><TITLE>Filter RecordSet</TITLE></HEAD><FRAMESET ROWS='*,36' FRAMEBORDER=0 FRAMESPACING=0><FRAME SRC=\"javascript:''\" NAME=filter_form><FRAME SRC=\"javascript:''\" NAME=filter_ctrl SCROLLING=no></FRAMESET></HTML>");
  d.close();

  // print filter form
  d = w.filter_form.document.open();
  var col_alias;
  var col_list = '';
  for (var i=0; i < RECORDSET_sorted_cols.length; i++) {
    var col_alias = RECORDSET_sorted_cols[i]; 
    col_list += "<OPTION VALUE='"+col_alias+"'>"+RECORDSET_schema[col_alias][0];
  }
  d.open();
  d.write("<HTML><BODY><FORM><CENTER><TABLE CELLPADDING=0 CELLSPACING=0 BORDER=0>");

  for (var i=0; i < RECORDSET_filter_or_rows; i++) {
    d.write("<TR><TD COLSPAN=3>&nbsp;</TD></TR><TR><TD><SELECT NAME=col"+i+" ID=col"+i+" onchange=\"parent.opener.RECORDSET_update_op("+i+"); return true;\"><OPTION VALUE=''>"+col_list+"</SELECT></TD><TD><SELECT NAME=op"+i+" ID=op"+i+" onchange=\"parent.opener.RECORDSET_update_val("+i+");\"><OPTION VALUE='like'>like<OPTION VALUE='not like'>not like<OPTION VALUE='='>=<OPTION VALUE='!='>!=<OPTION VALUE='<'>&#60;<OPTION VALUE='<='>&#60;=<OPTION VALUE='>'>&#62;<OPTION VALUE='>='>&#62;=</SELECT></TD><TD ID=val"+i+"><INPUT TYPE=TEXT NAME=val"+i+" VALUE=''></TD></TR> <TR><TD COLSPAN=3 ALIGN=CENTER NOWRAP><INPUT TYPE=CHECKBOX NAME=cs"+i+" VALUE=1><FONT SIZE=-1>case sensitive</FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<INPUT TYPE=CHECKBOX NAME=fs"+i+" VALUE=1 CHECKED><FONT SIZE=-1>fuzzy search</FONT></TD></TR><TR><TD COLSPAN=3>&nbsp;</TD></TR>");

    if (i != (RECORDSET_filter_or_rows - 1))
      d.write('<TR><TD COLSPAN=3 ALIGN=CENTER BGCOLOR=#efefef><B>- OR -</B></TD></TR>');
  }
  d.write("</TABLE></CENTER></FORM></BODY></HTML>");
  d.close();

  // print command bar
  d = w.filter_ctrl.document.open();
  d.write("<HTML><HEAD><TITLE>Filter RecordSet</TITLE><STYLE> BODY { margin-top: 4; margin-right: 0; margin-bottom: 0; margin-left: 0; padding-top: 0; padding-bottom: 0; padding-right: 0; padding-left: 0; border-top: 0; border-bottom: 0; border-right: 0; border-left: 0; border-style: 0; } </STYLE></HEAD><BODY BGCOLOR=#CCCCCC><FORM><CENTER><TABLE WIDTH=80% CELLPADDING=0 CELLSPACING=0><TR><TD><INPUT TYPE=BUTTON VALUE=close onclick='parent.close();'></TD><TD ALIGN=RIGHT><INPUT TYPE=BUTTON VALUE=apply onclick='parent.opener.RECORDSET_apply_filter();'></TD></TR></TABLE></CENTER></FORM></BODY></HTML>");
  d.close();

  //auto select col col_name if defined
  if (col_name) {
    var e = w.frames[0].document.forms[0].col0;
    for (var i=0; i < e.options.length; i++) {
      if (e.options[i].value == col_name) {
        w.frames[0].document.forms[0].col0.selectedIndex = i;
        RECORDSET_update_op(0);
        
        break;
      }
    }
  }
}

// special open window code (auto centers based on parent)
function RECORDSET_opwin (lnk,target,opts,w,h) {
  if (window.screen && w && h) {
    var s = window.screen;
    var max_width = s.availWidth - 10;
    var max_height = s.availHeight - 30;
    if (opts.indexOf('toolbar',0) != -1) max_height -= 40;
    if (opts.indexOf('menubar',0) != -1) max_height -= 35;
    if (opts.indexOf('location',0) != -1)max_height -= 35;
    var width  = (w > max_width)?max_width:w;
    var height = (h > max_height)?max_height:h;
    var par_left_offset = (window.screenX == null)?0:window.screenX;
    var par_top_offset  = (window.screenY == null)?0:window.screenY;
    var par_width;
    if (window.outerWidth != null) {
      par_width = window.outerWidth;
      if (par_width < width)
        par_left_offset -= parseInt((width - par_width)/2);
    } else
      par_width = max_width;
          
    var par_height;
    if (window.outerHeight != null) {
      par_height = window.outerHeight;
      if (par_height < height) {
        par_top_offset -= parseInt((height - par_height)/2);
      }
    } else
      par_height = max_height;

    var left = parseInt(par_width /2 - width /2) + par_left_offset;
    var top  = parseInt(par_height/2 - height/2) + par_top_offset;

    var newopts = 'width='+width+',height='+height+',left='+left+',top='+top;
    opts = (opts && opts != '')?newopts+','+opts:newopts;
  }
  var wndw = window.open(lnk,target,opts);
  if (wndw.focus) wndw.focus();
  return wndw;
}

function RECORDSET_refresh () {
  var f = window.document.RecordSet;
  f.RECORDSET_cmd.value='refresh_page';
  f.submit();
}


var RECORDSET_oldWinName;
var RECORDSET_oldAction;

function RECORDSET_show ( view_name, lnk ) {
  var f = window.document.RecordSet;

  RECORDSET_oldWinName = window.name;
  RECORDSET_oldAction = f.action;

  if (view_name != 'excel' && view_name != 'html') {
    f.target = '_blank';
  }

  f.RECORDSET_view.value = view_name;

  if (lnk) {
    f.action = lnk;
  } else {
    var i = f.action.indexOf('#');
    if (i > 0) f.action = f.action.substring(0, i); 
  }
  f.submit();

  window.setTimeout("if (window.document.RecordSet) { window.document.RecordSet.RECORDSET_view.value = 'html'; window.document.RecordSet.target = RECORDSET_oldWinName; window.document.RecordSet.action = RECORDSET_oldAction; }", 100);
}

function RECORDSET_modify_column(col_i,col_alias) {
  var f = window.document.RecordSet;
  f.RECORDSET_cmd.value = 'modify_column';
  f.RECORDSET_arg1.value = col_i;
  f.RECORDSET_arg2.value = col_alias; 
  f.submit();
}

function RECORDSET_rm_column(col_i) {
  var f = window.document.RecordSet;
  f.RECORDSET_cmd.value = 'rm_column';
  f.RECORDSET_arg1.value = col_i;
  f.submit();
}

function RECORDSET_sort_descend(col_alias) {
  var f = window.document.RecordSet;
  f.RECORDSET_cmd.value = 'sort_descend';
  f.RECORDSET_arg1.value = col_alias;
  f.submit();
}

function RECORDSET_sort_ascend(col_alias) {
  var f = window.document.RecordSet;
  f.RECORDSET_cmd.value = 'sort_ascend';
  f.RECORDSET_arg1.value = col_alias;
  f.submit();
}

function RECORDSET_add_col(i, col_alias) {
  var f = window.document.RecordSet;
  f.RECORDSET_cmd.value = 'add_column';
  f.RECORDSET_arg1.value = i;
  f.RECORDSET_arg2.value = col_alias;
  f.submit();
}

