source: extensions/pbase2piwigo/admin/template/MultiGetSet.js @ 17225

Last change on this file since 17225 was 17225, checked in by ddtddt, 12 years ago

[extensions] - pbase2piwigo - new extension by mistic - first release

File size: 4.1 KB
Line 
1// https://gist.github.com/2956493
2
3/**
4 July 30th 2012
5 Damien "Mistic"Sorel
6 add increment() and decrement() methods
7 */
8
9var MultiGetSet = function(opt){
10
11    var getType = function(o) {
12      return ({}).toString.call(o).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
13    };
14
15    if(!opt.public || !opt.private)
16        return opt.public;
17
18    if(opt.handler && opt.handler.init)
19        opt.handler.init(opt);
20
21    if(!opt.handler || !opt.handler.setter){
22        opt.public.set = function(paramName, newValue){
23            opt.private[paramName] = newValue;
24        };
25    }else{
26        opt.public.set = function(paramName, newValue){
27            return opt.handler.setter({
28                public: opt.public,
29                private: opt.private,
30                paramName: paramName,
31                newValue: newValue,
32                caller: arguments.callee.caller
33            });
34        };
35    }
36
37    if(!opt.handler || !opt.handler.getter){
38        opt.public.get = function(paramName){
39            return opt.private[paramName];
40        };
41    }else{
42        opt.public.get = function(paramName){
43            return opt.handler.getter({
44                public: opt.public,
45                private: opt.private,
46                paramName: paramName,
47                caller: arguments.callee.caller
48            });
49        };
50    }
51   
52    if(!opt.handler || !opt.handler.adder){
53        opt.public.add = function(paramName, newValue){
54            if(getType(opt.private[paramName])==="array")
55                opt.private[paramName].push(newValue);
56        };
57    }else{
58        opt.public.add = function(paramName, newValue){
59            if(getType(opt.private[paramName])==="array")
60                return opt.handler.adder({
61                    public: opt.public,
62                    private: opt.private,
63                    paramName: paramName,
64                    newValue: newValue,
65                    caller: arguments.callee.caller
66                });
67        };
68    }
69   
70    opt.public.increment = function(paramName, add) {
71      if (add == null) add = 1;
72      opt.public.set(paramName, opt.public.get(paramName)+add);
73    };
74   
75    opt.public.decrement = function(paramName, rem) {
76      if (rem == null) rem = 1;
77      opt.public.increment(paramName, -rem);
78    };
79
80    return opt.public;
81};
82
83var Observable = {
84
85
86    clone: function(o){
87        if(o == null || typeof(o) != 'object')
88            return o;
89
90        var temp = o.constructor(); // changed
91
92        for(var key in o)
93            temp[key] = Observable.clone(o[key]);
94        return temp;
95    },
96
97    init: function(opt){
98        opt.public.listeners = {};
99
100        opt.public.listen = function(paramName, callback){
101            if(Object.prototype.toString.call(paramName) === '[object Array]')
102                for(var p in paramName){
103                    opt.public.listenOne(paramName[p], callback);
104                }
105            else
106                opt.public.listenOne(paramName, callback);
107        };
108
109        opt.public.listenOne = function(paramName, callback){
110            if(!opt.public.listeners[paramName])
111                opt.public.listeners[paramName] = [];
112            opt.public.listeners[paramName].push(callback);
113        };
114    },
115
116    setter: function(opt){
117        if(opt.private[opt.paramName] == opt.newValue)
118            return;
119
120        opt.oldValue = Observable.clone(opt.private[opt.paramName]);
121
122        opt.private[opt.paramName] = opt.newValue;
123
124        for(var listener in opt.public.listeners[opt.paramName]){
125            if(opt.caller != opt.public.listeners[opt.paramName][listener])
126                opt.public.listeners[opt.paramName][listener](opt);
127        }
128    },
129
130    adder: function(opt){
131        if(opt.private[opt.paramName] == opt.newValue || !opt.private[opt.paramName].push)
132            return;
133
134        opt.oldValue = Observable.clone(opt.private[opt.paramName]);
135
136        opt.private[opt.paramName].push(opt.newValue);
137        opt.newValue = opt.private[opt.paramName];
138
139        for(var listener in opt.public.listeners[opt.paramName]){
140            if(opt.caller != opt.public.listeners[opt.paramName][listener])
141                opt.public.listeners[opt.paramName][listener](opt);
142        }
143    }
144};
Note: See TracBrowser for help on using the repository browser.