$.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);
    }
});
