﻿// JScript File
var ranProcFormLabels = 0;

function procFormLabels() {
  var labels = document.getElementsByTagName("LABEL");
  if(labels) {
    for(var i = 0; i < labels.length; i++) {
      if(!labels[i].element) {
        var id = labels[i].htmlFor;
        var elm = (id ? document.getElementById(id) : null);
        if(elm) {
          elm.label = labels[i];
          elm.label.element = elm;
        }
      }
    }
  }
  ranProcFormLabels = 1;
}

function getFieldLabel(elm) {
  var label = elm.getAttribute("label");
  
  return (elm.label ? elm.label.innerHTML : ( label ? label : elm.name));
}

function getFieldValue(elm,all,sep) {
  var i = 0;
  var ret = "";
  var elms = null;

  if(elm.join && elm.length && all) {
    elms = elm;
    ret = new Array();
    for(i = 0; i < elms.length; i++)
      ret[ret.length] = getFieldValue(elms[i], all, "");
  } else if(elm.selectedIndex || elm.selectedIndex == 0) {
    if(elm.multiple) {
      ret = new Array();
      for(i = 0; i < elm.options.length; i++)
        if(elm.options[i].selected)
          ret[ret.length] = elm.options[i].value;
    } else if(elm.selectedIndex > -1 && elm.selectedIndex < elm.options.length)
      ret = elm.options[elm.selectedIndex].value;
  } else if (all && elm.type == "checkbox") {
    ret = new Array();
    elms = elm.form.elements[elm.name];
    if(!elms.type && elms.length > 1) {
      for(i = 0; i < elms.length; i++)
        if(elms[i].checked)
          ret[ret.length] = elms[i].value;
    } else if(elm.checked)
      ret[0] = elm.value;
  } else if(elm.type == "radio" || elm.type == "checkbox") {
    elms = elm.form.elements[elm.name];
    if(!elms.type && elms.length > 1) {
      for(i = 0; i < elms.length; i++)
        if(elms[i].checked)
          ret = elm.value;
    } else if(elm.cheched)
      ret = elm.value;
  } else if(elm.value)
    ret = elm.value;

  if(ret.join) {
    if(ret.length == 1)
      ret = ret[0];
    else if(sep || sep == "")
      ret = ret.join(sep);
  }

  return ret;    
}

