/*
 * ONE CMS: jslib/one_data_browser.js
 * An ajax library to create a generic db edit form
 *
 * Joris Dormans (2006)
 *
 * requires:
 * 3dparty/md5.js,
 * 3dparty/jkl-parsexml.js,
 * jslib/modalpopup.js
 * jslib/dates.js
 * jslib/xmlhttprequest.js
 *
 */

function DataBrowser (HTMLParent, table, id, callback, objectName, show) {
  this.objectName = objectName;
  this.id = id;
  this.HTMLParent = HTMLParent;
  this.table = table;
  this.xhReqPopup = new XHReqCaller(objectName+".xhReqPopup");
  this.selectedImage = "";
  this.imageDir = "";
  this.popupField = "";
  this.callback = callback;
  this.data;
  this.subdata;
  this.defaults = new Array();
  if (show) {
    this.refreshBrowser();
  }
}

DataBrowser.prototype.refreshBrowser = function() {
  //collect data
  var xml = new JKL.ParseXML("services/one_view_record.php?t="+this.table+"&i="+this.id);
  this.data = xml.parse();
  if (this.data.error) {
    res = ("<div class='error'>Error "+this.data.error.code+": "+this.data.error.message+"</div>");
    $(this.HTMLParent).innerHTML=res;
    return;
  }
  this.imageDir = this.data.row.imagedir;

  if (this.data.row) {
    var required = "";
    var c = (this.data.row.id==-1) ? gLanguage.browserInsert : gLanguage.browserUpdate;
    var res = "<div class='one_cms'><table><tr class='one_cms_header'><td colspan='2'>"+c+" "+this.data.row.tabledesc+"</td></tr>";
    var r=0;
    var v="";
    //itterate through the data fields
    for (var m=0; m<this.data.row.field.length; m++) {
      //make sure password is required for inserts
      if (this.data.row.field[m].type == "password") {
        if (this.data.row.id==-1) this.data.row.field[m].required=1; else this.data.row.field[m].required=0;
      }
      if ((this.data.row.id==-1) && (this.defaults[this.data.row.field[m].name]!=undefined)) this.data.row.field[m].value=this.defaults[this.data.row.field[m].name];

      //display controls
      if ((this.data.row.field[m].type != "id" && this.data.row.field[m].type!="userstamp" && this.data.row.field[m].type!="timestamp") || user.isAdmin) {
        r=1-r;
        v =this.data.row.field[m].value;
        if (v==undefined) v="";
        if (this.data.row.field[m].type == "varchar" || this.data.row.field[m].type == "shortvarchar" || this.data.row.field[m].type == "unique varchar" || this.data.row.field[m].type == "char" || this.data.row.field[m].type == "text" || this.data.row.field[m].type == "username") v=unescape(v);
        if ((this.data.row.permissions.pinsert==1 && this.data.row.id==-1) || (this.data.row.permissions.pupdate==1 && this.data.row.id>-1)) {
          required = (this.data.row.field[m].required == 1) ? "*" : "";
          con = this.generateEditControl(this.objectName+this.data.row.field[m].name, v, this.data.row.field[m].type, this.data.row.field[m].settings, this.data.row.field[m].desc, this.data.row.field[m].required, this.data.row.field[m].canedit);
        } else {
          con = this.generateNonEditControl(v, this.data.row.field[m].type);
          required = "";
        }
        res += "<tr class='one_cms_r"+r+"'><td>"+this.data.row.field[m].desc+required+/*" ("+this.data.row.field[m].type+")"+*/"</td><td>"+con+"</td></tr>";
      } else if (this.data.row.field[m].type == "id" && this.data.row.id!=-1) {
        res += "<input type='hidden' id='"+this.objectName+this.data.row.field[m].name+"' value='"+this.data.row.field[m].value+"' />";
      }
    }
    res += "</table>";
    //display control buttons
    res += "<table class='one_cms_invis'>";
    res += "<tr><td align='left'>";
    if (this.data.row.permissions.pdelete == 1) res += "<input type='button' value='"+gLanguage.buttonDelete+"' onClick='"+this.objectName+".deleteRecord()' />";
    res += "</td><td align='right'>";
    if (this.data.row.permissions.pinsert == 1 && this.data.row.id == -1) res += "<input type='button' value='"+gLanguage.buttonInsert+"' onClick='"+this.objectName+".insertRecord()' />";
    if (this.data.row.permissions.pupdate == 1 && this.data.row.id > -1) res += "<input type='button' value='"+gLanguage.buttonUpdate+"' onClick='"+this.objectName+".updateRecord()' />";
    res += " <input type='button' value='"+gLanguage.buttonClose+"' onClick='"+this.objectName+".closeBrowser()' />";
    res += "</td></tr></table>";

    //multicontrols
    if (this.data.row.multicontrol && this.data.row.id>-1) {
      if (this.data.row.multicontrol.length>1) {
        for (var m=0; m<this.data.row.multicontrol.length; m++) {
          res+=this.generateMultiControl("mc"+m, this.data.row.multicontrol[m].desc, this.data.row.multicontrol[m].table);
        }
      } else {
        res+=this.generateMultiControl("mc1", this.data.row.multicontrol.desc, this.data.row.multicontrol.table);
      }
    }

    res += "</div>";
    $(this.HTMLParent).innerHTML= res;
    this.showing = true;
    return;
  }
  $(this.HTMLParent).innerHTML="Error... <a href=javascript:"+this.objectName+".closeBrowser() >go back</a>";
}

