

/******
*Most important for DHTML models
*
******/

function isFunction(a) 
{
    return typeof a == 'function';
}

function isObject(a) 
{
    return (a && typeof a == 'object') || isFunction(a);
}

if (!isFunction(Function.apply)) 
{
	Function.method('apply', function (o, a) 
	{
        var r, x = '____apply';
        if (!isObject(o)) 
		{
            o = {};
        }
        o[x] = this;
        switch ((a && a.length) || 0) 
		{
        	case 0:
            	r = o[x]();
	            break;
    	    case 1:
        	    r = o[x](a[0]);
            	break;
	        case 2:
    	        r = o[x](a[0], a[1]);
        	    break;
	        case 3:
    	        r = o[x](a[0], a[1], a[2]);
        	    break;
	        case 4:
    	        r = o[x](a[0], a[1], a[2], a[3]);
        	    break;
        	case 5:
            	r = o[x](a[0], a[1], a[2], a[3], a[4]);
            	break;
	        case 6:
    	        r = o[x](a[0], a[1], a[2], a[3], a[4], a[5]);
        	    break;
        	default:
            	alert('Too many arguments to apply.');
        }
        delete o[x];
        return r;
    });
}

/*****************************************
*****************************************/

function isAlien(a) {
   return isObject(a) && typeof a.constructor != 'function';
}

function isArray(a) {
    return isObject(a) && a.constructor == Array;
}

function isBoolean(a) {
    return typeof a == 'boolean';
}

function isEmpty(o) {
    var i, v;
    if (isObject(o)) {
        for (i in o) {
            v = o[i];
            if (isUndefined(v) && isFunction(v)) {
                return false;
            }
        }
    }
    return true;
}


function isNull(a) {
    return typeof a == 'object' && !a;
}

function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}


function isString(a) {
    return typeof a == 'string';
}

function isUndefined(a) {
    return typeof a == 'undefined';
} 

String.method('entityify', function () {
    return this.replace(/&/g, "&amp;").replace(/</g,
        "&lt;").replace(/>/g, "&gt;");
});


String.method('quote', (document.layers) ? function () {
    return '"' + this.replace(/(["\\])/g, function (s) {
        return '\\' + s;
    }) + '"';
} : function () {
    return '"' + this.replace(/(["\\])/g, '\\$1') + '"';
});

String.method('supplant', function (o) {
    var i, j, s = this, v;
    for (;;) {
        i = s.lastIndexOf('{');
        if (i < 0) {
            break;
        }
        j = s.indexOf('}', i);
        if (i + 1 >= j) {
            break;
        }
        v = o[s.substring(i + 1, j)];
        if (!isString(v) && !isNumber(v)) {
            break;
        }
        s = s.substring(0, i) + v + s.substring(j + 1);
    }
    return s;
});

String.method('trim', function () {
    return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
}); 



if (!isFunction(Array.prototype.pop)) {
    Array.method('pop', function () {
        return this.splice(this.length - 1, 1)[0];
    });
}

if (!isFunction(Array.prototype.push)) {
    Array.method('push', function () {
        this.splice.apply(this,
            [this.length, 0].concat(Array.prototype.slice.apply(arguments)));
        return this.length;
    });
}

if (!isFunction(Array.prototype.shift)) {
    Array.method('shift', function () {
        return this.splice(0, 1)[0];
    });
}

if (!isFunction(Array.prototype.splice)) {
    Array.method('splice', function (s, d) {
        var max = Math.max,
            min = Math.min,
            a = [], // The return value array
            e,  // element
            i = max(arguments.length - 2, 0),   // insert count
            k = 0,
            l = this.length,
            n,  // new length
            v,  // delta
            x;  // shift count

        s = s || 0;
        if (s < 0) {
            s += l;
        }
        s = max(min(s, l), 0);  // start point
        d = max(min(isNumber(d) ? d : l, l - s), 0);    // delete count
        v = i - d;
        n = l + v;
        while (k < d) {
            e = this[s + k];
            if (!isUndefined(e)) {
                a[k] = e;
            }
            k += 1;
        }
        x = l - s - d;
        if (v < 0) {
            k = s + i;
            while (x) {
                this[k] = this[k - v];
                k += 1;
                x -= 1;
            }
            this.length = n;
        } else if (v > 0) {
            k = 1;
            while (x) {
                this[n - k] = this[l - k];
                k += 1;
                x -= 1;
            }
        }
        for (k = 0; k < i; ++k) {
            this[s + k] = arguments[k + 2];
        }
        return a;
    });
}

if (!isFunction(Array.prototype.unshift)) {
    Array.method('unshift', function () {
        this.splice.apply(this,
            [0, 0].concat(Array.prototype.slice.apply(arguments)));
        return this.length;
    });
} 