function handleFieldFormat(elm) {
  var fmt = elm.getAttribute("format");
  var bar, bra, par, pos, cmd, qtp;
  var qt;
  var fmtElm = null;
  var fmtCmd = new Array();
  var fmtValue = "";
  var fmtParam = null;

  if(!fmt || !fmt.length)
    return "";

  bar = fmt.indexOf('|');
  if(bar<0)
    bar = fmt.length;
  while(bar >= 0) {
    cmd = 0;
    fmtElm = elm;
    fmtParam = new Array();
      
    bra = fmt.indexOf('[');
    par = fmt.indexOf('(');

    if(bra > 0 && bra < bar && ((par > 0 && bra < par) || 1)) {
      if(!cmd)
        cmd = bra;
      pos = fmt.indexOf(']', bra);
      if(pos > 0 && pos < bar && ((par > 0 && bra < par) || 1)) {
        fmtElm = fmt.substr(bra+1, pos - bra - 1);

        if(fmtElm.substring(0, 1) == "#")
          fmtElm = document.getElementById(fmtElm.substring(2, fmtElm.length));
        else {
          if((pos = fmtElm.indexOf(',')) > 1) {
            var h = pos;
            pos = parseInt(fmtElm.substring(h+1, fmtElm.length), 10);
            fmtElm = fmtElm.substring(0, h-1);
          } else
            pos = 0;
          
          fmtElm = elm.form.elements[fmtElm];
          if(fmtElm.length && !fmtElm.form)
            fmtElm = fmtElm[pos];
        }
      }
    }

    if(par > 0 && par < bar) {
      if(!cmd)
        cmd = par;
      qt = fmt.substr(par,1);
      while(qt == '(' || qt == ',') {        
        fmtValue = "";
        
        qt = fmt.substr(par+1,1);
        if(qt == '"' || qt == "'") {
          qtp = par+1;
          pos = fmt.indexOf(qt, par+1);
          while(fmt.substr(pos+1, 1) == qt)
            pos = fmt.indexOf(qt, pos+2);
            
          fmtValue = fmt.substr(qtp, pos-qtp);
          if(fmt.substr(pos+1,1) == ",")
            par = pos+1;
        } else {
          pos = fmt.indexOf(",", par+1)
          if(pos < par ||  pos > bar)
            pos = fmt.indexOf(")", par);
            
          fmtValue = fmt.substr(par+1, pos - par - 1);
          par = pos;
        }
        fmtParam[fmtParam.length] = fmtValue;
        qt = fmt.substr(par,1);
      }
      
    }

    if(!cmd)
      cmd = bar;

    pos = fmtCmd.length;
    fmtCmd[pos] = fmt.substr(0, cmd);
    fmtCmd['I_'+fmtCmd[pos]] = pos;
    fmtCmd['E_'+pos] = fmtElm;
    fmtCmd['P_'+pos] = fmtParam;

    if(bar < fmt.length) {    
      fmt = fmt.substr(bar+1, fmt.length);
      bar = fmt.indexOf('|');
      if(!bar)
        bar = fmt.length;
    } else
      bar = -1;
  }    

  if(!fmtCmd.length)
    return "";

  for(pos = fmtCmd.length-1; pos >= 0; pos--) {
    cmd = fmtCmd[pos];
    fmtElm = fmtCmd['E_'+pos];
    fmtParam = fmtCmd['P_'+pos];
    cmd = 'formatField' + cmd.substr(0, 1).toUpperCase() + cmd.substr(1,cmd.length).toLowerCase();
    cmdValue = "";
    if(eval('window.'+cmd))
      cmdValue = eval(cmd+"(elm,fmtElm,fmtParam)");
      
    if(cmdValue.length)
      return cmdValue;
  }
    
  return "";
}

function handleFieldReq(elm) {
  var req = elm.getAttribute("required");
  var pos = 0;
  var elms = null;
  var reqElm = null, reqType = 0;
  var reqValue = "";
  
  if(!req || !req.length)
    return "";
    
  if(req.substring(0,1) == "[" && (pos = req.indexOf(']')) > 1) {
    reqElm = req.substring(1, pos);
    req = req.substring(pos+1, req.length);
    if(reqElm.substring(0, 1) == "#")
      reqElm = document.getElementById(reqElm.substring(2, reqElm.length));
    else {
      
      if((pos = reqElm.indexOf(',')) > 1) {
        var h = pos;
        pos = parseInt(reqElm.substring(h+1, reqElm.length), 10);
        reqElm = reqElm.substring(0, h-1);
      } else if((pos = reqElm.indexOf('&')) > 1) {
        reqType = 1;
        reqElm = reqElm.split('&');
        pos = 0;
      } else
        pos = 0;
      
      if(reqElm.join) {
        elms = reqElm;
        reqElm = new Array();
        for(pos = 0; pos < elms.length; pos++) {
          reqElm[reqElm.length] = elm.form.elements[elms[pos]];
          if(!reqElm[reqElm.length-1])
            reqElm.length--;
          else if(reqElm[reqElm.length-1].length && !reqElm[reqElm.length-1].form)
            reqElm[reqElm.length-1] = reqElm[reqElm.length-1][0];
        }
        if(reqElm.length == 1) {
          elmType = 0;
          reqElm = reqElm[0];
        } else if(!reqElm.length) {
          elmType = 0;
          reqElm = null;
        }
      } else {
        reqElm = elm.form.elements[reqElm];
        if(reqElm && reqElm.length && !reqElm.form)
          reqElm = reqElm[pos];
      }
    }

    if(req.substring(0,1) == "(" && req.substr(req.length-1,1) == ")") {
      reqValue = req.substr(1, req.length-2);
      if(reqType == 0) {
        if(reqValue != getFieldValue(reqElm,1,""))
          return "";
      } else if(reqType == 1) {
        elms = getFieldValue(reqElm,1);
        for(pos = 0; pos < elms.length; pos++)
          if(reqValue != elms[pos])
            return "";
      }
    } else if(reqType == 0) {
        reqValue = getFieldValue(reqElm,1);
        if(!reqValue || !reqValue.length)
          return "";
    } else if(reqType == 1) {
      elms = getFieldValue(reqElm,1);
      for(pos = 0; pos < elms.length; pos++)
        if(!elms[pos] || !elms[pos].length)
          return "";
    }

  }

  reqValue = getFieldValue(elm,1,"");
  if(!reqValue || !reqValue.length)
    return " is required";
  
  return "";    
}

