(function($) {

    $.PCHANE_DEFAULT_INTERVAL = 50;
    $._pchange_verify_prop = function(el, val, attr, callback, intrv)
	{
	    var nval = attr(el);
	    setTimeout(function(){$._pchange_verify_prop(el, nval, attr, callback, intrv)}, intrv);
	    if (nval != val)
		callback(nval);
	}
    
    $.fn.extend({
	    pingchange : function(att, callback, intrv)
		{
		    var a = this, at = att;
		    if (typeof(att) == "string") at = function(e){var p = a.get(0); return eval("p." + att)};
		    $._pchange_verify_prop(this, at(this),
					   at, function(){callback.apply(a, arguments)}, intrv ? intrv : $.PCHANE_DEFAULT_INTERVAL);
		},
		
		cssexpression: function(name, css, interval)
		{
		    var func = function(){return eval(css)};
		    this.css(name, func.apply(this.get(0)));
		    this.pingchange(function(el){return func.apply(el.get(0))}, function(val){this.css(name, val);}, interval);
		}
	});
})(jQuery)