// gemsdb.js

// ------------------------------------------------
//                Validation
// ------------------------------------------------

//Telephone Validation & normalization
function checkForData(oCtl) {
  var sStr = trim(oCtl.value);
  if (sStr != "") return null;
  return "Field "+oCtl.name+" requires data";
}

//Telephone Validation & normalization
function checkPhoneNum(oCtl) {
  var sStr = oCtl.value;
  if (niceNANP(sStr).length != 12) {
    return "The Phone Number "+sStr+" is not valid";
  }
  oCtl.value = niceNANP(sStr);
  return null;
}
function niceNANP(sIn) {
  var sOut = "";
  for (var i=0; i<sIn.length; i++) {
    var c = sIn.charAt(i);
    if (c >= "0" && c <= "9") {
      var bSkip = false;
      if (sOut.length == 0) {
        if (c <= "1" ) bSkip = true;
      }
      if (!bSkip) {
        sOut += c;
        if (sOut.length==3 || sOut.length==7) { sOut += "-"; }
      }
    }
  }
  return sOut;
}

//ZipCode Validation & normalization (Canada only at present)
function checkZipCode(oCtl) {
  var sStr = trim(oCtl.value.toUpperCase());
  if (sStr.length == 0) return null;
  var sOut = "";
  for(var i=0;i<sStr.length; i++) {
    var c = sStr.charAt(i);
    if (c == " ") continue;
    var nPos = sOut.length;
    if ((nPos % 2) == 0) {
      if ((c < "A") || (c > "Z")) return "ZipCode should be alpha at pos "+(nPos+1);
      sOut += c;
    } else {
      if ((c < "0") || (c > "9")) return "ZipCode should be numeric at pos "+(nPos+1);
      sOut += c;
    }
  }
  if (sOut.length == 0) return "ZipCode has no data";
  if (sOut.length != 6) return "ZipCode should be 6 characters";
  oCtl.value = sOut;
  return null;
}

//Address line validation
function checkAddress(oCtl) {
  var sStr = oCtl.value;
  var sStr = sStr.replace(/[\t]/," ");
  var sStr = trim(sStr);
  oCtl.value = sStr;
  if (sStr.length == 0) return null;
  if (sStr.match(/^[0-9]+([^0-9][^ ]*)? +[a-zA-Z]{3,}/) == null) return "Address should be ## street format. EG. 123 main"
}


// ------------------------------------------------
//                 Form Handling
// ------------------------------------------------

function reflectValue(oCtl,sHide) {
  var oForm=oCtl.form;
  if (oForm.DBExec == null) return;
  var oDBE = makeTubFromStr(oForm.DBExec.value);
  if (oDBE == null) return;
  var oFlds = oDBE.getValue("flds");
  if (oFlds == null) return;
  gemsLog("Disabling "+oFlds.length)
  for(i=0,iMax=oFlds.length; i<iMax; i++) {
    var oTFld = oFlds[i];
    var sName = oTFld.getValue("n");
    oForm[sName].disabled = true;
    gemsLog("Disable "+sName)
  }
  oCtl.disabled = true;
  oForm.DBExec.disabled = true;
  oForm.Geoc.disabled = true;
  oForm.GeoMap.disabled = true;
  oForm.DBView.disabled = true;
  oForm[sHide].value = oCtl.value;
  oForm[sHide].disabled = false;
  oForm.submit();
}

function submitFormSAR(oBut,sNextPage) {
  var oForm=oBut.form;
  var sOP=oBut.name;
  gemsLog("Send "+oForm.name+" op="+sOP+" "+oBut.name);
  var oTub = makeTub();
  oTub.add("OP",sOP);
  var oSpan = getElement("gemsDynlogLines");
  if (oSpan != null) oTub.add("log","yes");
  if ((sOP != "DBDelete") && (!validationPass(oForm))) {
    return false;
  }
  var bChanges = formatReqTub(oTub,oForm,oBut,sNextPage);
  if ((sOP == "DBDelete") && (bChanges)) {
    var bOK = confirm("There are outstanding updates. Do you wish to continue with deletion?");
    if (!bOK) return false;
  }
  if (sOP == "DBDelete") {
    var bOK = confirm("Deletion cannot be reversed. Do you wish to continue with deletion?");
    if (!bOK) return false;
    gemsLog("butClass "+oBut.className);
    oBut.className="butBusy";
    serverActionReq("call",oTub.toText(),"DBUpdate");
    return false;
  }
  if (bChanges) {
    gemsLog("butClass "+oBut.className);
    oBut.className="butBusy";
    serverActionReq("call",oTub.toText(),"DBUpdate");
  } else {
    alert("Nothing to update. Request ignored.");
  }
  return false;
}

