/*************************************************************************
    $Id: yeti.js 3928 2010-03-17 10:30:48Z jcigar $
**************************************************************************/

(function(window) {

    var Yeti = window.Yeti = new Object();

    Yeti.utils = new Object();
    Yeti.DOM = new Object();


    /*************************************************************************
        XMLHttpRequest object
    **************************************************************************/

    Yeti.XMLHttpRequest = function() {
        if (window.XMLHttpRequest) {
            return new XMLHttpRequest();
        } else if (window.ActiveXObject) {
            return new ActiveXObject('Microsoft.XMLHTTP');
        } else {
            throw 'Cannot get XMLHttpRequest :(';
        }
    };

    Yeti.AjaxRequest = function(url, params) {
        var request = Yeti.XMLHttpRequest();
        var method = params.method ? params.method.toUpperCase() : 'GET';
        var charset = params.charset ? params.charset.toUpperCase() : 'UTF-8';

        // Default headers
        var request_headers = {
            'X-Requested-With' : 'XMLHttpRequest',
            'Accept' : 'text/javascript, text/html, application/xml, text/xml, */*'
        }

        request.onreadystatechange = function() {
            return params.onreadystatechange(request);
        }

        // Data
        var data = params.data ? params.data : null;
        if (data !== null && typeof(data) !== "string") {
            data = new Yeti.utils.QueryString(data).toString();
            request_headers['Content-Type'] = 'application/x-www-form-urlencoded; charset='.concat(charset)
            if (method == 'GET') {
                var url = url.concat('?').concat(data);
            }
        }

        // More/override headers ?
        if (params.request_headers) {
            for (var i in params.request_headers) {
                request_headers[i] = params.request_headers[i];
            }
        }
        
        // Make request
        request.open(method, url);
        for (var i in request_headers) {
            request.setRequestHeader(i, request_headers[i]);
        }
        request.send(data);
    }


    /*************************************************************************
        QueryString object
    **************************************************************************/

    Yeti.utils.QueryString = function(obj) {
        this.qs = [];

        for (var key in obj) {
            this._encodeValue(key, obj[key]);
        }
    }

    Yeti.utils.QueryString.prototype.toString = function() {
        return this.qs.join('&');
    }

    Yeti.utils.QueryString.prototype._encodeValue = function(key, value) {
        if (value !== undefined) {
            switch (value.constructor) {
                case Array:
                    this._encodeArray(key, value);
                    break;
                default:
                    this._encodeString(key, value);
                    break;
            }
        }
    }

    Yeti.utils.QueryString.prototype._encodeArray = function(key, value) {
        for (var cpt = 0 ; cpt < value.length ; cpt ++) {
            this._encodeValue(key, value[cpt]);
        }
    }

    Yeti.utils.QueryString.prototype._encodeString = function(key, value) {
        this.qs.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
    }


    /*************************************************************************
        YETI DOM
    **************************************************************************/

    // Remove all chidren for a given element
    Yeti.DOM.removeChildren = function(element) {
        var removed = 0;
        while(element.hasChildNodes()) {
            element.removeChild(element.lastChild);
            removed++;
        }
        return removed;
    }

    // Creates a copy of a node from an external document that can be inserted
    // into the current document.
    Yeti.DOM.importNode = function(node, deep) {
        if (document.importNode) {
            return document.importNode(node, deep);
        } else if (document._importNode) {
            return document._importNode(node, deep);
        }
    }

})(window);