/********************************************
 * select & upload images methods
 *
 */

DataBrowser.prototype.selectImageReturnMethod = function () {
  var returnValue =  modalDialog.value;
  modalDialogRemoveWatch();
  if (returnValue=='cancel' || returnValue=="" || returnValue==undefined) return;
  $(this.popupField).value=this.imageDir+returnValue;
  if ($(this.popupField+"_display")) $(this.popupField+"_display").innerHTML=this.imageDir+returnValue;
  if ($(this.popupField+"_image")) $(this.popupField+"_image").src=this.imageDir+returnValue;
}

DataBrowser.prototype.selectImage = function (field) {
  //create a popup
  this.popupField=field;
  var buttons="";
  buttons = "<input type='button' value='"+gLanguage.buttonSelect+"' onClick=javascript:closeForm('select') /> ";
  buttons += "<input type='button' value='"+gLanguage.buttonCancel+"' onClick=javascript:closeForm('cancel') />";

  var popup = "";
  popup += "<div class='one_cms'>"
  popup += "<table>";
  popup += "<tr class='one_cms_header'><td colspan='2'>"+gLanguage.capSelectImage+"</td></tr>";
  popup += "<tr class='one_cms_r0'><td height='261px' width='104px' align='center'><img src='"+gSettings.libPath+"imglib/no_image.gif' id='selectImagePreview' class='one_image_preview' /></td><td valign='top'><div class='one_popup_image_content'>";

  this.xhReqPopup.sGet("services/one_image_list.php?d="+this.imageDir+"&s=selectImageSelect");

  popup += this.xhReqPopup.xhReq.responseText;
  popup += "</div></td></tr></table></div>";

  ModalDialogShow(gLanguage.capSelectImage, gSettings.libPath+"jslib/one_popup_selectimage.js", this.imageDir, popup, buttons, this.objectName+".selectImageReturnMethod()");
}

DataBrowser.prototype.uploadImage = function (field) {
  //create a popup
  this.popupField=field;
  var buttons="";
  buttons = "<input type='button' value='"+gLanguage.buttonUpload+"' onClick=javascript:closeForm('select') /> ";
  buttons += "<input type='button' value='"+gLanguage.buttonCancel+"' onClick=javascript:closeForm('cancel') />";

  var popup = "";

  popup += '<script language=JavaScript>';
  popup += 'var imageDir = "'+this.imageDir+'";';
  popup += '</script>';
  popup += "<div class='one_cms'>"
  popup += "<table>";
  popup += "<tr class='one_cms_header'><td>"+gLanguage.capUploadImage+"</td></tr>";
  popup += "<tr class='one_cms_r0'><td height='220px' align='center'><img src='"+gSettings.libPath+"imglib/no_image.gif' id='selectImagePreview' class='one_image_preview' /></td></tr>";
  popup += "<tr class='one_cms_r0'><td align='center'><form enctype='multipart/form-data' id='theform' method='post' action='services/one_upload_image.php'>";
  popup += "<input type='hidden' name='dir' value='"+this.imageDir+"' />";
  popup += "<input name='userfile' type='file' size='45' onClick='trySubmit()'/></form></td></tr></table></div>";

  ModalDialogShow(gLanguage.capUploadImage, gSettings.libPath+"jslib/one_popup_uploadimage.js", this.imageDir, popup, buttons, this.objectName+".selectImageReturnMethod()");
}

