function SCaseList() { lastChange=0; this.importExampleData=function() { var exampleData={ 'Vacances': { 'Papier': { 'color': '#f00', 'things': [ {'label': 'Papier blanc', 'nb': 1 }, {'label': 'Stylo', 'nb': 3 }, {'label': "Carte d'identité", 'nb': 1 }, ] }, 'Multimédia' : { 'color': '#0f0', 'things': [ {'label': 'Montre', 'nb': 1 }, {'label': 'Chargeur montre', 'nb': 1 }, {'label': 'PC portable', 'nb': 1 }, ] } } }; for (scaseName in exampleData) { var scase=this.newSCase(scaseName); for (catName in exampleData[scaseName]) { var cat=scase.cats.newCat(catName); for (idx in exampleData[scaseName][catName].things) { cat.newThing(exampleData[scaseName][catName].things[idx]['label'],exampleData[scaseName][catName].things[idx]['nb']); } } } } this.loadFromLocalStorage=function(backData) { if (jQuery.type(localStorage.scases)!='undefined') { try { var data=JSON.parse(localStorage.scases); this.lastChange=data.lastChange; for (el in data.scases) { this[el]=new SCase(false,false,data.scases[el]); } } catch(e) { for (el in this) { if (this.isSCase(this[el])) { delete this[el]; } } if (jQuery.type(backData)!='undefined') { alert('Erreur en chargeant les données. Restauration des données précédentes'); localStorage.scases=backData; return this.loadFromLocalStorage(); } else { myconfirm('Erreur en chargeant les données locales. On les purges ?', function(data) { delete localStorage.scases; location.reload(); } ); } } } else { myconfirm("

Bienvenu !

Souhaitez-vous charger les données d'exemple ?

", function(scases) { scases.importExampleData(); scases.save(); show_scases(); }, false, this ); } } this.export=function() { return { 'lastChange': this.lastChange, 'scases': this.each(function(idx,scase) { return scase.export(); }) }; } this.import=function(data) { ret={}; for (el in this) { if (this.isSCase(this[el])) { delete ret[el]; } } this.lastChange=data.lastChange; for (el in data.scases) { this[el]=new SCase(false,false,data.scases[el]); } return true; } this.save=function() { localStorage.scases=JSON.stringify(this.export()); } this.each=function(fct) { var idx=0; var ret={}; for (el in this) { if(this.isSCase(this[el])) { ret[el]=fct(idx++,this[el]); } } return ret; } this.count=function() { len=0; this.each(function(idx,scase) { len=len+1; }); return len; } this.isSCase=function(el) { return (jQuery.type(el)=='object' && jQuery.type(el.isSCase)=='function' && el.isSCase()); } this.byName=function(name) { for (el in this) { if(this.isSCase(this[el])) { if (this[el].name==name) { return this[el]; } } } return false; } this.removeSCase=function(name) { for (el in this) { if (this.isSCase(this[el]) && this[el].name==name) { this[el].remove(); return true; } } return false; } this.newSCase=function(name) { if (this.byName(this[name])) { var scase=this.byName(name); if (scase.removed) { scase.restore(); return true; } } else { var uuid=uuid||generate_uuid(); this[uuid]=new SCase(uuid,name); return this[uuid]; } return false; } this.renameSCase=function(name,newname) { var scase=this.byName(name); if (scase && !this.byName(newname)) { scase.name=newname; scase.lastChange=new Date().getTime(); return scase; } return false; } this.copySCase=function(name,newname) { var orig_scase=this.byName(name); if (this.isSCase(orig_scase) && !this.byName(newname)) { var uuid=uuid||generate_uuid(); this[uuid]=new SCase(false,false,orig_scase.export()); this[uuid].uuid=uuid; this[uuid].lastChange=new Date().getTime(); this[uuid].name=newname; return this[uuid]; } return false; } this.resetSCase=function(name) { for (el in this) { if (this.isSCase(this[el]) && this[el].name==name) { return this[el].reset(); } } return false; } } function SCase(uuid,name,data) { this.uuid=uuid||generate_uuid(); this.name=name; this.cats=new CatList(); this.lastChange=new Date().getTime(); this.removed=false; this.isSCase=function() { return true; } this.import=function(data) { this.uuid=data.uuid || generate_uuid(); this.lastChange=data.lastChange || new Date().getTime(); this.name=decodeURIComponent(data.name); this.removed=data.removed||false; if (jQuery.type(data.cats) == 'object') { this.cats=new CatList(data.cats); } return true; } this.export=function() { return { 'uuid': this.uuid, 'lastChange': this.lastChange, 'name': encodeURIComponent(this.name), 'removed': this.removed, 'cats': this.cats.export() }; } this.byName=function(name) { for (idx in this.cats) { if (name==this.cats[idx].name) { return this.cats[idx]; } } return false; } this.stats=function() { var cats=0; var things=0; var things_done=0; this.cats.each(function(cidx,cat) { cats++; for (idx in cat.things) { things++; if (cat.things[idx].checked) { things_done++; } } }); return { 'cats': cats, 'things': things, 'done': things_done } } this.reset=function() { this.cats.each(function(idx,cat) { for (idx in cat.things) { if (cat.things[idx].checked) { cat.things[idx].checked=false; } } }); this.lastChange=new Date().getTime(); return true; } this.remove=function() { this.removed=true; this.lastChange=new Date().getTime(); } this.restore=function() { this.removed=false; this.lastChange=new Date().getTime(); } /* * Contructor */ if (jQuery.type(data)=='object') { try { this.import(data); } catch (e) { console.log(e); alert('Une erreur est survenue en chargeant la valise '+this.name+' depuis le cache'); } } } function CatList(data) { this.export=function() { return this.each(function(idx,cat) { return cat.export(); }); } this.import=function(data) { for (el in this) { if (this.isCat(this[el])) { delete this[el]; } } for (el in data) { this[el]=new Cat(el,false,false,data[el]); } return true; } this.each=function(fct) { var idx=0; var ret={}; for (el in this) { if(this.isCat(this[el])) { ret[el]=fct(idx++,this[el]); } } return ret; } this.count=function() { len=0; this.each(function(idx,cat) { len=len+1; }); return len; } this.isCat=function(el) { return (jQuery.type(el)=='object' && jQuery.type(el.isCat)=='function' && el.isCat()); } this.byName=function(name) { for (el in this) { if(this.isCat(this[el])) { if (this[el].name==name) { return this[el]; } } } return false; } this.newCat=function(name) { if (this.byName(name)) { var cat=this.byName(name); if (cat.removed) { cat.restore(); return true; } } else { var uuid=uuid||generate_uuid(); this[uuid]=new Cat(uuid,name); return this[uuid]; } return false; } this.renameCat=function(name,newname) { var cat=this.byName(name); if (cat && !this.byName(newname)) { cat.name=newname; cat.lastChange=new Date().getTime(); return cat; } return false; } this.removeCat=function(name) { for (el in this) { if (this.isCat(this[el]) && this[el].name==name) { this[el].remove(); return true; } } return false; } this.restoreCat=function(name) { for (el in this) { if (this.isCat(this[el]) && this[el].name==name && this[el].removed) { this[el].restore(); return true; } } return false; } /* * Contructor */ if (jQuery.type(data)=='object') { try { this.import(data); } catch (e) { console.log(e); alert('Une erreur est survenue en chargeant la liste de catégorie depuis le cache'); } } } function Cat(uuid,name,color,data) { this.uuid=generate_uuid(); this.lastChange=new Date().getTime(); this.name=name; this.color=color || '#'+(0x1000000+(Math.random())*0xffffff).toString(16).substr(1,6); this.things={}; this.removed=false; this.isCat=function() { return true; } this.import=function(data) { this.uuid=data.uuid || generate_uuid(); this.lastChange=data.lastChange||new Date().getTime(); this.name=decodeURIComponent(data.name); this.color=data.color; this.removed=data.removed||false; if (jQuery.type(data.things) == 'object') { for (tuuid in data.things) { this.things[tuuid]=new Thing(tuuid); this.things[tuuid].import(data.things[tuuid]); } } return true; } this.export=function() { var things={}; for (tuuid in this.things) { things[tuuid]=this.things[tuuid].export(); } return { 'uuid': this.uuid, 'lastChange': this.lastChange, 'name': encodeURIComponent(this.name), 'color': this.color, 'removed': this.removed, 'things': things }; } this.byLabel=function(label) { for (idx in this.things) { if (label==this.things[idx].label) { return this.things[idx]; } } return false; } this.count=function() { return keys(this.things).length; } this.stats=function() { var count=0; var done=0; for (idx in this.things) { if (this.things[idx].checked) { done+=1; } count+=1; } return { 'things': count, 'done': done }; } this.newThing=function(label,nb) { if (this.byLabel(label)) { var thing=this.byLabel(label); if (thing.removed) { thing.restore(); thing.setChecked(false); thing.setNb(nb); return true; } } else { var uuid=generate_uuid(); this.things[uuid]=new Thing(uuid,label,nb); return true; } return false; } this.renameThing=function(label,newlabel) { var thing=this.byLabel(label); if (thing && !this.byLabel(newlabel)) { thing.label=newlabel; thing.lastChange=new Date().getTime(); return thing; } return false; } this.removeThing=function(label) { for (idx in this.things) { if (this.things[idx].label==label) { this.things[idx].remove(); return true; } } return false; } this.restoreThing=function(label) { for (idx in this.things) { if (this.things[idx].label==label && this.things[idx].removed) { this.things[idx].restore(); return true; } } return false; } this.remove=function() { this.removed=true; this.lastChange=new Date().getTime(); } this.restore=function() { this.removed=false; this.lastChange=new Date().getTime(); } /* * Contructor */ if (jQuery.type(data)=='object') { try { this.import(data); } catch (e) { console.log(e); alert('Une erreur est survenue en chargeant la catégorie catégorie '+this.name+' depuis le cache'); } } } function Thing(uuid,label,nb,checked) { this.uuid=uuid||generate_uuid(); this.lastChange=new Date().getTime(); this.label=label; this.nb=nb || 1; this.checked=checked; this.removed=false; this.import=function(data) { this.uuid=data.uuid||generate_uuid(); this.lastChange=data.lastChange||new Date().getTime(); this.label=decodeURIComponent(data.label), this.nb=data.nb||1; this.checked=data.checked; this.removed=data.removed||false; } this.export=function() { return { 'uuid': this.uuid, 'lastChange': this.lastChange, 'label': encodeURIComponent(this.label), 'nb': this.nb, 'checked': this.checked, 'removed': this.removed, }; } this.setNb=function(nb) { this.nb=nb; this.lastChange=new Date().getTime(); } this.setChecked=function(value) { this.checked=value; this.lastChange=new Date().getTime(); } this.remove=function() { this.removed=true; this.lastChange=new Date().getTime(); } this.restore=function() { this.removed=false; this.lastChange=new Date().getTime(); } }