MzDataProvider.js
上传用户:yatiankong
上传日期:2014-05-16
资源大小:5604k
文件大小:11k
源码类别:

Applet

开发平台:

Java

  1. /*---------------------------------------------------------------------------*
  2. |  Subject:    DataProvider for Meizz WebControl
  3. |  NameSpace:  System.Data.MzDataProvider
  4. |  Author:     meizz
  5. |  Created:    2005-12-28
  6. |  Version:    2007-02-07
  7. |-----------------------------------
  8. |  MSN: huangfr@msn.com QQ:112889082 Copyright (c) meizz
  9. |  http://www.meizz.com/jsframework/ MIT-style license
  10. |  The above copyright notice and this permission notice shall be
  11. |  included in all copies or substantial portions of the Software
  12. *---------------------------------------------------------------------------*/
  13. //text,description,icon,url,target,JSData,XMLData,ULData
  14. function MzDataProvider(){System.call(this);}
  15. t=MzDataProvider.Extends(System, "MzDataProvider");
  16. t.__="x0f";
  17. t.rootId="-1";
  18. t.dividerEncoding=t.divider="_";
  19. t.indexes=t.jsDataPath=t.xmlDataPath="";
  20. t.appendIndexes=function(s){this.indexes += this.__+ s +this.__;}
  21. t.getUniqueId=function(){return "MzDataProvider"+(MzDataProvider.nodeCounter++).toString(36);};
  22. MzDataProvider.nodeCounter=0;
  23. t.nodePrototype=window.MzDataNode = function()
  24. {
  25.   this.index= (MzDataProvider.nodeCounter++).toString(36);
  26.   this.childNodes=[];
  27. };
  28. t=MzDataNode.Extends(System, "MzDataNode");
  29. t.text = t.path = t.sourceIndex="";
  30. t.isLoaded = t.hasChild= false;
  31. t.parentNode = t.$$caller = null;  //instance of System.Data.MzDataProvider
  32. //public
  33. MzDataProvider.prototype.setDivider=function(d)
  34. {
  35.   this.divider=d; for(var a="", i=0; i<d.length; i++)
  36.   a+=("'^{[(\-|+.*?)]}$"".indexOf(d.charAt(i))>-1?"\":"")+d.charAt(i);
  37.   this.dividerEncoding = a;
  38. };
  39. MzDataProvider.prototype.setAsyncJsDataPath=function(path)
  40. {
  41.   if(path.length>0) this.jsDataPath = path.replace(/[\/]*$/, "/");
  42. }
  43. MzDataProvider.prototype.setAsyncXmlDataPath=function(path)
  44. {
  45.   if(path.length>0) this.xmlDataPath = path.replace(/[\/]*$/, "/");
  46. }
  47. MzDataProvider.prototype.render=function(){this.dataInit();};
  48. //private: initialize data node
  49. MzDataProvider.prototype.dataInit = function()
  50. {
  51.   if(this._dataInitialized) return;
  52.   if("object"!=typeof this.nodes) this.nodes={};
  53.   if("object"!=typeof this.dataSource) this.dataSource={};
  54.   var _=this.__, d=this.dividerEncoding, a=[], i;
  55.   for(i in this.dataSource)a[a.length]=i;this.appendIndexes(a.join(_));
  56.   this.dataSource.length=(this.dataSource.length||0)+ a.length;
  57.   a=(MzDataProvider.nodeCounter++).toString(36);
  58.   var node=this.nodes[a]=this.rootNode = new this.nodePrototype; //this.imaginaryNode
  59.   node.$$caller=this;node.index=a;node.virgin=this.rootId=="-1";
  60.   if(node.virgin)
  61.   {
  62.     node.id=node.path="-1";
  63.     node.loadChildNodes();
  64.     node.hasChildNodes();
  65.   }
  66.   else
  67.   {
  68.     a=new RegExp("([^"+_+d+"]+)"+ d +"("+ this.rootId +")("+_+"|$)");
  69.     if(a.test(this.indexes))
  70.     {
  71.       a=RegExp.$1 + this.divider + this.rootId;
  72.       node.childNodes[0]=node.DTO(this.nodePrototype, a);
  73.       node.isLoaded=true; node.hasChild=true;
  74.     }
  75.   }
  76.   this._dataInitialized=true;
  77. };
  78. //public: append data onafterload
  79. MzDataProvider.prototype.appendData = function(data, override) //param data: json
  80. {
  81.   if("object"!=typeof this.dataSource) this.dataSource={}; var a=[],i;
  82.   for(i in data)if(!this.dataSource[i]){this.dataSource[i]=data[i];a[a.length]=i}
  83.   if(this._dataInitialized) this.appendIndexes(a.join(this.__));
  84.   this.dataSource.length=(this.dataSource.length||0)+a.length;data=null;a=null;
  85. };
  86. //public: getNode (has Builded) by sourceId
  87. MzDataProvider.prototype.getNodeById = function(id)
  88. {
  89.   if(id==this.rootId&&this.rootNode.virgin) return this.rootNode;
  90.   var _=this.__, d = this.dividerEncoding;
  91.   var reg=new RegExp("([^"+_+ d +"]+"+ d + id +")("+_+"|$)");
  92.   if(reg.test(this.indexes)){var s=this.dataSource[RegExp.$1];
  93.   if("string"==typeof(s)) return this.nodes[s.getAttribute("index_"+this.hashCode)];
  94.   else if("object"==typeof(s)) return this.nodes[s["index_"+this.hashCode]];
  95.   else{System.alert("The node isn't initialized!"); return null;}}
  96.   alert("sourceId="+ id +" is nonexistent!"); return null;
  97. };
  98. //public: asynchronous get childNodes from JS File
  99. MzDataProvider.prototype.loadJsData = function(JsFileUrl)
  100. {
  101.   var js; try{if(js = System.load("",JsFileUrl)){var d=eval(js);
  102.   if("object"!=d && "object"==typeof(data) && null!=data)d=data;
  103.   this.appendData(d); data=d=null;}}catch(e){}
  104. };
  105. //public: asynchronous get childNodes from Json File
  106. MzDataProvider.prototype.loadJsonData = function(JsonFileUrl)
  107. {
  108.   MzDataProvider.instance=this;
  109.   if("undefined"==typeof(MzJson))Using("System.Net.MzJson");
  110.   var e=new MzJson();  e.cache = /.js$/i.test(JsonFileUrl);
  111.   e.request(JsonFileUrl); e=null;
  112. };
  113. window.MzJsonDataLoad=function(json)
  114. {
  115.   if(MzDataProvider.instance) MzDataProvider.instance.appendData(json);
  116.   MzDataProvider.instance=null;
  117. }
  118. //public: asynchronous get childNodes from XML File
  119. MzDataProvider.prototype.loadXmlData = function(url, parentId, mapping)
  120. {
  121.   if(System.supportsXmlHttp())
  122.   {
  123.     //Using("System.Xml.MzXmlDocument");
  124.     if("undefined"==typeof parentId) parentId=this.rootId;
  125.     var x=new MzXmlDocument(); x.async=false; x.load(url);
  126.     if(x.readyState==4)
  127.     {
  128.       if(!x.documentElement)
  129.         alert("xmlDoc.documentElement = null, Please update your browser");
  130.       this._loadXmlNodeData(x.documentElement, parentId, mapping);
  131.     }
  132.   }
  133. };
  134. //public: asynchronous get childNodes from XML String
  135. MzDataProvider.prototype.loadXmlDataString = function(xmlString, parentId, mapping)
  136. {
  137.   if(System.supportsXmlHttp())
  138.   {
  139.     //Using("System.Xml.MzXmlDocument");
  140.     if("undefined"==typeof parentId) parentId=this.rootId;
  141.     var x=new MzXmlDocument(); x.loadXML(xmlString);
  142.     this._loadXmlNodeData(x.documentElement, parentId, mapping);
  143.   }
  144. };
  145. MzDataProvider.prototype._loadXmlNodeData = function(xmlNode, parentId, mapping)
  146. {
  147.   if(!(xmlNode && xmlNode.hasChildNodes())) return;
  148.   for(var k,id,i=0,data={},n=xmlNode.childNodes; i<n.length; i++)
  149.   {
  150.     if(n[i].nodeType==1){id=n[i].getAttribute("id")||this.getUniqueId();
  151.     if(n[i].hasChildNodes()){for(k=0,nic=n[i].childNodes;k<nic.length;k++)
  152.     {
  153.       if(nic[k].nodeType==1){this._loadXmlNodeData(n[i], id, mapping);break;}}
  154.     }
  155.     for(var k=0,s="",a=n[i].attributes; k<a.length; k++)
  156.     {
  157.       if(mapping) s=s.setAttribute(mapping[a[k].name.toLowerCase()]||a[k].name, a[k].value);
  158.       else s=s.setAttribute(a[k].name, a[k].value);
  159.     }
  160.     if(!s.getAttribute("text")) s="text:;"+ s;
  161.     a=parentId + this.divider + id; data[a]=s;}
  162.   }
  163.   this.appendData(data);
  164. };
  165. //public
  166. MzDataProvider.prototype.loadUlData=function(HtmlUL, parentId)
  167. {
  168.   if("undefined"==typeof parentId) parentId=this.rootId; var ul;
  169.   if("string"==typeof HtmlUL&&(ul=document.getElementById(HtmlUL)));
  170.   else if("object"==typeof HtmlUL&&(ul=HtmlUL.tagName)&&
  171.     "UL OL".indexOf(ul.toUpperCase())>-1) ul=HtmlUL;
  172.   if("object"==typeof ul)
  173.   {
  174.     var data={}; for(var i=0, n=ul.childNodes; i<n.length; i++)
  175.     {
  176.       if(n[i].nodeType==1 && n[i].tagName=="LI")
  177.       {
  178.         var id=n[i].getAttribute("sourceid")||this.getUniqueId(),txt="",link="";
  179.         for(var k=0; k<n[i].childNodes.length; k++)
  180.         {
  181.           var node=n[i].childNodes[k];
  182.           if(node.nodeType==3) txt += node.nodeValue;
  183.           if(node.nodeType==1)
  184.           {
  185.             switch(node.tagName)
  186.             {
  187.               case "UL":
  188.               case "OL": this.loadUlData(node, id); break;
  189.               case "A" : if(!link) link=node; break;
  190.             }
  191.           }
  192.         }
  193.         var str="";
  194.         if(link)
  195.         {
  196.           str=str.setAttribute("target", link.target);
  197.           str=str.setAttribute("url", link.href);
  198.           str=str.setAttribute("text", link.innerHTML);
  199.         }
  200.         else str = str.setAttribute("text", txt);
  201.         var a=n[i].attributes; //<li>.attributes
  202.         for(var k=0; k<a.length; k++)
  203.         {
  204.           if(a[k].specified && a[k].name!="style")
  205.             str = str.setAttribute(a[k].name, a[k].value);
  206.         }
  207.         a=parentId + this.divider + id;
  208.         data[a]=str;
  209.       }
  210.     }
  211.     this.appendData(data);
  212.   }
  213. }
  214. //public: check node has child
  215. MzDataNode.prototype.hasChildNodes = function()
  216. {
  217.   var $=this.$$caller;
  218.   this.hasChild=$.indexes.indexOf($.__+ this.id + $.divider)>-1
  219.   ||(this.sourceIndex&&(this.get("JSData")!=null||this.get("XMLData")!=null
  220.   || this.get("ULData")!=null)); return this.hasChild;
  221. };
  222. //public: get node attribute
  223. MzDataNode.prototype.get = function(attribName)
  224. {
  225.   if("undefined"!=typeof(this[attribName]))return this[attribName]; else
  226.   {
  227.     var s=this.$$caller.dataSource[this.sourceIndex];
  228.     if("string"==typeof(s)) return s.getAttribute(attribName);
  229.     else if("object"==typeof(s)) return s[attribName];
  230.   }
  231. };
  232. //public: set node attribute
  233. MzDataNode.prototype.set = function(attribName, value)
  234. {
  235.   if("undefined"!=typeof(this[attribName])) this[attribName]=value; else
  236.   {
  237.     var s=this.$$caller.dataSource[this.sourceIndex];
  238.     if("string"==typeof(s))
  239.       this.$$caller.dataSource[this.sourceIndex]=s.setAttribute(attribName,value);
  240.     else if("object"==typeof(s)) s[attribName]=value;
  241.   }
  242. };
  243. //private: load all node's node and init
  244. MzDataNode.prototype.loadChildNodes = function(DataNodeClass)
  245. {
  246.   var $=this.$$caller,r=$.dividerEncoding,_=$.__, i, cs;
  247.   var tcn=this.childNodes;tcn.length=0;if(this.sourceIndex){
  248.   if((i=this.get("JSData"))) $.loadJsData((/^w+.js(s|?|$)/i.test(i)?$.jsDataPath:"")+i);
  249.   if((i=this.get("ULData"))) $.loadUlData(i, this.id);
  250.   if((i=this.get("XMLData")))$.loadXmlData((/^w+.xml(s|?|$)/i.test(i)?$.xmlDataPath:"")+i,this.id);}
  251.   var reg=new RegExp(_ + this.id + r +"[^"+ _ + r +"]+", "g"); 
  252.   if((cs=$.indexes.match(reg))){for(i=0;i<cs.length;i++){
  253.     tcn[tcn.length]=this.DTO(DataNodeClass, cs[i].substr(_.length));}}
  254.   this.isLoaded = true;
  255. };
  256. MzDataNode.prototype.DTO=function(DataNodeClass, sourceIndex)
  257. {
  258.   var C=DataNodeClass||MzDataNode,$=this.$$caller,d=$.divider,n=new C,s;
  259.   n.$$caller=this.$$caller; s=$.dataSource[n.sourceIndex=sourceIndex];
  260.   n.id=sourceIndex.substr(sourceIndex.indexOf(d)+d.length);
  261.   n.hasChildNodes(); n.parentNode=this; $.nodes[n.index]=n;
  262.   n.path=this.path+d+n.id; n.set("index_"+ $.hashCode,n.index);
  263.   if("string"==typeof(s)) n.text=s.getAttribute("text");
  264.   else if("object"==typeof(s)) n.text=s.text; return n;
  265. };
  266. String.prototype.getAttribute = function(attribute)
  267. {
  268.   if(new RegExp("(^|;)\s*"+attribute+"\s*:\s*([^;]*)\s*(;|$)","i").test(this))
  269.   return RegExp.$2.replace(/%3B/gi,";").replace(/%25/g,"%"); return null;
  270. };
  271. String.prototype.setAttribute = function(attribute, value)
  272. {
  273.   value=(""+value).replace(/%/g,"%25").replace(/;/g,"%3B").replace(/r|n/g,"");
  274.   return (attribute +":"+ value +";" + this);
  275. };
  276. String.prototype.deleteAttribute = function(attribute)
  277. {
  278.   return this.replace(new RegExp("\b\s*"+attribute+"\s*:\s*([^;]*)\s*(;|$)","gi"),"");
  279. };