/********************************************
 * MultiControl methods
 *
 */

DataBrowser.prototype.generateMultiControl = function (controlId, desc, table) {
  var res ="";
  var xml = new JKL.ParseXML("services/one_view_multirecord.php?t="+table+"&ft="+this.data.row.table+"&i="+this.id);
  this.subdata = xml.parse();

  if (this.subdata.error) {
    res = ("<div class='error'>Error "+this.subdata.error.code+": "+this.subdata.error.message+"</div>");
    $(this.HTMLParent).innerHTML=res;
    return;
  }

  res = "<form id='form"+controlId+"'><table><tr class='one_cms_header'><td colspan='2'>"+desc+"</td></tr>";

  if (this.subdata.rows.table) {
    if (this.subdata.rows.row) {
      if (this.subdata.rows.row.length>1) {
        var r=1;
        for (var m=0; m<this.subdata.rows.row.length; m++) {
          res += "<tr class='one_cms_r"+r+"'><td width='20'><input id='"+controlId+"cb"+this.subdata.rows.row[m].field[0].value+"' type='checkbox' /></td>";
          res += "<td>"+unescape(this.subdata.rows.row[m].field[1].value)+"</td>";
          r=1-r;
        }
      } else {
        res += "<tr class='one_cms_r1'><td width='20'><input id='"+controlId+"cb"+this.subdata.rows.row.field[0].value+"' type='checkbox' /></td>";
        res += "<td>"+unescape(this.subdata.rows.row.field[1].value)+"</td>";
      }
    }
    res += "</table>";
    res +="<table class='one_cms_invis'><tr><td align='left'>";
    res += "<input type='button' value='"+gLanguage.buttonDeleteSelected+"' onclick="+this.objectName+".deleteSelected('"+controlId+"','"+table+"') />";
    res += "</td><td align='right'>";
    res += "<input type='button' value='"+gLanguage.buttonInsert+"' onclick="+this.objectName+".selectAddToMultiControl('"+table+"','"+this.data.row.table+"','"+this.subdata.rows.otable+"') />";
    res += "</td></tr></table></form>";
    return res;
  }
}

DataBrowser.prototype.addToMultiControlReturnMethod = function () {
  var returnValue =  modalDialog.value;
  modalDialogRemoveWatch();
  if (returnValue=='cancel' || returnValue=="" || returnValue==undefined) return;

  var r="if ("+this.objectName+".xhReqPopup.xhReq.responseText.indexOf('OK')<0) alert("+this.objectName+".xhReqPopup.xhReq.responseText); "+this.objectName+".refreshBrowser();";
  this.xhReqPopup.get("services/one_add_multiselect.php?t="+this.multiTable+"&ft="+this.multiFTable+"&i="+this.data.row.id+"&v="+returnValue, r);
}


DataBrowser.prototype.deleteSelected = function(controlId, tableName) {
  if (confirm(gLanguage.warningBeforeDelete)) {
    var xml = "<row><action>delete</action><table>"+tableName+"</table>";
    for (var m=0; m<$('form'+controlId).length; m++) {
      if ($('form'+controlId).elements[m].id.slice(0,controlId.length+2)==controlId+'cb') {
        if ($('form'+controlId).elements[m].checked) xml+="<id"+m+">"+$('form'+controlId).elements[m].id.slice(controlId.length+2)+"</id"+m+">";
      }
    }
    xml += "</row>";

    var r="if ("+this.objectName+".xhReqPopup.xhReq.responseText.indexOf('OK')<0) alert("+this.objectName+".xhReqPopup.xhReq.responseText); "+this.objectName+".refreshBrowser();";
    this.xhReqPopup.post("services/one_delete_records.php", r, xml);
  }
}