function formAlert(elm, msg) {
  if(elm.focus)
    elm.focus();
  alert(getFieldLabel(elm) + msg + '.');
}

function validateField(elm, fmtMsg) {
  var msg = "";

  if(!msg.length) {
    msg = handleFieldFormat(elm);
    if(msg.length && msg != ' ' && fmtMsg && fmtMsg.length)
      msg += fmtMsg;
  }

  if(!msg.length)
    msg = handleFieldReq(elm);

  if(msg.length) {
    if(msg != ' ')
      formAlert(elm, msg);
    return false;
  }

  return true;  
}

function validateForm(frm) {
  var i = 0;
  var elm;

  for(i = 0; i < frm.elements.length; i++) {
    elm = frm.elements[i];
    if(!validateField(elm))
      return false;
  }
  
  return true;
}

function submitFormLink(idForm, aryField, aryValue, boolValidate) {
  var frm = document.getElementById(idForm);
  var elm = null;
  var elms = null;
  var i = 0, j = 0;

  if(!ranProcFormLabels)
    procFormLabels();

  if(boolValidate && !validateForm(frm))
    return;

  if(!aryField)
    aryField = Array();
  else if(aryField.constructor != Array)
    aryField = Array(aryField);

  if(!aryValue)
    aryValue = Array();
  else if(aryValue.constructor != Array)
    aryValue = Array(aryValue);

  for(i = 0; i < aryField.length && i < aryValue.length; i++) {
    elms = frm.elements[aryField[i]];
    if(elms) {
      if(!elms.type && elms.length)
        elm = elms[0];
      else {
        elm =elms;
        elms = Array(elm);
      }

      if(elm.type == "radio" || elm.type == "checkbox") {
        for(j = 0; j < elms.length; j++)
          elms[j].checked = (elms[j].value == aryValue[i]);
      } else if(elm.type == "select") {
        elms = elm.options;
        for(j = 0; j < elms.length; j++)
          elms[j].selected = (elms[j].value == aryValue[i]);
      } else
        elm.value = aryValue[i];
    }
  }
  
  if(!frm.onsubmit || frm.onsubmit())
    frm.submit();
}

function submitForm(frm, boolValidate) {
  if(!ranProcFormLabels)
    procFormLabels();

  if(boolValidate && !validateForm(frm))
    return false;

  return true;
}

function formatFieldMatch(elm, srcElm, param) {
  if(getFieldValue(elm) != getFieldValue(srcElm))
    return ' does not match ' + getFieldLabel(srcElm);
    
  return "";
}

function formatFieldEmail(elm, srcElm, param) {
  var re = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
  
  if(!re.test(getFieldValue(elm)))
    return ' is not a valid email address';
    
  return "";
}

function formatFieldInt(elm, srcElm, param) {
  var re = /^\s*-?\d{1,3}(?:[,\.]?\d{3,3})*\s*$/;
  var reStrip = /,/g;
  var val = "";
  var test = 0;
  
  val = getFieldValue(elm);
  if(!re.test(val))
    return ' is not a valid number';
    
  val = parseInt(val.replace(reStrip, ''), 10);
  if(isNaN(val))
    return ' is not a valid number';

  if(param.length > 0 && param[0].length)
    test = parseInt(param[0]);
  else
    test = NaN;
  
  if(!isNaN(test))
    if(val > test)
      return ' cannot be greater than ' + test;
  

  if(param.length > 1 && param[1].length)
    test = parseInt(param[1]);
  else
    test = NaN;
  
  if(!isNaN(test))
    if(val < test)
      return ' cannot be less than ' + test;
    
  return "";
}

