(function() {    if (typeof self.carscom == 'undefined') self.carscom = {};    self.carscom.whenCondition = function(params) {        var dfrd;        if (typeof jQuery != 'undefined' && typeof jQuery.Deferred != 'undefined') {            dfrd = new jQuery.Deferred();        }        else {            dfrd = new MyDeferred();        }        new waitController(dfrd, params).begin();        return dfrd.promise();    };        //This is a simple, slightly stripped-down version of the full jQuery Deferred    var MyDeferred = function() {        var _isRejected = false,  _isResolved = false;        var manageStack = function(func, stack, state) {            if (func && typeof func != 'undefined') {                if (typeof func == 'function') {                    stack.push(func);                }                else if (typeof func.length == 'number') {                    for (var item in func) { stack.push(func[item]); }                }            }            if (state) {                var len = stack.length;                for (var i = 0; i < len; i++) { stack.pop().call(); }            }        };        return {            done: (function() {                var me = this, myStack = [];                return function(func) {                    if (!_isRejected) {                        manageStack(func, myStack, _isResolved);                    }                    return me;                }            }),            fail: (function() {                var me = this, myStack = [];                return function(func) {                    if (!_isResolved) {                        manageStack(func, myStack, _isRejected);                    }                    return me;                }            }),            then: function(doneFunc, failFunc) {                if (doneFunc) {                    return this.done(doneFunc);                }                if (failFunc) {                    return this.fail(failFunc);                }            },            resolve: function() {                if (!_isRejected) {                    _isResolved = true;                    this.done();                }            },            reject: function() {                if (!_isResolved) {                    _isRejected = true;                    this.fail();                }            },            isResolved: function() {                return _isResolved;            },            isRejected: function() {                return _isRejected;            },            promise: function() {                var me = this;                return {                    done: function(func) {                        return me.done(func);                    },                    fail: function(func) {                        return me.fail(func);                    },                    then: function(doneFunc, failFunc) {                        return me.then(doneFunc, failFunc);                    },                    isResolved: function() {                        return me.isResolved();                    },                    isRejected: function() {                        return me.isRejected();                    }                }            }        }    }        var waitController = function(dfrd, params) {        this.dfrd = dfrd;        this.test = params.test;        this.params = {            interval: params.interval || 200,            maxWait: params.maxWait || 5000        };    }    waitController.prototype = {        begin: function() {            var me = this;            var waitLeft = this.params.maxWait;            var ivHandle = setInterval(function() {                try {                if (me.test.call()) {                    clearInterval(ivHandle);                    me.dfrd.resolve();                }                else if (waitLeft > 0) {                    waitLeft -= me.params.interval;                }                else {                    clearInterval(ivHandle);                    me.dfrd.reject();                }                }                catch (err) { clearInterval(ivHandle);me.dfrd.reject(); }            }, me.params.interval );        }    };    if (typeof jQuery != 'undefined') jQuery.extend({whenCondition: self.carscom.whenCondition});})();