function cancelFormSAR(oBut,sNextPage) {
  var oForm=oBut.form;
  var sOP=oBut.name;
  gemsLog("cancel "+oForm.name+" op="+sOP+" "+oBut.name);
  var oTub = makeTub();
  oTub.add("OP",sOP);
  var bChanges = formatReqTub(oTub,oForm,oBut,sNextPage);
  if (bChanges) {
    var bOK = confirm("There are outstanding updates. Do you wish to continue?");
    if (!bOK) return false;
  }
  var oCtl = oForm[sNextPage];
  if (oCtl == null) return false;
  window.location = oCtl.value;
  //oForm.submit();
  return false;
}

// Update/Add format request
function formatReqTub(oTub,oForm,oBut,sNextPage) {
  if (oForm.DBExec == null) return;
  var oEcho = makeTub();
  oEcho.add("form",oForm.name);
  oEcho.add("but",oBut.name);
  if (sNextPage != null) oEcho.add("next",sNextPage);
  oTub.add("Echo",oEcho);
  //oForm[oBut.name] = oBut; // KLudge - Images not in forms array
  gemsLog("Built echo: forms len="+oForm.length+" "+oForm[oBut.name].name);
  var oDBE = makeTubFromStr(oForm.DBExec.value);
  if (oDBE == null) return;
  oTub.addNotNull("view",oDBE.getValue("view"));
  oTub.addNotNull("index",oDBE.getValue("index"));
  var oFlds = oDBE.getValue("flds");
  if (oFlds == null) return;
  var oTubs = new Array();
  gemsLog("Processing "+oFlds.length)
  var bChanges = false;
  for(i=0,iMax=oFlds.length; i<iMax; i++) {
    var oTFld = oFlds[i];
    var sName = oTFld.getValue("n");
    gemsLog("Processing fld="+sName)
    var sCtlName = sName;
    var sCtlType = oTFld.getValue("dt");
    if (sCtlType == "join") sCtlName = "_L_"+sCtlName;
    var oFFld = oForm[sCtlName];
    if (oFFld == null) continue;
    if (((oFFld.value != oFFld.defaultValue) || (oFFld.type == "hidden")) && (sCtlType != "join")) {
      var oNew = makeTub();
      oNew.add("n",sName);
      oNew.add("v",oFFld.value);
      if (sCtlType != null) oNew.add("dt",sCtlType);
      //oFFld.defaultValue = oFFld.value; // Later on good update only
      oTubs[oTubs.length] = oNew;
      if (oFFld.type != "hidden") bChanges = true;
    }
    if (sCtlType == "join") {
      gemsLog("Doing join "+sCtlName);
      var oCtl = oFFld.oGemCtl;
      if (oCtl != null) {
        gemsLog("Found ctl "+sCtlName);
        var sDelta = oCtl.getDelta();
        if (sDelta != null) {
          gemsLog("Have delta "+sDelta);
          var oNew = makeTub();
          oNew.add("n",sName);
          oNew.add("dt",sCtlType);
          oNew.add("v",sDelta);
          oTubs[oTubs.length] = oNew;
          bChanges = true;
        }
      }
    }
  }
  oTub.add("flds",oTubs);
  return bChanges;
}


