| /* |
| Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved. |
| Available via Academic Free License >= 2.1 OR the modified BSD license. |
| see: http://dojotoolkit.org/license for details |
| */ |
| |
| |
| if(!dojo._hasResource["dojox.data.CsvStore"]){ |
| dojo._hasResource["dojox.data.CsvStore"]=true; |
| dojo.provide("dojox.data.CsvStore"); |
| dojo.require("dojo.data.util.filter"); |
| dojo.require("dojo.data.util.simpleFetch"); |
| dojo.declare("dojox.data.CsvStore",null,{constructor:function(_1){ |
| this._attributes=[]; |
| this._attributeIndexes={}; |
| this._dataArray=[]; |
| this._arrayOfAllItems=[]; |
| this._loadFinished=false; |
| if(_1.url){ |
| this.url=_1.url; |
| } |
| this._csvData=_1.data; |
| if(_1.label){ |
| this.label=_1.label; |
| }else{ |
| if(this.label===""){ |
| this.label=undefined; |
| } |
| } |
| this._storeProp="_csvStore"; |
| this._idProp="_csvId"; |
| this._features={"dojo.data.api.Read":true,"dojo.data.api.Identity":true}; |
| this._loadInProgress=false; |
| this._queuedFetches=[]; |
| this.identifier=_1.identifier; |
| if(this.identifier===""){ |
| delete this.identifier; |
| }else{ |
| this._idMap={}; |
| } |
| if("separator" in _1){ |
| this.separator=_1.separator; |
| } |
| if("urlPreventCache" in _1){ |
| this.urlPreventCache=_1.urlPreventCache?true:false; |
| } |
| },url:"",label:"",identifier:"",separator:",",urlPreventCache:false,_assertIsItem:function(_2){ |
| if(!this.isItem(_2)){ |
| throw new Error(this.declaredClass+": a function was passed an item argument that was not an item"); |
| } |
| },_getIndex:function(_3){ |
| var _4=this.getIdentity(_3); |
| if(this.identifier){ |
| _4=this._idMap[_4]; |
| } |
| return _4; |
| },getValue:function(_5,_6,_7){ |
| this._assertIsItem(_5); |
| var _8=_7; |
| if(typeof _6==="string"){ |
| var ai=this._attributeIndexes[_6]; |
| if(ai!=null){ |
| var _9=this._dataArray[this._getIndex(_5)]; |
| _8=_9[ai]||_7; |
| } |
| }else{ |
| throw new Error(this.declaredClass+": a function was passed an attribute argument that was not a string"); |
| } |
| return _8; |
| },getValues:function(_a,_b){ |
| var _c=this.getValue(_a,_b); |
| return (_c?[_c]:[]); |
| },getAttributes:function(_d){ |
| this._assertIsItem(_d); |
| var _e=[]; |
| var _f=this._dataArray[this._getIndex(_d)]; |
| for(var i=0;i<_f.length;i++){ |
| if(_f[i]!==""){ |
| _e.push(this._attributes[i]); |
| } |
| } |
| return _e; |
| },hasAttribute:function(_10,_11){ |
| this._assertIsItem(_10); |
| if(typeof _11==="string"){ |
| var _12=this._attributeIndexes[_11]; |
| var _13=this._dataArray[this._getIndex(_10)]; |
| return (typeof _12!=="undefined"&&_12<_13.length&&_13[_12]!==""); |
| }else{ |
| throw new Error(this.declaredClass+": a function was passed an attribute argument that was not a string"); |
| } |
| },containsValue:function(_14,_15,_16){ |
| var _17=undefined; |
| if(typeof _16==="string"){ |
| _17=dojo.data.util.filter.patternToRegExp(_16,false); |
| } |
| return this._containsValue(_14,_15,_16,_17); |
| },_containsValue:function(_18,_19,_1a,_1b){ |
| var _1c=this.getValues(_18,_19); |
| for(var i=0;i<_1c.length;++i){ |
| var _1d=_1c[i]; |
| if(typeof _1d==="string"&&_1b){ |
| return (_1d.match(_1b)!==null); |
| }else{ |
| if(_1a===_1d){ |
| return true; |
| } |
| } |
| } |
| return false; |
| },isItem:function(_1e){ |
| if(_1e&&_1e[this._storeProp]===this){ |
| var _1f=_1e[this._idProp]; |
| if(this.identifier){ |
| var _20=this._dataArray[this._idMap[_1f]]; |
| if(_20){ |
| return true; |
| } |
| }else{ |
| if(_1f>=0&&_1f<this._dataArray.length){ |
| return true; |
| } |
| } |
| } |
| return false; |
| },isItemLoaded:function(_21){ |
| return this.isItem(_21); |
| },loadItem:function(_22){ |
| },getFeatures:function(){ |
| return this._features; |
| },getLabel:function(_23){ |
| if(this.label&&this.isItem(_23)){ |
| return this.getValue(_23,this.label); |
| } |
| return undefined; |
| },getLabelAttributes:function(_24){ |
| if(this.label){ |
| return [this.label]; |
| } |
| return null; |
| },_fetchItems:function(_25,_26,_27){ |
| var _28=this; |
| var _29=function(_2a,_2b){ |
| var _2c=null; |
| if(_2a.query){ |
| var key,_2d; |
| _2c=[]; |
| var _2e=_2a.queryOptions?_2a.queryOptions.ignoreCase:false; |
| var _2f={}; |
| for(key in _2a.query){ |
| _2d=_2a.query[key]; |
| if(typeof _2d==="string"){ |
| _2f[key]=dojo.data.util.filter.patternToRegExp(_2d,_2e); |
| } |
| } |
| for(var i=0;i<_2b.length;++i){ |
| var _30=true; |
| var _31=_2b[i]; |
| for(key in _2a.query){ |
| _2d=_2a.query[key]; |
| if(!_28._containsValue(_31,key,_2d,_2f[key])){ |
| _30=false; |
| } |
| } |
| if(_30){ |
| _2c.push(_31); |
| } |
| } |
| }else{ |
| _2c=_2b.slice(0,_2b.length); |
| } |
| _26(_2c,_2a); |
| }; |
| if(this._loadFinished){ |
| _29(_25,this._arrayOfAllItems); |
| }else{ |
| if(this.url!==""){ |
| if(this._loadInProgress){ |
| this._queuedFetches.push({args:_25,filter:_29}); |
| }else{ |
| this._loadInProgress=true; |
| var _32={url:_28.url,handleAs:"text",preventCache:_28.urlPreventCache}; |
| var _33=dojo.xhrGet(_32); |
| _33.addCallback(function(_34){ |
| try{ |
| _28._processData(_34); |
| _29(_25,_28._arrayOfAllItems); |
| _28._handleQueuedFetches(); |
| } |
| catch(e){ |
| _27(e,_25); |
| } |
| }); |
| _33.addErrback(function(_35){ |
| _28._loadInProgress=false; |
| if(_27){ |
| _27(_35,_25); |
| }else{ |
| throw _35; |
| } |
| }); |
| var _36=null; |
| if(_25.abort){ |
| _36=_25.abort; |
| } |
| _25.abort=function(){ |
| var df=_33; |
| if(df&&df.fired===-1){ |
| df.cancel(); |
| df=null; |
| } |
| if(_36){ |
| _36.call(_25); |
| } |
| }; |
| } |
| }else{ |
| if(this._csvData){ |
| try{ |
| this._processData(this._csvData); |
| this._csvData=null; |
| _29(_25,this._arrayOfAllItems); |
| } |
| catch(e){ |
| _27(e,_25); |
| } |
| }else{ |
| var _37=new Error(this.declaredClass+": No CSV source data was provided as either URL or String data input."); |
| if(_27){ |
| _27(_37,_25); |
| }else{ |
| throw _37; |
| } |
| } |
| } |
| } |
| },close:function(_38){ |
| },_getArrayOfArraysFromCsvFileContents:function(_39){ |
| if(dojo.isString(_39)){ |
| var _3a=new RegExp("^\\s+","g"); |
| var _3b=new RegExp("\\s+$","g"); |
| var _3c=new RegExp("\"\"","g"); |
| var _3d=[]; |
| var i; |
| var _3e=this._splitLines(_39); |
| for(i=0;i<_3e.length;++i){ |
| var _3f=_3e[i]; |
| if(_3f.length>0){ |
| var _40=_3f.split(this.separator); |
| var j=0; |
| while(j<_40.length){ |
| var _41=_40[j]; |
| var _42=_41.replace(_3a,""); |
| var _43=_42.replace(_3b,""); |
| var _44=_43.charAt(0); |
| var _45=_43.charAt(_43.length-1); |
| var _46=_43.charAt(_43.length-2); |
| var _47=_43.charAt(_43.length-3); |
| if(_43.length===2&&_43=="\"\""){ |
| _40[j]=""; |
| }else{ |
| if((_44=="\"")&&((_45!="\"")||((_45=="\"")&&(_46=="\"")&&(_47!="\"")))){ |
| if(j+1===_40.length){ |
| return; |
| } |
| var _48=_40[j+1]; |
| _40[j]=_42+this.separator+_48; |
| _40.splice(j+1,1); |
| }else{ |
| if((_44=="\"")&&(_45=="\"")){ |
| _43=_43.slice(1,(_43.length-1)); |
| _43=_43.replace(_3c,"\""); |
| } |
| _40[j]=_43; |
| j+=1; |
| } |
| } |
| } |
| _3d.push(_40); |
| } |
| } |
| this._attributes=_3d.shift(); |
| for(i=0;i<this._attributes.length;i++){ |
| this._attributeIndexes[this._attributes[i]]=i; |
| } |
| this._dataArray=_3d; |
| } |
| },_splitLines:function(_49){ |
| var _4a=[]; |
| var i; |
| var _4b=""; |
| var _4c=false; |
| for(i=0;i<_49.length;i++){ |
| var c=_49.charAt(i); |
| switch(c){ |
| case "\"": |
| _4c=!_4c; |
| _4b+=c; |
| break; |
| case "\r": |
| if(_4c){ |
| _4b+=c; |
| }else{ |
| _4a.push(_4b); |
| _4b=""; |
| if(i<(_49.length-1)&&_49.charAt(i+1)=="\n"){ |
| i++; |
| } |
| } |
| break; |
| case "\n": |
| if(_4c){ |
| _4b+=c; |
| }else{ |
| _4a.push(_4b); |
| _4b=""; |
| } |
| break; |
| default: |
| _4b+=c; |
| } |
| } |
| if(_4b!==""){ |
| _4a.push(_4b); |
| } |
| return _4a; |
| },_processData:function(_4d){ |
| this._getArrayOfArraysFromCsvFileContents(_4d); |
| this._arrayOfAllItems=[]; |
| if(this.identifier){ |
| if(this._attributeIndexes[this.identifier]===undefined){ |
| throw new Error(this.declaredClass+": Identity specified is not a column header in the data set."); |
| } |
| } |
| for(var i=0;i<this._dataArray.length;i++){ |
| var id=i; |
| if(this.identifier){ |
| var _4e=this._dataArray[i]; |
| id=_4e[this._attributeIndexes[this.identifier]]; |
| this._idMap[id]=i; |
| } |
| this._arrayOfAllItems.push(this._createItemFromIdentity(id)); |
| } |
| this._loadFinished=true; |
| this._loadInProgress=false; |
| },_createItemFromIdentity:function(_4f){ |
| var _50={}; |
| _50[this._storeProp]=this; |
| _50[this._idProp]=_4f; |
| return _50; |
| },getIdentity:function(_51){ |
| if(this.isItem(_51)){ |
| return _51[this._idProp]; |
| } |
| return null; |
| },fetchItemByIdentity:function(_52){ |
| var _53; |
| var _54=_52.scope?_52.scope:dojo.global; |
| if(!this._loadFinished){ |
| var _55=this; |
| if(this.url!==""){ |
| if(this._loadInProgress){ |
| this._queuedFetches.push({args:_52}); |
| }else{ |
| this._loadInProgress=true; |
| var _56={url:_55.url,handleAs:"text"}; |
| var _57=dojo.xhrGet(_56); |
| _57.addCallback(function(_58){ |
| try{ |
| _55._processData(_58); |
| var _59=_55._createItemFromIdentity(_52.identity); |
| if(!_55.isItem(_59)){ |
| _59=null; |
| } |
| if(_52.onItem){ |
| _52.onItem.call(_54,_59); |
| } |
| _55._handleQueuedFetches(); |
| } |
| catch(error){ |
| if(_52.onError){ |
| _52.onError.call(_54,error); |
| } |
| } |
| }); |
| _57.addErrback(function(_5a){ |
| this._loadInProgress=false; |
| if(_52.onError){ |
| _52.onError.call(_54,_5a); |
| } |
| }); |
| } |
| }else{ |
| if(this._csvData){ |
| try{ |
| _55._processData(_55._csvData); |
| _55._csvData=null; |
| _53=_55._createItemFromIdentity(_52.identity); |
| if(!_55.isItem(_53)){ |
| _53=null; |
| } |
| if(_52.onItem){ |
| _52.onItem.call(_54,_53); |
| } |
| } |
| catch(e){ |
| if(_52.onError){ |
| _52.onError.call(_54,e); |
| } |
| } |
| } |
| } |
| }else{ |
| _53=this._createItemFromIdentity(_52.identity); |
| if(!this.isItem(_53)){ |
| _53=null; |
| } |
| if(_52.onItem){ |
| _52.onItem.call(_54,_53); |
| } |
| } |
| },getIdentityAttributes:function(_5b){ |
| if(this.identifier){ |
| return [this.identifier]; |
| }else{ |
| return null; |
| } |
| },_handleQueuedFetches:function(){ |
| if(this._queuedFetches.length>0){ |
| for(var i=0;i<this._queuedFetches.length;i++){ |
| var _5c=this._queuedFetches[i]; |
| var _5d=_5c.filter; |
| var _5e=_5c.args; |
| if(_5d){ |
| _5d(_5e,this._arrayOfAllItems); |
| }else{ |
| this.fetchItemByIdentity(_5c.args); |
| } |
| } |
| this._queuedFetches=[]; |
| } |
| }}); |
| dojo.extend(dojox.data.CsvStore,dojo.data.util.simpleFetch); |
| } |