69 lines
1.5 KiB
JavaScript
69 lines
1.5 KiB
JavaScript
/**
|
|
* Observer - Observe formelements for changes
|
|
*
|
|
* - Additional code from clientside.cnet.com
|
|
*
|
|
* @version 1.1
|
|
*
|
|
* @license MIT-style license
|
|
* @author Harald Kirschner <mail [at] digitarald.de>
|
|
* @copyright Author
|
|
*/
|
|
var Observer = new Class({
|
|
|
|
Implements: [Options, Events],
|
|
|
|
options: {
|
|
periodical: false,
|
|
delay: 1000
|
|
},
|
|
|
|
initialize: function(el, onFired, options){
|
|
this.element = $(el) || $$(el);
|
|
this.addEvent('onFired', onFired);
|
|
this.setOptions(options);
|
|
this.bound = this.changed.bind(this);
|
|
this.resume();
|
|
},
|
|
|
|
changed: function() {
|
|
var value = this.element.get('value');
|
|
if ($equals(this.value, value)) return;
|
|
this.clear();
|
|
this.value = value;
|
|
this.timeout = this.onFired.delay(this.options.delay, this);
|
|
},
|
|
|
|
setValue: function(value) {
|
|
this.value = value;
|
|
this.element.set('value', value);
|
|
return this.clear();
|
|
},
|
|
|
|
onFired: function() {
|
|
this.fireEvent('onFired', [this.value, this.element]);
|
|
},
|
|
|
|
clear: function() {
|
|
$clear(this.timeout || null);
|
|
return this;
|
|
},
|
|
|
|
pause: function(){
|
|
if (this.timer) $clear(this.timer);
|
|
else this.element.removeEvent('keyup', this.bound);
|
|
return this.clear();
|
|
},
|
|
|
|
resume: function(){
|
|
this.value = this.element.get('value');
|
|
if (this.options.periodical) this.timer = this.changed.periodical(this.options.periodical, this);
|
|
else this.element.addEvent('keyup', this.bound);
|
|
return this;
|
|
}
|
|
|
|
});
|
|
|
|
var $equals = function(obj1, obj2) {
|
|
return (obj1 == obj2 || JSON.encode(obj1) == JSON.encode(obj2));
|
|
}; |