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,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 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]; } } for (el in groups) { this[el]=new Group(el,groups[el]); } return true; } this.save=function() { localStorage.groups=JSON.stringify({ 'lastChange': new Date().getTime(), 'groups': 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.removeGroup=function(name) { if (this.isGroup(this[name])) { delete this[name]; return true; } return false; } this.balances=function(fct) { return this.each(function(idx,group) { return group.balance(); }); } } function Group(name,data) { this.name=name; this.contributors=[]; this.contributions={}; this.deletedContributions={}; this.isGroup=function() { return true; } this.export=function() { var contributors=[]; for (idx in this.contributors) { contributors.push(this.contributors[idx].export()); } var contributions={} for (uuid in this.contributions) { contributions[uuid]=this.contributions[uuid].export(); } return { 'name': encodeURIComponent(this.name), 'contributors': contributors, 'contributions': contributions, 'deletedContributions': this.deletedContributions }; } /* * Contributors */ this.removeContributor=function(c) { this.contributors=this.contributors.filter(function(v){ return (v.name!=c); }); } this.contributorByName=function(name) { for (c in this.contributors) { if (this.contributors[c].name == name) return this.contributors[c]; } return undefined; } this.contributorByEmail=function(email) { for (c in this.contributors) { if (this.contributors[c].email == email) return this.contributors[c]; } return undefined; } this.addContributor=function(c) { c.id=this.contributors.length; this.contributors.push(c); } this.replaceContributor=function(idx,c) { c.id=idx; this.contributors[idx]=c; } /* * Contributions */ this.contributionsByContributorName=function(name) { var ret={}; for (uuid in this.contributions) { if (this.contributions[uuid].contributor.name==name) { ret[uuid]=this.contributions[uuid]; } } return ret; } this.addContribution=function(c) { this.contributions[c.uuid]=c; } this.updateContribution=function(uuid,c) { c.uuid=uuid; this.contributions[uuid]=c; } this.deleteContribution=function(uuid) { this.contributions[uuid].lastChange=new Date().getTime(); this.deletedContributions[uuid]=this.contributions[uuid].export(); delete this.contributions[uuid]; } /* * Balance */ this.balance=function() { total={} min=-1; max=0; for (idx in this.contributors) { var sum=0; c=this.contributors[idx].name; cl=this.contributionsByContributorName(c); for (uuid in cl) { sum+=cl[uuid].cost; } if (min==-1 || min>sum) { min=sum; } if(max