﻿
var pf_FormElementData=new Array();
var pf_Ended=false;

function pf_Validate(ValidationType) {
  var ok=true;  
  var Focused=false;
  var ClearInvalid=false;
  
  if(pf_Ended) ClearInvalid=true;
    
  for(var i=0;i<pf_FormElementData.length;i++) {
    var data=pf_FormElementData[i];
    var e=document.getElementById(data.id);
    if(e==null) continue;

    var thisok=true;

    switch(data.type) {
      case "multiple" :
        thisok=pf_ValidateMultiple(data, e, ClearInvalid);
        break;
      case "text" :
        thisok=pf_ValidateText(data, e, ClearInvalid);
        break;
    }

    e.className=e.className.replace("pf_validationfailed", "");
    
    if(!pf_Ended) {
    
      if(!thisok) {
        e.className+=" pf_validationfailed";
        ok=false;
        if(!Focused) Focused=pf_FindFocusTarget(e);
      }
      var er=document.getElementById(data.errorid);
      if(er) er.style.display=thisok ? "none" : "inline";
    }

  }
  
  if(pf_Ended) {
    if(ValidationType=="send" || ValidationType=="pagechange") {
    
      if(!pf_EndedAtPageStart) for(var i=0;i<pf_FormElementData.length;i++) {
        var data=pf_FormElementData[i];
        var e=document.getElementById(data.id);
        if(!e) continue;
        pf_DisableRecursive(e, false);
      }
      
      return true;
    }
  }

  
  return ok;
}

function pf_FindFocusTarget(e) {
  switch(e.nodeName.toLowerCase()) {
    case "input" :
    case "select" :
    case "textarea" :
      e.focus();
      return true;
  }
  for(var i=0;i<e.childNodes.length;i++) if(pf_FindFocusTarget(e.childNodes[i])) return true;
  return false;
}

function pf_CountCheckedBoxes(e) {
  var c=0;
  if(e.nodeName.toLowerCase()=="input" && (e.attributes.type.value=="checkbox" || e.attributes.type.value=="radio") && e.checked) c++;
  for(var i=0;i<e.childNodes.length;i++) c+=pf_CountCheckedBoxes(e.childNodes[i]);
  return c;
}

function pf_ValidateMultiple(data, e, ClearInvalid) {
  var min=Number(data.minselections);
  var max=Number(data.maxselections);

  var c=0;
  switch(data.subtype) {
    case "checkboxlist" :
      c=pf_CountCheckedBoxes(e);
      break;
    case "dropdown" :
    case "dropdownlist" :
      return true;
    case "list" :
      for(var i=0;i<e.options.length;i++) if(e.options[i].selected) c++;
      break;
  }
  if(c<min || c>max) return false;
  return true;
}

function pf_ValidateText(data, e, ClearInvalid) {
  var v=e.value;

  if(data.allowempty=="true" && e.value=="") return true;
  if(data.allowempty!="true" && e.value=="") return false;

  var ok=true;

  if(data.validationregex) {
    var r=new RegExp(data.validationregex);
    ok=r.exec(v);
  }
  
  if(data.minvalue) if(Number(v)<Number(data.minvalue)) ok=false;
  if(data.maxvalue) if(Number(v)>Number(data.maxvalue)) ok=false;
  
  if(!ok && ClearInvalid) e.value="";
  
  return ok;
}


function pf_Register(n) {
  pf_FormElementData.push(n);
}


var pf_Timers=new Array();

function pf_DisableRecursive(e, State) {
  switch(e.nodeName.toLowerCase()) {
    case "input" :
    case "select" :
    case "textarea" :
      e.disabled=State;
    break;
  }
  for(var i=0;i<e.childNodes.length;i++) pf_DisableRecursive(e.childNodes[i], State);
}

function pf_End() {
  pf_Ended=true;
  for(var i=0;i<pf_FormElementData.length;i++) {
    var data=pf_FormElementData[i];
    var e=document.getElementById(data.id);
    if(!e) continue;
    e.className=e.className.replace("pf_validationfailed", "");
    pf_DisableRecursive(e, true);
    
    var er=document.getElementById(data.errorid);
    if(er) er.style.display="none";
  }
  
}

function pf_UpdateTimers(Continue) {
  var c=Math.round(pf_TimeLeft-(Number(new Date())-pf_TimerStart)/1000);
  
  var m=Math.floor(c/60);
  var s=c%60;
  
  var t="";
  if(m>0) t+=m+" min ";
  if(m<3) t+=s+" s";

  if(c<0) {
    t="0 s";
    pf_End();
  }
  
  for(var i=0;i<pf_Timers.length;i++) {
    var te=document.getElementById(pf_Timers[i]);
    if(!te) continue;
    while(te.childNodes.length>0) te.removeChild(te.childNodes[0]);
    te.appendChild(document.createTextNode(t));
  }
  if(c>=0 && Continue) window.setTimeout("pf_UpdateTimers(true);", 1000);
}


function pf_RegisterTimer(e, t) {
  pf_Timers.push(e);
  pf_TimeLeft=t;
  pf_TimerStart=Number(new Date());
  if(pf_Timers.length==1) window.setTimeout("pf_UpdateTimers(true);", 1000);
  pf_UpdateTimers(false);
}