DataBrowser.prototype.selectAddToMultiControl = function (table, ftable, otable) {
  this.multiTable = table;
  this.multiFTable = ftable;
  this.foreignTable = table;
  //create a popup
  var buttons="";
//  buttons = "<input type='button' value='"+gLanguage.buttonInsert+"' onClick=javascript:closeForm('select') /> ";
  buttons += "<input type='button' value='"+gLanguage.buttonCancel+"' onClick=javascript:closeForm('cancel') />";

  var popup = "";
  popup += "<div class='one_popup_select_content' id='content'>";
  popup += "<script language=JavaScript>";
  popup += "var tableBrowser; function show() {showTable='none'; tableBrowser = new TableBrowser('content', '"+otable+"', '', 'tableBrowser', true);}";
  popup += "</script>";
  popup += "</div>";

  ModalDialogShow(gLanguage.capSelect, "tablebrowser", "", popup, buttons, this.objectName+".addToMultiControlReturnMethod()");
}

/********************************************
 * FKey controls methods
 *
 */

DataBrowser.prototype.showFKey = function (table, id) {
  this.xhReqPopup.sGet("services/one_view_fkey.php?t="+table+"&i="+id);
  return(this.xhReqPopup.xhReq.responseText);
}

DataBrowser.prototype.clearFKey = function (field) {
  $(field).value="";
  $(field+"_display").innerHTML=gLanguage.displayNone;
}

DataBrowser.prototype.selectFKeyReturnMethod = function () {
  var returnValue =  modalDialog.value;
  modalDialogRemoveWatch();
  if (returnValue=='cancel' || returnValue=="" || returnValue==undefined) return;
  $(this.popupField).value=returnValue;
  if ($(this.popupField+"_display")) $(this.popupField+"_display").innerHTML=this.showFKey(this.foreignTable, returnValue);
}

DataBrowser.prototype.selectFKey = function (field, table) {
  this.popupField = field;
  this.foreignTable = table;
  //create a popup
  var buttons="";
//  buttons = "<input type='button' value='"+gLanguage.buttonInsert+"' onClick=javascript:closeForm('select') /> ";
  buttons += "<input type='button' value='"+gLanguage.buttonCancel+"' onClick=javascript:closeForm('cancel') />";

  var popup = "";
  popup += "<div class='one_popup_select_content' id='content'>";
  popup += "<script language=JavaScript>";
  popup += "var tableBrowser; function show() {showTable='none'; tableBrowser = new TableBrowser('content', '"+table+"', '', 'tableBrowser', true);}";
  popup += "</script>";
  popup += "</div>";

  ModalDialogShow(gLanguage.capSelect, "tablebrowser", "", popup, buttons, this.objectName+".selectFKeyReturnMethod()");
}

/********************************************
 * General controls methods
 *
 */

DataBrowser.prototype.clearField = function (field) {
  $(field).value="";
}

DataBrowser.prototype.setToday = function (field) {
  var d = new Date();
  $(field).value=formatDate(d, gLanguage.dateFormat);
}

DataBrowser.prototype.clearImage = function (field) {
  $(field).value="";
  if ($(field+"_display")) $(field+"_display").innerHTML=gLanguage.displayNone;
  if ($(field+"_image")) $(field+"_image").src="../imglib/blank.gif";
}

DataBrowser.prototype.generateSelectControl = function (field, value, settings) {
  var a = stringToArray(settings);
  var res="<select id='"+field+"'><option value=''></option>";
  for (var m=0; m<a.length; m++) {
    if (value==a[m][0]) sel=" selected"; else sel="";
    res+="<option value='"+a[m][0]+"'"+sel+"> "+a[m][1]+"</option>"
  }
  res +="</select>";
  return res;
}

