var mrl;
if (!mrl) mrl = {};

mrl.A = function(a)
{
    if(!a) return [];
    else if(a.toArray) return a.toArray();
    else if(length in a)
    {
        var l = a.length;
        var ret = new Array(l); 
        while(l--) ret[l] = a[l];
        return ret;
    }
    else return [a];
};

mrl.zip = function()
{
    var args = mrl.A(arguments);
    var result = [];
    if(args.length)
    {
        var a0 = args[0];
        var n = args.length;
        var l = a0.length;
        result = new Array(l);
        for(var i=0; i<l; i++)
        {
            var t = new Array(n);
            for(var j=0; j<n; j++)
            {
                t[j] = args[j][i];
            }
            result[i] = t;
        }
    }
    return result;
};

mrl.curry = function()
{
    var args = mrl.A(arguments);
    var __fn = args.shift();
    return function() { 
        return __fn.apply(this, args.concat(mrl.A(arguments))); 
    };
};

mrl.asmethod = function(fn)
{
    var __t = this;
    return function() {
        return fn.apply(__t, [this].concat(mrl.A(arguments)));
    };
};

mrl.asfunction = function(fn)
{
    return function() {
        var args = mrl.A(arguments);
        var __t = args.shift();
        return fn.apply(__t, args);
    }
};

mrl.compose = function()
{
    var args = mrl.A(arguments);
    return function()
    {
        var __t = this;
        var l = args.length;
        if(!l) return null;
        var r = arguments[--l].apply(__t, arguments);
        while(l--) r = arguments[l].apply(__t, r);
        return r;
    }
}

mrl.equalArrays = function(a0, a1)
{
    if (a0.length != a1.length) return false;
    for(var i=0; i<a0.length; i++) {
        if (a0[i] != a1[i]) return false;
    }
    return true;
}

mrl.Observer = function(e, t, fn) {
    var self = this;
    var getvals = function() {
        return $(e).map(function(el) {
                return $(this).val();
                } ).get();
    }
    this.value = getvals();
    this.timer = setInterval(
        function() {
            var v = getvals();
            if(!mrl.equalArrays(v, self.value))
            {
                fn();
                self.value = v;
            }
        },
        t * 1000.0
    );
}

mrl.Observer.prototype.stop = function()
{
    if(this.timer)
    {
        clearInterval(this.timer);
        this.timer = null;
    }
}

if(this.jQuery)
{
    jQuery.fn.observe = function(t, fn)
    {
        var ob = new mrl.Observer(this, t, fn) ;
        return this;
    }
}

