function GroupList() { lastChange=0; this.loadFromLocalStorage=function() { if (jQuery.type(localStorage.groups)!='undefined') { try { var data=JSON.parse(localStorage.groups); this.lastChange=data.lastChange; for (el in data.groups) { this[el]=new Group(el,false,data.groups[el]); } } catch(e) { for (el in this) { if (this.isGroup(this[el])) { delete this[el]; } } myconfirm('Erreur en chargeant les données locales. On les purges ?', function(data) { delete localStorage.groups; location.reload(); } ); } } } this.export=function() { return { 'lastChange': this.lastChange, 'groups': this.each(function(idx,group) { return group.export(); }) }; } this.import=function(groups) { ret={}; for (el in this) { if (this.isGroup(this[el])) { delete ret[el]; } } this.lastChange=groups.lastChange; for (el in groups.groups) { this[el]=new Group(el,false,groups.groups[el]); } return true; } this.save=function() { localStorage.groups=JSON.stringify(this.export()); } this.each=function(fct) { var idx=0; var ret={}; for (el in this) { if(this.isGroup(this[el])) { ret[el]=fct(idx++,this[el]); } } return ret; } this.count=function() { len=0; this.each(function(idx,group) { len=len+1; }); return len; } this.isGroup=function(el) { return (jQuery.type(el)=='object' && jQuery.type(el.isGroup)=='function' && el.isGroup()); } this.byName=function(name) { for (el in this) { if(this.isGroup(this[el])) { if (this[el].name==name) { return this[el]; } } } return false; } this.removeGroup=function(uuid) { if (this.isGroup(this[uuid])) { delete this[uuid]; return true; } return false; } this.balances=function(fct) { return this.each(function(idx,group) { bal=group.balance(); bal.name=group.name; return bal; }); } this.newGroup=function(name,uuid) { var uuid=uuid||generate_uuid(); this[uuid]=new Group(uuid,name); return uuid; } } function Group(uuid,name,data) { this.uuid=uuid || generate_uuid(); this.name=name || false; this.contributors={}; this.deletedContributors={}; this.contributions={}; this.deletedContributions={}; this.categories={}; this.deletedCategories={}; this.isGroup=function() { return true; } this.export=function() { var contributors={}; for (email in this.contributors) { contributors[email]=this.contributors[email].export(); } var contributions={} for (uuid in this.contributions) { contributions[uuid]=this.contributions[uuid].export(); } var categories={} for (uuid in this.categories) { categories[uuid]=this.categories[uuid].export(); } return { 'uuid': this.uuid, 'name': encodeURIComponent(this.name), 'contributors': contributors, 'deletedContributors': this.deletedContributors, 'contributions': contributions, 'deletedContributions': this.deletedContributions, 'categories': categories, 'deletedCategories': this.deletedCategories }; } /* * Contributors */ this.removeContributor=function(c) { this.deletedContributors[c.email]=c.export(); time=new Date().getTime(); this.deletedContributors[c.email].deletionTime=time; contributions=this.contributionsByContributorEmail(c.email); for (idx in contributions) { this.deleteContribution(contributions[idx].uuid,time); } delete this.contributors[c.email]; return true; } this.restoreContributor=function(email) { if (email in this.contributors) return; if (! email in this.deletedContributors) return; this.contributors[email]=this.importContributor(this.deletedContributors[email]); contributions=this.deletedContributionsByContributorEmail(email); for (idx in contributions) { if (contributions[idx].lastChange==this.deletedContributors[email].deletionTime) { this.restoreContribution(contributions[idx].uuid); } } delete this.deletedContributors[email]; return true; } this.getDeletedContributors=function() { var ret=[]; for (email in this.deletedContributors) { ret.push(this.importContributor(this.deletedContributors[email])); } return ret; } this.contributorByName=function(name) { for (email in this.contributors) { if (this.contributors[email].name == name) return this.contributors[email]; } return undefined; } this.contributorByEmail=function(email) { if (jQuery.type(this.contributors[email])!='undefined') { return this.contributors[email]; } return undefined; } this.addContributor=function(c) { this.contributors[c.email]=c; } this.replaceContributor=function(email,c) { delete this.contributors[email]; this.contributors[c.email]=c; } this.importContributor=function(data) { return new Contributor( decodeURIComponent(data.name), data.email ); } /* * Contributions */ this.contributionsByContributorEmail=function(email) { var ret=[]; for (uuid in this.contributions) { if (this.contributions[uuid].contributor.email==email) { ret.push(this.contributions[uuid]); } } return this.sortContributionsByDate(ret); } this.sortContributionsByDate=function(contributions) { contributions.sort(function(a,b) { if (a.date==b.date) { return 0; } else if(a.datesum) { min=sum; } if(max