DataBrowser.prototype.generateEditControl = function (field, value, type, settings, desc, req, canedit) {
  var ro = ((canedit==1) ? '' : ' readonly');
  if (value==undefined) value="";
  if (settings==undefined) settings="";
  if (type=="id") {
    if (value==-1) return value;
    else return value+"<input type='hidden' id='"+field+"' value='"+value+"' />";

  } else if (type=="permissions") {
    var res="<table class='one_cms_invis'><tr>";
    var check;
    for (var m=0; m<gSettings.permissions.length; m++) {
      if (gSettings.permissions[m]=="-1") {
        if ((value==-1)) check=" checked"; else check="";
      } else {
        if ((gSettings.permissions[m] & value)>0) check=" checked"; else check="";
      }
      res+="<td><input type='checkbox' id='"+field+gSettings.permissions[m]+"'"+check+ro+">"+gSettings.permissionsDesc[m]+"</td>";
      if ((m<gSettings.permissions.length-1) && ((m+1)%gSettings.showPermissions==0)) res+="</tr><tr>";
    }
    res += "</tr></table>";
    return res;

  } else if (type=="char") {
    if (settings) return this.generateSelectControl(field, value, settings, desc);
    else return "<input id='"+field+"' value='"+value+"' maxlength='1' size='1'"+ro+" />";

  } else if (type=="varchar") {
    if (settings=="show") return value;
    else if (settings=="email") return "<input id='"+field+"' value='"+value+"' maxlength='255' onBlur="+this.objectName+".checkEmail('"+field+"','"+escape(desc)+"')"+ro+" />";
    else if (settings=="sum11weak") return "<input id='"+field+"' value='"+value+"' maxlength='255' onBlur="+this.objectName+".checkSum11('"+field+"','"+escape(desc)+"',true)"+ro+" />";
    else if (settings=="sum11strong") return "<input id='"+field+"' value='"+value+"' maxlength='255' onBlur="+this.objectName+".checkSum11('"+field+"','"+escape(desc)+"',false)"+ro+" />";
    else if (settings!="") return this.generateSelectControl(field, value, settings);
    else return "<input id='"+field+"' value='"+value+"' size='40' maxlength='255'"+ro+" />";

  } else if (type=="int") {
    if (settings=="show") return value;
    if (settings!="") return this.generateSelectControl(field, value, settings);
    else return "<input id='"+field+"' value='"+value+"' size='40' maxlength='255'"+ro+" />";

  } else if (type=="shortvarchar") {
    if (settings=="show") return value;
    else if (settings=="sum11weak") return "<input id='"+field+"' value='"+value+"' maxlength='32' onBlur="+this.objectName+".checkSum11('"+field+"','"+escape(desc)+"',true)"+ro+" />";
    else if (settings=="sum11strong") return "<input id='"+field+"' value='"+value+"' maxlength='32' onBlur="+this.objectName+".checkSum11('"+field+"','"+escape(desc)+"',false)"+ro+" />";
    else if (settings!="") return this.generateSelectControl(field, value, settings);
    else return "<input id='"+field+"' value='"+value+"' maxlength='32'"+ro+" />";

  } else if (type=="unique varchar") {
    if (settings=="show") return value;
    else return "<input id='"+field+"' value='"+value+"' maxlength='255' size='40' onBlur="+this.objectName+".checkUnique('"+field+"','"+escape(desc)+"')"+ro+" />";

  } else if (type=="username") {
    if (settings=="show") return value;
    else return "<input id='"+field+"' value='"+value+"' maxlength='24' onBlur="+this.objectName+".checkUnique('"+field+"','"+escape(desc)+"')"+ro+" />";

  } else if (type=="text") {
    return "<textarea id='"+field+"' "+settings+ro+">"+value+"</textarea>";

  } else if (type=="password") {
    return "<input id='"+field+"1' type='password' value='"+value+"' /><br /><input id='"+field+"2' type='password' value='"+value+"'"+ro+" /> "+gLanguage.passwordRepeat;

  } else if (type=="image") {
    var res="";
    if (settings.indexOf('i')>=0) res+="<image id='"+field+"_image' type='button' src='"+(value=="" ? "../imglib/blank.gif": value)+"' height='16' />";
    if (settings.indexOf('e')>=0) res+="<input id='"+field+"' value='"+value+"'"+ro+" />";
    else res+="<div id='"+field+"_display' style='display:inline;'>"+(value=="" ? gLanguage.displayNone: value)+"</div><input id='"+field+"' type='hidden' value='"+value+"'>";
    if (settings.indexOf('s')>=0 && canedit==1) res+=" <input type='button' value='"+gLanguage.buttonSelect+"' onClick="+this.objectName+".selectImage('"+field+"') />";
    if (settings.indexOf('u')>=0 && canedit==1) res+=" <input type='button' value='"+gLanguage.buttonUpload+"' onClick="+this.objectName+".uploadImage('"+field+"') />";
    if (settings.indexOf('c')>=0 && canedit==1) res+=" <input type='button' value='"+gLanguage.buttonClear+"' onClick="+this.objectName+".clearImage('"+field+"') />";
    return res;

  } else if (type=="date") {
    var v = formatDate(stringToDate(value, gSettings.dbDateFormat, "") , gLanguage.dateFormat);
    var b = "";
    if (settings.indexOf('t')>=0 && canedit==1) b+=" <input type='button' value='"+gLanguage.buttonToday+"' onClick="+this.objectName+".setToday('"+field+"') />";
    if (settings.indexOf('c')>=0 && canedit==1) b+=" <input type='button' value='"+gLanguage.buttonClear+"' onClick="+this.objectName+".clearField('"+field+"') />";
    return "<input id='"+field+"' size='10' value='"+v+"' onblur="+this.objectName+".checkDate('"+field+"','"+escape(desc)+"')"+ro+" /> "+gLanguage.displayDateFormat+b;

  } else if (type=="fkey") {
    var res="";
    var v=""
    if (value=="") v=gLanguage.displayNone;
    else v=this.showFKey(settings, value);
    res+="<div id='"+field+"_display' style='display:inline;'>"+v+"</div><input id='"+field+"' type='hidden' value='"+value+"'>";
    if (canedit==1) res+=" <input type='button' value='"+gLanguage.buttonSelect+"' onClick="+this.objectName+".selectFKey('"+field+"','"+settings+"') />";
    if (req!=1 && canedit==1) res+=" <input type='button' value='"+gLanguage.buttonClear+"' onClick="+this.objectName+".clearFKey('"+field+"') />";
    return res;

  } else if (type=="timestamp") {
    return formatDate(stringToDate(value, gSettings.dbDatetimeFormat, "") , gLanguage.datetimeFormat);

  } else {
    return value;
  }
}