function formatFieldStr(elm, srcElm, param) {
  return "";
}

function formatFieldDebug(elm, srcElm, param) {
  alert(elm.name+'[' + srcElm.name + '](' + join(param, ',') + ') = ' + getFieldValue(elm));
  return "";
}

function initSelectFilter(idSel, fldTarget) {
  var elm = document.getElementById(idSel);
  
  elm._pool = elm.form.elements[fldTarget];
  if(!elm._pool)
    return;
  
  if(elm._loading || elm._pool._loading) {
    window.setTimeout("initSelectFilter('" + idSel + "', '" + fldTarget + "');", 500);
    return;
  }

  elm.onchange=selListOnChange;
  elm._pool._all = new Array();
  elm._pool._global = new Array();
  ary = new Array();

  for(i = 0; i < elm.options.length; i++) {
    opt = elm.options[i];
    if(opt.value && opt.value.length) {
      ary['O_'+opt.value] = opt;
      ary[ary.length] = opt.value;
      opt._pool = new Array();
    } else
      opt._pool = elm._pool._all;
  }
  
  for(i = 0; i < elm._pool.options.length; i++) {
    opt = elm._pool.options[i];
    if(opt.value && opt.value.length) {
      elm._pool._all[elm._pool._all.length] = opt;
      if((grp = opt.getAttribute("group"))) {
        grp = grp.split(',');
        for(j = 0; j < grp.length; j++) {
          if(ary['O_'+grp])
            ary['O_'+grp]._pool[ary['O_'+grp]._pool.length] = opt;
        }
      }
    } else
      elm._pool._global[elm._pool._global.length] = opt;
  }

  elm.onchange();
}

function selListOnChange(e) {
  var sel = null;
  
  if(this._pool.selectedIndex > -1) {
    sel = this._pool.options[this._pool.selectedIndex];
    sel.realText = sel.text;
    sel.text += ' [ filtering... ]';
  }
  
  window.setTimeout("runSelectListFilter('" + this.id + "');", 500);
}

function runSelectListFilter(idSel) {
  var elm = document.getElementById(idSel);
  var j = 0;
  var ary = null;
  var sel = null;
  var arySel = new Array();

  if(elm._pool.selectedIndex > -1)
    sel = elm._pool.options[elm._pool.selectedIndex].value;

  while(elm._pool.options.length) {
    if(elm._pool.options.length == 1 && elm._pool.options[0].realText) {
      elm._pool.options[0].text = elm._pool.options[0].realText;
      elm._pool.options[0].realText = null;
    }
    elm._pool.options[elm._pool.options.length-1]=null;
  }

  ary = elm._pool._global;
  for(j = 0; j < ary.length; j++) {
    elm._pool.options.add(ary[j]);
    ary[j].selected = false;
    elm._pool.selectedIndex = 0;
    if(elm._pool.options.length == 1) {
      ary[j].realText = ary[j].text;
      ary[j].text += ' [ filtering... ]';
    }
    if(sel && ary[j].value == sel)
      arySel[arySel.length] = elm._pool.options.length-1;
  }
    
  if(elm.selectedIndex > -1)
    ary = elm.options[elm.selectedIndex]._pool;
  else
    ary = elm._pool._all;

  for(j = 0; j < ary.length; j++) {
    elm._pool.options.add(ary[j]);
    ary[j].selected = false;
    elm._pool.selectedIndex = 0;
    if(elm._pool.options.length == 1) {
      ary[j].realText = ary[j].text;
      ary[j].text += ' [ filtering... ]';
    }
    if(sel && ary[j].value == sel)
      arySel[arySel.length] = elm._pool.options.length-1;
  }

  if(elm._pool.options.length && elm._pool.options[0].realText) {
    elm._pool.options[0].text = elm._pool.options[0].realText;
    elm._pool.options[0].realText = null;
  }

  for(j = 0; j < arySel.length; j++)
    elm._pool.options[arySel[j]].selected = true;
  
  if(elm._pool.options[elm._pool.selectedIndex].value != sel)
    elm._pool.onchange();
  
}
