﻿var db={};
db.consts={};
db.datatype={};
db.consts.INTEGER  = "integer";
db.consts.STRING   = "string";
db.consts.DEFAULT_STR_LEN   = 128;

db.datatype.Integer = {
    "@dt:type"        : "int",
    "@dt:maxLength"   : "4",
    "@rs:precision"   : "10",
    "@rs:fixedlength" : "true",
    "@rs:maybenull"   : "false"
};

db.datatype.String = function(maxLength){
  var maxLen = maxLength;
  if (!maxLen || isNaN(parseInt(maxLen,10))){
    maxLen = db.consts.DEFAULT_STR_LEN;
  }
    this["@dt:type"]          = "string";
    this["@rs:dbtype"]        = "str";
    this["@dt:maxLength"]     = maxLen;
    this["@rs:maybenull"]     = "false";
};

db.consts.getDefaultValue=function(dataType){
  if (dataType==db.consts.INTEGER) {
    return 0;
  } else {
    return "";
  }
};
/**
 * 字段xml字符? * @param {String} 字段? * @param {String} 字段规范化名?
 * @param {Integer}索引（从0开始）
 * @param {Object} 数据类型对象，{dataType，maxLength}
 */
db.datatype.AttributeType = function(fieldName,unidName,index,typeObject) {
  var iIndex = parseInt(index,10)+1;
  var typeObj = typeObject;
	this["@name"]             = "C"+iIndex;
  this["@rs:name"]          = fieldName;
	this["@rs:number"]        = iIndex;
	this["@rs:writeunknown"]  = "true";
	this["@rs:basecatalog"]   = "HnXkfglxt";
	this["@rs:basetable"]     = "basetablename";
	this["@rs:basecolumn"]    = fieldName;
	this["@rs:autoincrement"] = "false";
	if (!typeObj){
	  typeObj={};
	}
	if (typeof typeObj.dataType==="undefined"){
	  typeObj.dataType = db.consts.STRING;
	}
	if (db.consts.STRING==typeObj.dataType){
	  this["s:datatype"] = new db.datatype.String(typeObj.maxLength);
	}else{
	  this["s:datatype"] = db.datatype.Integer;
	}
};

db.DbXmlJson = function() {
  this._DbXmlJson={
    "xml": {
      "@xmlns:s"  : "uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882",
      "@xmlns:dt" : "uuid:C2F41010-65B3-11d1-A29F-00AA00C14882",
      "@xmlns:rs" : "urn:schemas-microsoft-com:rowset",
      "@xmlns:z"  : "#RowsetSchema",
      "s:Schema"  : {
        "@id"     : "RowsetSchema",
        "s:ElementType" : {
          "@name" : "row",
          "@content":"eltOnly",
          "@rs:updatable":"true",
          "s:AttributeType":[] 
        }
      },
      "rs:data" :{
        "z:row" :[]
      }
    }
  };
  this._fieldsJson = this._DbXmlJson.xml['s:Schema']['s:ElementType']['s:AttributeType'];
  this._dataRows = this._DbXmlJson.xml['rs:data']['z:row'];
  this._fieldDefs = [];
};

db.DbXmlJson.prototype.clearRows = function(){
  this._DbXmlJson.xml['rs:data']={
    "z:row" :[]
  };
  this._dataRows = this._DbXmlJson.xml['rs:data']['z:row'];
};
/**
 * 向数据记录集合增加一条记录
 * 如果提供的字段在字段定义中没有将被忽略
 * 如果需要的字段没有提供则根据数据类型使用默认值
 * @param {object} 数据记录对象
 */
db.DbXmlJson.prototype.addRow = function(dataObj){
  if (typeof dataObj!=="object"){
    alert("参数记录数据不是对象[DbXmlJson.addRow()]");
    return false;
  }
  var rowObj={};
  for (var i=0; i<this._fieldDefs.length; i++){
    var tmpData = dataObj[this._fieldDefs[i].fieldName];
    if (typeof tmpData==="undefined") {
      tmpData=db.consts.getDefaultValue(this._fieldDefs[i].dateType);
    }
    rowObj["@"+this._fieldDefs[i].unidName] = this.charToEntity(tmpData);
  }
  this._dataRows[this._dataRows.length]=rowObj;
  return true;
};

/**
 * 增加一个整数字段定? * @param {String} 字段? */
db.DbXmlJson.prototype.addIntDef = function(fieldName){
  var dataType={
    dataType  : db.consts.INTEGER
  };
  return this._addDef(fieldName,dataType);
};

/**
 * 增加一个字符串字段定义
 * @param {String} 字段? * @param {Integer}字符串的最大长?
 */
db.DbXmlJson.prototype.addStringDef = function(fieldName,maxLen){
  var dataType={
    dataType  : db.consts.STRING,
    maxLength : maxLen
  };
  return this._addDef(fieldName,dataType);
};
/**
 * @param {String} 字段? * @param {Object} 数据类型对象
 */
db.DbXmlJson.prototype._addDef = function(fieldName,typeObject){
  if (!this.isValidFieldName(fieldName)){
    return false;
  }
  var iIndex = this._fieldDefs.length;
  var unidName="C"+(iIndex+1);
  this._fieldsJson[iIndex] = new db.datatype.AttributeType(fieldName,
            unidName,iIndex,typeObject);
  this._fieldDefs[iIndex] = {
    'fieldName' : fieldName,
    'unidName'  : unidName,
    'dateType'  : typeObject.dataType
  };
  return true;
};

db.DbXmlJson.prototype.getFieldDef = function(index){
  if (index>=0 && index<this._fieldDefs.length){
    return this._fieldDefs[index];
  }else{
    return null;
  }
};

db.DbXmlJson.prototype.getFieldCount = function(){
  return this._fieldDefs.length;
};

db.DbXmlJson.prototype.dbXML = function(){
  if (this._dataRows.length===0){
    this._DbXmlJson.xml['rs:data']=null;
  }
  var result = xmlJsonClass.json2xml(this._DbXmlJson);
  if (!this._DbXmlJson.xml['rs:data']){
    this.clearRows();
  }
  result = "<?xml version=\"1.0\" encoding=\"gbk\" ?>" + result;
  return result;
};

db.DbXmlJson.prototype.charToEntity = function(value){
  if (typeof value==="string"){
    var result = value.replace(/</g,"&lt;");
    result = result.replace(/&/g,"&amp;");
    result = result.replace(/>/g,"&gt;");
    result = result.replace(/"/g,"&quot;");
    result = result.replace(/'/g,"&apos;");
    return result;
  }else{
    return value;
  }
};

db.DbXmlJson.prototype.isValidFieldName = function(value){
  if (typeof value==="string"){
    var regExp = /"|&|</g;
    if (regExp.test(value)){
      alert("字段“"+value+"”中含有不允许出现的“\"、&或<”字符，该字段将被忽略");
      return false;
    } else if (value.length>127){
      alert("字段名不能超过127个字（符）\r\n"+value);
      return false;
    }else{
      return true;
    }
  }else{
    return true;
  }
};