DataBrowser.prototype.generateNonEditControl = function (value, type) {
  if (type=="password") return "************";
  else return value;  
}


DataBrowser.prototype.checkDate = function (id, desc) {
  if ($(id).value!='' && stringToDate($(id).value, gLanguage.dateFormat, null) == null) {
    alert(unescape(desc)+' '+gLanguage.errorNoDate);
    $(id).focus();
    return false;
  }
  return true;
}

DataBrowser.prototype.checkInt = function (id, desc) {
  if (parseInt($(id).value)!=$(id).value || parseInt($(id).value)==NaN) {
    alert(unescape(desc)+' '+gLanguage.errorNoInt);
    $(id).focus();
    return false;
  }
  return true;
}

DataBrowser.prototype.checkEmail = function (id, desc) {
  var pattern = /^[^@\s]+@([-a-z0-9]+\.)+[a-z]{2,}$/;
  if ($(id).value!='' && !$(id).value.match(pattern)) {
    alert(unescape(desc)+' '+gLanguage.errorNoEmail);
    $(id).focus();
    return false;
  }
  return true;
}

DataBrowser.prototype.checkSum11 = function (id, desc, weak) {
  var s=trimtonum($(id).value);
  if (s.length<9 && weak) return true;
  var t=0;
  for (i=0; i<s.length; i++) {
    t+=s.substr(i,1)*(9-i);
  }
  var c = false;
  if ((t/11) == Math.floor(t/11)) c=true;
  if ($(id).value!='' && !c) {
    alert(unescape(desc)+' '+gLanguage.errorNoSum11);
    $(id).focus();
    return false;
  }
  return true;
}

DataBrowser.prototype.checkPassword = function (id, desc, rowid) {
  if ($(id+'1').value!=$(id+'2').value) {
    alert(gLanguage.errorNoMatch);
    $(id+'1').focus();
    return false;
  }
  if (rowid!=-1 && $(id+'1').value.length==0) return true;
  if ($(id+'1').value.length<gSettings.passwordMinLength) {
    alert(gLanguage.errorPasswordTooShort);
    document.getElementById(id+'1').focus();
    return false;
  }
  if (document.getElementById(id+'1').value.length>gSettings.passwordMaxLength) {
    alert(gLanguage.errorPasswordTooLong);
    document.getElementById(id+'1').focus();
    return false;
  }
  return true;
}

DataBrowser.prototype.checkUsername = function (id, desc) {
  if (document.getElementById(id).value.length<gSettings.usernameMinLength) {
    alert(gLanguage.errorUsernameTooShort);
    document.getElementById(id).focus();
    return false;
  }
  if (document.getElementById(id).value.length>gSettings.usernameMaxLength) {
    alert(gLanguage.errorUsernameTooLong);
    document.getElementById(id).focus();
    return false;
  }
  return true;
}

