Blame view

framework/thirdparty/jquery-entwine/src/jquery.entwine.properties.js 2.34 KB
385d70ca   Administrator   Importers CRUD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
  (function($) {	
  
  	var entwine_prepend = '__entwine!';
  	
  	var getEntwineData = function(el, namespace, property) {
  		return el.data(entwine_prepend + namespace + '!' + property);
  	};
  	
  	var setEntwineData = function(el, namespace, property, value) {
  		return el.data(entwine_prepend + namespace + '!' + property, value);
  	};
  	
  	var getEntwineDataAsHash = function(el, namespace) {
  		var hash = {};
  		var id = jQuery.data(el[0]);
  		
  		var matchstr = entwine_prepend + namespace + '!';
  		var matchlen = matchstr.length;
  		
  		var cache = jQuery.cache[id];
  		for (var k in cache) {
  			if (k.substr(0,matchlen) == matchstr) hash[k.substr(matchlen)] = cache[k];
  		}
  		
  		return hash;
  	};
  	
  	var setEntwineDataFromHash = function(el, namespace, hash) {
  		for (var k in hash) setEntwineData(namespace, k, hash[k]);
  	};
  
  	var entwineData = function(el, namespace, args) {
  		switch (args.length) {
  			case 0:
  				return getEntwineDataAsHash(el, namespace);
  			case 1:
  				if (typeof args[0] == 'string') return getEntwineData(el, namespace, args[0]);
  				else                            return setEntwineDataFromHash(el, namespace, args[0]);
  			default:
  				return setEntwineData(el, namespace, args[0], args[1]);
  		}
  	};
   
  	$.extend($.fn, {
  		entwineData: function() {
  			return entwineData(this, '__base', arguments);
  		}
  	});
  	
  	$.entwine.Namespace.addHandler({
  		order: 60,
  		
  		bind: function(selector, k, v) {
  			if (k.charAt(0) != k.charAt(0).toUpperCase()) $.entwine.warn('Entwine property '+k+' does not start with a capital letter', $.entwine.WARN_LEVEL_BESTPRACTISE);
  
  			// Create the getters and setters
  
  			var getterName = 'get'+k;
  			var setterName = 'set'+k;
  
  			this.bind_proxy(selector, getterName, function() { var r = this.entwineData(k); return r === undefined ? v : r; });
  			this.bind_proxy(selector, setterName, function(v){ return this.entwineData(k, v); });
  			
  			// Get the get and set proxies we just created
  			
  			var getter = this.injectee[getterName];
  			var setter = this.injectee[setterName];
  			
  			// And bind in the jQuery-style accessor
  			
  			this.bind_proxy(selector, k, function(v){ return (arguments.length == 1 ? setter : getter).call(this, v) ; });
  
  			return true;
  		},
  		
  		namespaceMethodOverrides: function(namespace){
  			return {
  				entwineData: function() {
  					return entwineData(this, namespace.name, arguments);
  				}
  			};
  		}
  	});
  	
  })(jQuery);