| /* |
| 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.AppStore"]){ |
| dojo._hasResource["dojox.data.AppStore"]=true; |
| dojo.provide("dojox.data.AppStore"); |
| dojo.require("dojox.atom.io.Connection"); |
| dojo.require("dojo.data.util.simpleFetch"); |
| dojo.require("dojo.data.util.filter"); |
| dojo.experimental("dojox.data.AppStore"); |
| dojo.declare("dojox.data.AppStore",null,{url:"",urlPreventCache:false,xmethod:false,_atomIO:null,_feed:null,_requests:null,_processing:null,_updates:null,_adds:null,_deletes:null,constructor:function(_1){ |
| if(_1&&_1.url){ |
| this.url=_1.url; |
| } |
| if(_1&&_1.urlPreventCache){ |
| this.urlPreventCache=_1.urlPreventCache; |
| } |
| if(!this.url){ |
| throw new Error("A URL is required to instantiate an APP Store object"); |
| } |
| },_setFeed:function(_2,_3){ |
| this._feed=_2; |
| var i; |
| for(i=0;i<this._feed.entries.length;i++){ |
| this._feed.entries[i].store=this; |
| } |
| if(this._requests){ |
| for(i=0;i<this._requests.length;i++){ |
| var _4=this._requests[i]; |
| if(_4.request&&_4.fh&&_4.eh){ |
| this._finishFetchItems(_4.request,_4.fh,_4.eh); |
| }else{ |
| if(_4.clear){ |
| this._feed=null; |
| }else{ |
| if(_4.add){ |
| this._feed.addEntry(_4.add); |
| }else{ |
| if(_4.remove){ |
| this._feed.removeEntry(_4.remove); |
| } |
| } |
| } |
| } |
| } |
| } |
| this._requests=null; |
| },_getAllItems:function(){ |
| var _5=[]; |
| for(var i=0;i<this._feed.entries.length;i++){ |
| _5.push(this._feed.entries[i]); |
| } |
| return _5; |
| },_assertIsItem:function(_6){ |
| if(!this.isItem(_6)){ |
| throw new Error("This error message is provided when a function is called in the following form: "+"getAttribute(argument, attributeName). The argument variable represents the member "+"or owner of the object. The error is created when an item that does not belong "+"to this store is specified as an argument."); |
| } |
| },_assertIsAttribute:function(_7){ |
| if(typeof _7!=="string"){ |
| throw new Error("The attribute argument must be a string. The error is created "+"when a different type of variable is specified such as an array or object."); |
| } |
| for(var _8 in dojox.atom.io.model._actions){ |
| if(_8==_7){ |
| return true; |
| } |
| } |
| return false; |
| },_addUpdate:function(_9){ |
| if(!this._updates){ |
| this._updates=[_9]; |
| }else{ |
| this._updates.push(_9); |
| } |
| },getValue:function(_a,_b,_c){ |
| var _d=this.getValues(_a,_b); |
| return (_d.length>0)?_d[0]:_c; |
| },getValues:function(_e,_f){ |
| this._assertIsItem(_e); |
| var _10=this._assertIsAttribute(_f); |
| if(_10){ |
| if((_f==="author"||_f==="contributor"||_f==="link")&&_e[_f+"s"]){ |
| return _e[_f+"s"]; |
| } |
| if(_f==="category"&&_e.categories){ |
| return _e.categories; |
| } |
| if(_e[_f]){ |
| _e=_e[_f]; |
| if(_e.declaredClass=="dojox.atom.io.model.Content"){ |
| return [_e.value]; |
| } |
| return [_e]; |
| } |
| } |
| return []; |
| },getAttributes:function(_11){ |
| this._assertIsItem(_11); |
| var _12=[]; |
| for(var key in dojox.atom.io.model._actions){ |
| if(this.hasAttribute(_11,key)){ |
| _12.push(key); |
| } |
| } |
| return _12; |
| },hasAttribute:function(_13,_14){ |
| return this.getValues(_13,_14).length>0; |
| },containsValue:function(_15,_16,_17){ |
| var _18=undefined; |
| if(typeof _17==="string"){ |
| _18=dojo.data.util.filter.patternToRegExp(_17,false); |
| } |
| return this._containsValue(_15,_16,_17,_18); |
| },_containsValue:function(_19,_1a,_1b,_1c,_1d){ |
| var _1e=this.getValues(_19,_1a); |
| for(var i=0;i<_1e.length;++i){ |
| var _1f=_1e[i]; |
| if(typeof _1f==="string"&&_1c){ |
| if(_1d){ |
| _1f=_1f.replace(new RegExp(/^\s+/),""); |
| _1f=_1f.replace(new RegExp(/\s+$/),""); |
| } |
| _1f=_1f.replace(/\r|\n|\r\n/g,""); |
| return (_1f.match(_1c)!==null); |
| }else{ |
| if(_1b===_1f){ |
| return true; |
| } |
| } |
| } |
| return false; |
| },isItem:function(_20){ |
| return _20&&_20.store&&_20.store===this; |
| },isItemLoaded:function(_21){ |
| return this.isItem(_21); |
| },loadItem:function(_22){ |
| this._assertIsItem(_22.item); |
| },_fetchItems:function(_23,_24,_25){ |
| if(this._feed){ |
| this._finishFetchItems(_23,_24,_25); |
| }else{ |
| var _26=false; |
| if(!this._requests){ |
| this._requests=[]; |
| _26=true; |
| } |
| this._requests.push({request:_23,fh:_24,eh:_25}); |
| if(_26){ |
| this._atomIO=new dojox.atom.io.Connection(false,this.urlPreventCache); |
| this._atomIO.getFeed(this.url,this._setFeed,null,this); |
| } |
| } |
| },_finishFetchItems:function(_27,_28,_29){ |
| var _2a=null; |
| var _2b=this._getAllItems(); |
| if(_27.query){ |
| var _2c=_27.queryOptions?_27.queryOptions.ignoreCase:false; |
| _2a=[]; |
| var _2d={}; |
| var key; |
| var _2e; |
| for(key in _27.query){ |
| _2e=_27.query[key]+""; |
| if(typeof _2e==="string"){ |
| _2d[key]=dojo.data.util.filter.patternToRegExp(_2e,_2c); |
| } |
| } |
| for(var i=0;i<_2b.length;++i){ |
| var _2f=true; |
| var _30=_2b[i]; |
| for(key in _27.query){ |
| _2e=_27.query[key]+""; |
| if(!this._containsValue(_30,key,_2e,_2d[key],_27.trim)){ |
| _2f=false; |
| } |
| } |
| if(_2f){ |
| _2a.push(_30); |
| } |
| } |
| }else{ |
| if(_2b.length>0){ |
| _2a=_2b.slice(0,_2b.length); |
| } |
| } |
| try{ |
| _28(_2a,_27); |
| } |
| catch(e){ |
| _29(e,_27); |
| } |
| },getFeatures:function(){ |
| return {"dojo.data.api.Read":true,"dojo.data.api.Write":true,"dojo.data.api.Identity":true}; |
| },close:function(_31){ |
| this._feed=null; |
| },getLabel:function(_32){ |
| if(this.isItem(_32)){ |
| return this.getValue(_32,"title","No Title"); |
| } |
| return undefined; |
| },getLabelAttributes:function(_33){ |
| return ["title"]; |
| },getIdentity:function(_34){ |
| this._assertIsItem(_34); |
| return this.getValue(_34,"id"); |
| },getIdentityAttributes:function(_35){ |
| return ["id"]; |
| },fetchItemByIdentity:function(_36){ |
| this._fetchItems({query:{id:_36.identity},onItem:_36.onItem,scope:_36.scope},function(_37,_38){ |
| var _39=_38.scope; |
| if(!_39){ |
| _39=dojo.global; |
| } |
| if(_37.length<1){ |
| _38.onItem.call(_39,null); |
| }else{ |
| _38.onItem.call(_39,_37[0]); |
| } |
| },_36.onError); |
| },newItem:function(_3a){ |
| var _3b=new dojox.atom.io.model.Entry(); |
| var _3c=null; |
| var _3d=null; |
| var i; |
| for(var key in _3a){ |
| if(this._assertIsAttribute(key)){ |
| _3c=_3a[key]; |
| switch(key){ |
| case "link": |
| for(i in _3c){ |
| _3d=_3c[i]; |
| _3b.addLink(_3d.href,_3d.rel,_3d.hrefLang,_3d.title,_3d.type); |
| } |
| break; |
| case "author": |
| for(i in _3c){ |
| _3d=_3c[i]; |
| _3b.addAuthor(_3d.name,_3d.email,_3d.uri); |
| } |
| break; |
| case "contributor": |
| for(i in _3c){ |
| _3d=_3c[i]; |
| _3b.addContributor(_3d.name,_3d.email,_3d.uri); |
| } |
| break; |
| case "category": |
| for(i in _3c){ |
| _3d=_3c[i]; |
| _3b.addCategory(_3d.scheme,_3d.term,_3d.label); |
| } |
| break; |
| case "icon": |
| case "id": |
| case "logo": |
| case "xmlBase": |
| case "rights": |
| _3b[key]=_3c; |
| break; |
| case "updated": |
| case "published": |
| case "issued": |
| case "modified": |
| _3b[key]=dojox.atom.io.model.util.createDate(_3c); |
| break; |
| case "content": |
| case "summary": |
| case "title": |
| case "subtitle": |
| _3b[key]=new dojox.atom.io.model.Content(key); |
| _3b[key].value=_3c; |
| break; |
| default: |
| _3b[key]=_3c; |
| break; |
| } |
| } |
| } |
| _3b.store=this; |
| _3b.isDirty=true; |
| if(!this._adds){ |
| this._adds=[_3b]; |
| }else{ |
| this._adds.push(_3b); |
| } |
| if(this._feed){ |
| this._feed.addEntry(_3b); |
| }else{ |
| if(this._requests){ |
| this._requests.push({add:_3b}); |
| }else{ |
| this._requests=[{add:_3b}]; |
| this._atomIO=new dojox.atom.io.Connection(false,this.urlPreventCache); |
| this._atomIO.getFeed(this.url,dojo.hitch(this,this._setFeed)); |
| } |
| } |
| return true; |
| },deleteItem:function(_3e){ |
| this._assertIsItem(_3e); |
| if(!this._deletes){ |
| this._deletes=[_3e]; |
| }else{ |
| this._deletes.push(_3e); |
| } |
| if(this._feed){ |
| this._feed.removeEntry(_3e); |
| }else{ |
| if(this._requests){ |
| this._requests.push({remove:_3e}); |
| }else{ |
| this._requests=[{remove:_3e}]; |
| this._atomIO=new dojox.atom.io.Connection(false,this.urlPreventCache); |
| this._atomIO.getFeed(this.url,dojo.hitch(this,this._setFeed)); |
| } |
| } |
| _3e=null; |
| return true; |
| },setValue:function(_3f,_40,_41){ |
| this._assertIsItem(_3f); |
| var _42={item:_3f}; |
| if(this._assertIsAttribute(_40)){ |
| switch(_40){ |
| case "link": |
| _42.links=_3f.links; |
| this._addUpdate(_42); |
| _3f.links=null; |
| _3f.addLink(_41.href,_41.rel,_41.hrefLang,_41.title,_41.type); |
| _3f.isDirty=true; |
| return true; |
| case "author": |
| _42.authors=_3f.authors; |
| this._addUpdate(_42); |
| _3f.authors=null; |
| _3f.addAuthor(_41.name,_41.email,_41.uri); |
| _3f.isDirty=true; |
| return true; |
| case "contributor": |
| _42.contributors=_3f.contributors; |
| this._addUpdate(_42); |
| _3f.contributors=null; |
| _3f.addContributor(_41.name,_41.email,_41.uri); |
| _3f.isDirty=true; |
| return true; |
| case "category": |
| _42.categories=_3f.categories; |
| this._addUpdate(_42); |
| _3f.categories=null; |
| _3f.addCategory(_41.scheme,_41.term,_41.label); |
| _3f.isDirty=true; |
| return true; |
| case "icon": |
| case "id": |
| case "logo": |
| case "xmlBase": |
| case "rights": |
| _42[_40]=_3f[_40]; |
| this._addUpdate(_42); |
| _3f[_40]=_41; |
| _3f.isDirty=true; |
| return true; |
| case "updated": |
| case "published": |
| case "issued": |
| case "modified": |
| _42[_40]=_3f[_40]; |
| this._addUpdate(_42); |
| _3f[_40]=dojox.atom.io.model.util.createDate(_41); |
| _3f.isDirty=true; |
| return true; |
| case "content": |
| case "summary": |
| case "title": |
| case "subtitle": |
| _42[_40]=_3f[_40]; |
| this._addUpdate(_42); |
| _3f[_40]=new dojox.atom.io.model.Content(_40); |
| _3f[_40].value=_41; |
| _3f.isDirty=true; |
| return true; |
| default: |
| _42[_40]=_3f[_40]; |
| this._addUpdate(_42); |
| _3f[_40]=_41; |
| _3f.isDirty=true; |
| return true; |
| } |
| } |
| return false; |
| },setValues:function(_43,_44,_45){ |
| if(_45.length===0){ |
| return this.unsetAttribute(_43,_44); |
| } |
| this._assertIsItem(_43); |
| var _46={item:_43}; |
| var _47; |
| var i; |
| if(this._assertIsAttribute(_44)){ |
| switch(_44){ |
| case "link": |
| _46.links=_43.links; |
| _43.links=null; |
| for(i in _45){ |
| _47=_45[i]; |
| _43.addLink(_47.href,_47.rel,_47.hrefLang,_47.title,_47.type); |
| } |
| _43.isDirty=true; |
| return true; |
| case "author": |
| _46.authors=_43.authors; |
| _43.authors=null; |
| for(i in _45){ |
| _47=_45[i]; |
| _43.addAuthor(_47.name,_47.email,_47.uri); |
| } |
| _43.isDirty=true; |
| return true; |
| case "contributor": |
| _46.contributors=_43.contributors; |
| _43.contributors=null; |
| for(i in _45){ |
| _47=_45[i]; |
| _43.addContributor(_47.name,_47.email,_47.uri); |
| } |
| _43.isDirty=true; |
| return true; |
| case "categories": |
| _46.categories=_43.categories; |
| _43.categories=null; |
| for(i in _45){ |
| _47=_45[i]; |
| _43.addCategory(_47.scheme,_47.term,_47.label); |
| } |
| _43.isDirty=true; |
| return true; |
| case "icon": |
| case "id": |
| case "logo": |
| case "xmlBase": |
| case "rights": |
| _46[_44]=_43[_44]; |
| _43[_44]=_45[0]; |
| _43.isDirty=true; |
| return true; |
| case "updated": |
| case "published": |
| case "issued": |
| case "modified": |
| _46[_44]=_43[_44]; |
| _43[_44]=dojox.atom.io.model.util.createDate(_45[0]); |
| _43.isDirty=true; |
| return true; |
| case "content": |
| case "summary": |
| case "title": |
| case "subtitle": |
| _46[_44]=_43[_44]; |
| _43[_44]=new dojox.atom.io.model.Content(_44); |
| _43[_44].values[0]=_45[0]; |
| _43.isDirty=true; |
| return true; |
| default: |
| _46[_44]=_43[_44]; |
| _43[_44]=_45[0]; |
| _43.isDirty=true; |
| return true; |
| } |
| } |
| this._addUpdate(_46); |
| return false; |
| },unsetAttribute:function(_48,_49){ |
| this._assertIsItem(_48); |
| if(this._assertIsAttribute(_49)){ |
| if(_48[_49]!==null){ |
| var _4a={item:_48}; |
| switch(_49){ |
| case "author": |
| case "contributor": |
| case "link": |
| _4a[_49+"s"]=_48[_49+"s"]; |
| break; |
| case "category": |
| _4a.categories=_48.categories; |
| break; |
| default: |
| _4a[_49]=_48[_49]; |
| break; |
| } |
| _48.isDirty=true; |
| _48[_49]=null; |
| this._addUpdate(_4a); |
| return true; |
| } |
| } |
| return false; |
| },save:function(_4b){ |
| var i; |
| for(i in this._adds){ |
| this._atomIO.addEntry(this._adds[i],null,function(){ |
| },_4b.onError,false,_4b.scope); |
| } |
| this._adds=null; |
| for(i in this._updates){ |
| this._atomIO.updateEntry(this._updates[i].item,function(){ |
| },_4b.onError,false,this.xmethod,_4b.scope); |
| } |
| this._updates=null; |
| for(i in this._deletes){ |
| this._atomIO.removeEntry(this._deletes[i],function(){ |
| },_4b.onError,this.xmethod,_4b.scope); |
| } |
| this._deletes=null; |
| this._atomIO.getFeed(this.url,dojo.hitch(this,this._setFeed)); |
| if(_4b.onComplete){ |
| var _4c=_4b.scope||dojo.global; |
| _4b.onComplete.call(_4c); |
| } |
| },revert:function(){ |
| var i; |
| for(i in this._adds){ |
| this._feed.removeEntry(this._adds[i]); |
| } |
| this._adds=null; |
| var _4d,_4e,key; |
| for(i in this._updates){ |
| _4d=this._updates[i]; |
| _4e=_4d.item; |
| for(key in _4d){ |
| if(key!=="item"){ |
| _4e[key]=_4d[key]; |
| } |
| } |
| } |
| this._updates=null; |
| for(i in this._deletes){ |
| this._feed.addEntry(this._deletes[i]); |
| } |
| this._deletes=null; |
| return true; |
| },isDirty:function(_4f){ |
| if(_4f){ |
| this._assertIsItem(_4f); |
| return _4f.isDirty?true:false; |
| } |
| return (this._adds!==null||this._updates!==null); |
| }}); |
| dojo.extend(dojox.data.AppStore,dojo.data.util.simpleFetch); |
| } |