DataBrowser.prototype.calculatePermissions = function (field) {
  if (user.isAdmin) {
    //determine permissions
    var v=0;
    var a=0;
    for (var m=0; m<gSettings.permissions.length; m++) {
      if ($(field+gSettings.permissions[m]).checked) {
        if (gSettings.permissions[m]=="-1") {
          v=-1;
          break;
        } else {
          a=Math.floor(gSettings.permissions[m]);
          v+=a;
        }
      }
    }
    return v;
  }
  return 'null';
}

DataBrowser.prototype.checkUnique = function (field, desc) {
  var f=field.substr(this.objectName.length);
  var s="services/one_check_unique.php?t="+this.data.row.table+"&i="+this.data.row.id+"&if="+this.data.row.idfield+"&f="+f+"&v="+escape($(field).value);
  this.xhReqPopup.sGet(s);
  if (this.xhReqPopup.xhReq.responseText=="OK") {
    return true;
  } else {
    alert(unescape(desc)+' '+gLanguage.errorUnique);
    $(field).focus();
    return false;
  }
}

DataBrowser.prototype.checkFields = function () {
  for (var m=0; m<this.data.row.field.length; m++) {
    var field = this.objectName+this.data.row.field[m].name;
    if ($(field)) {
      if (this.data.row.field[m].required==1 && $(field).value=="") {
        alert(this.data.row.field[m].desc+"  "+gLanguage.errorRequired);
        $(field).focus();
        return false;
      }
      if (this.data.row.field[m].type == "date") {
        if (!this.checkDate(field, escape(this.data.row.field[m].desc))) return false;
        var s=stringToDate($(field).value, gLanguage.dateFormat, "");
        if (s!="") $(field).value=formatDate(s , gSettings.dbDateFormat);
      }
      if (this.data.row.field[m].type == "username") {
        if (!this.checkUsername(field, escape(this.data.row.field[m].desc))) return false;
        if (!this.checkUnique(field, escape(this.data.row.field[m].desc))) return false;
      }
      if (this.data.row.field[m].type == "varchar" || this.data.row.field[m].type == "shortvarchar" || this.data.row.field[m].type == "char" || this.data.row.field[m].type == "unique varchar") {
        if (this.data.row.field[m].settings == "email") {
          if (!this.checkEmail(field, escape(this.data.row.field[m].desc))) return false;
        }
        if (this.data.row.field[m].settings == "sum11strong") {
          if (!this.checkSum11(field, escape(this.data.row.field[m].desc), false)) return false;
        }
        if (this.data.row.field[m].settings == "sum11weak") {
          if (!this.checkSum11(field, escape(this.data.row.field[m].desc), true)) return false;
        }
        if (this.data.row.field[m].settings == "unique varchar") {
          if (!this.checkUnique(field, escape(this.data.row.field[m].desc))) return false;
        }
      }
      if (this.data.row.field[m].type == "int") {
        if (!this.checkInt(field, escape(this.data.row.field[m].desc))) return false;
      }
    } else if (this.data.row.field[m].type=="password" && $(field+'1')) {
      if (this.data.row.field[m].type == "password") {
        if (this.data.row.field[m].required==1 && this.data.row.id==-1 && $(field+'1').value=="") {
          alert(this.data.row.field[m].desc+" "+gLanguage.errorRequired);
          $(field+'1').focus();
          return false;
        }
        if (!this.checkPassword(field, this.data.row.field[m].desc, this.data.row.id)) return false;
      }
    } else if (this.data.row.field[m].type == "permissions") this.data.row.field[m].value = this.calculatePermissions(field);
  }
  return true;
}

DataBrowser.prototype.modified = function () {
  for (var m=0; m<this.data.row.field.length; m++) {
    var field = this.objectName+this.data.row.field[m].name;
    if ($(field)) {
      var v=$(field).value;
      if (v==undefined) v="";
      if (this.data.row.field[m].type == "varchar" || this.data.row.field[m].type == "shortvarchar" || this.data.row.field[m].type == "unique varchar" || this.data.row.field[m].type == "char" || this.data.row.field[m].type == "text" || this.data.row.field[m].type == "username") v=unescape(v);
      if (v != this.data.row.field[m].value) return true;
    }
  }
  return false;
}