// Update/Add validation
function validationPass(oForm) {
  if (oForm.DBExec == null) return true;
  var oDBE = makeTubFromStr(oForm.DBExec.value);
  if (oDBE == null) return true;
  var oFlds = oDBE.getValue("flds");
  if (oFlds == null) return true;
  gemsLog("Validating "+oFlds.length)
  for(i=0,iMax=oFlds.length; i<iMax; i++) {
    var oTFld = oFlds[i];
    var sBVStr = oTFld.getValue("bv");
    if (sBVStr != null) {
      var sName = oTFld.getValue("n");
      gemsLog("Validating with "+sBVStr+" for "+sName);
      if (sName == null) continue;
      var oCtl = oForm[sName];
      if (oCtl == null) continue;
      var sRet = eval(""+sBVStr+";");
      if (sRet != null) {
        gemsLog("Validation failed "+sRet);
        alert("Validate on "+oCtl.name+" failed\r\nReason:"+sRet);
        return false;
      }
    }
  }
  return true;
}

function showFail(sMsg) {
  alert(sMsg);
  return false;
}

// ------------------------------------------------
//           Server Action Request (SAR)
// ------------------------------------------------

var gbSARResult = false;
function serverActionReq(sMeth,sTub,sCallBack) {
  var sURL = ""+window.location;
  //var nIX = sURL.indexOf("?");
  //if (nIX > 0) sURL = sURL.substring(0,nIX);
  //sURL += "?meth=call";
  sURL = sURL.replace(/load[.]/,sMeth+".");
  var sParms = "ok=serverGood"+sCallBack+"&fail=serverBad"+sCallBack;
  if (sTub != null) sParms += "&Tub=" + sTub;
  gbSARResult = false;
  gemsLog("URL="+sURL);
  gemsLog("Parms="+sParms);
  sendXMLHttpReq(sURL,sParms,true);
  //alert("Now at "+gbSARResult+" "+sURL);
  return gbSARResult;
}

// ----- DB ADD/Update SARs
function serverGoodDBUpdate(sText) {
  var oTub = makeTubFromStr(sText);
  var sData = oTub.getValue("Data");
  gemsLog("Data:"+sData);
  var oEcho = oTub.getValue("Echo");
  if (oEcho != null) {
    gemsLog("Echo:"+oEcho.toText());
    var sForm = oEcho.getValue("form");
    var oForm = document.forms[sForm];
    gemsLog("Echo form:"+oForm.name);
    var sBut  = oEcho.getValue("but");
    var oBut  = oForm[sBut];
    if (oBut == null) gemsLog("Echo not found:"+sBut+" len="+oForm.length);
    if (oBut != null) oBut.className = "butRdy";
  }
  showLogLines(oTub);
  if (oForm == null) {
    //alert("ServerGood:"+sData);
    return;
  } else {
    var sNextPagePtr = oEcho.getValue("next");
    if (sNextPagePtr == null) return;
    var oCtl = oForm[sNextPagePtr];
    if (oCtl == null) return;
    var sNextPage = oCtl.value;
    if (sNextPage == null) return;
    //alert("ServerGood:"+sData);
    var oPrevMsgs = oTub.getValue("Msgs");
    if (oPrevMsgs != null) {
      var oMsgTub = makeTub();
      oMsgTub.add("Msgs",oPrevMsgs);
      var sPref = "?";
      if (sNextPage.indexOf("?") > 0) sPref = "&";
      sNextPage += sPref + "PrevMsgs="+escape(oMsgTub.toText());
    }
    window.location = sNextPage;
    gemsLog("New Locn "+sNextPage);
    return;
  }
}
function serverBadDBUpdate(sText) {
  var oForm = document.forms[0];
  var oTub = makeTubFromStr(sText);
  showLogLines(oTub);
  var sData = oTub.getValue("Data");
  if (oForm == null) {
    alert("ServerReported update problem:"+sData);
    return;
  }
}

// ------------------------------------------------
//                     DEBUG
// ------------------------------------------------

function showLogLines(oTub) {
  var oLines = oTub.getValue("LogLines");
  if (oLines == null) return;
  var oSpan = getElement("gemsDynlogLines");
  if (oSpan == null) return;
  var sLogLines = "";
  var i=0;
  for(i=0; i< oLines.length; i++) {
    var oLine=oLines[i];
    sLogLines += oLine.getValue("T")+"<br>";
  }
  oSpan.innerHTML = sLogLines;
  displayTag("gemsDynlogLinesHdr",true);
}

function showError() {
  if(sErrorMsg == null) return;
  if(sErrorMsg == '') return;
  alert(sErrorMsg);
}

