/*
	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);
}