DataBrowser.prototype.closeBrowser = function() {
  this.showing = false;
  eval(this.callback);
}

DataBrowser.prototype.deleteRecord = function() {
  if (confirm(gLanguage.warningBeforeDelete)) {
    var r="if ("+this.objectName+".xhReqPopup.xhReq.responseText.indexOf('OK')<0) alert("+this.objectName+".xhReqPopup.xhReq.responseText); "+this.objectName+".refreshBrowser();";
    var xml = "<row><action>delete</action><table>"+this.data.row.table+"</table><id1>"+this.data.row.id+"</id1></row>";
    this.xhReqPopup.post("services/one_delete_records.php", r, xml);
  }
}

DataBrowser.prototype.insertRecord = function() {
  if (!this.checkFields()) return false;

  var xml = "<row><action>insert</action><table>"+this.data.row.table+"</table>";
  for (var m=0; m<this.data.row.field.length; m++) {
    if ($(this.objectName+this.data.row.field[m].name)) {
      xml += "<"+this.data.row.field[m].name+">";
      v=$(this.objectName+this.data.row.field[m].name).value;
      if (v==undefined || v=="") v="null";
      if (this.data.row.field[m].type == "varchar" || this.data.row.field[m].type == "shortvarchar" || this.data.row.field[m].type == "unique varchar" || this.data.row.field[m].type == "char" || this.data.row.field[m].type == "text" || this.data.row.field[m].type == "username" || this.data.row.field[m].type == "int") v=escape(v);
      xml += v;
      xml += "</"+this.data.row.field[m].name+">";
    } else if (this.data.row.field[m].type=="password" && $(this.objectName+this.data.row.field[m].name+'1')) {
      xml += "<"+this.data.row.field[m].name+">";
      xml += hex_md5($(this.objectName+this.data.row.field[m].name+'1').value);
      xml += "</"+this.data.row.field[m].name+">";
    } else if (this.data.row.field[m].type == "permissions") {
      xml += "<"+this.data.row.field[m].name+">";
      xml += this.data.row.field[m].value;
      xml += "</"+this.data.row.field[m].name+">";
    }
  }
  xml += "</row>";

  var r="if ("+this.objectName+".xhReqPopup.xhReq.responseText.indexOf('OK')<0) alert("+this.objectName+".xhReqPopup.xhReq.responseText); "+this.objectName+".closeBrowser();";
  this.xhReqPopup.post("services/one_insert.php", r, xml);
  return true;
}

DataBrowser.prototype.updateRecord = function() {
  if (!this.checkFields()) return false;
  var xml = "<row><action>update</action><table>"+this.data.row.table+"</table>";
  var v="";
  for (var m=0; m<this.data.row.field.length; m++) {
    if ($(this.objectName+this.data.row.field[m].name)) {
      xml += "<"+this.data.row.field[m].name+">";
      v=$(this.objectName+this.data.row.field[m].name).value;
      if (v==undefined || v=="") v="null";
      if (this.data.row.field[m].type == "varchar" || this.data.row.field[m].type == "shortvarchar" || this.data.row.field[m].type == "unique varchar" || this.data.row.field[m].type == "char" || this.data.row.field[m].type == "text" || this.data.row.field[m].type == "username" || this.data.row.field[m].type == "int") v=escape(v);
      xml += v;
      xml += "</"+this.data.row.field[m].name+">";
    } else if (this.data.row.field[m].type=="password" && $(this.objectName+this.data.row.field[m].name+'1')) {
      if ($(this.objectName+this.data.row.field[m].name+'1').value!="") {
        xml += "<"+this.data.row.field[m].name+">";
        xml += hex_md5($(this.objectName+this.data.row.field[m].name+'1').value);
        xml += "</"+this.data.row.field[m].name+">";
      }
    } else if (this.data.row.field[m].type == "permissions") {
      xml += "<"+this.data.row.field[m].name+">";
      xml += this.data.row.field[m].value;
      xml += "</"+this.data.row.field[m].name+">";
    }
  }
  xml += "</row>";
  var r="if ("+this.objectName+".xhReqPopup.xhReq.responseText.indexOf('OK')<0) alert(unescape("+this.objectName+".xhReqPopup.xhReq.responseText)); "+this.objectName+".closeBrowser();";
  this.xhReqPopup.post("services/one_update.php", r, xml);
  return true;
}
