if (typeof(sonar) != "object" || sonar == null) sonar = {};
//==============================================================================
// @library
//      sonar.external
// @variables
//      HTTP_REQUEST
// @functions
//      loadAjaxAsync(uri, handler, args)
//      loadAjaxSync(uri, args)
//      loadXML(uri)
//==============================================================================
sonar.external =
{
    /***************************************************************************
     * @variable
     *      HTTP_REQUEST
     **************************************************************************/
    HTTP_REQUEST : function()
    {
        if (window.XMLHttpRequest)
        {
            try
            {
                return new XMLHttpRequest();
            }
            catch (e) {}
        }
        else if (window.ActiveXObject)
        {
            try
            {
                return new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (e)
            {
                try
                {
                    return new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch (e) {}
            }
        }
    }(),



    /***************************************************************************
     * @function
     *      loadAjaxAsync(uri, handler, args)
     * @arguments
     *      methodType   ==> ("get") |"post"
     *      responseType ==> ("text") | "xml" | "json"
     * @used
     *      sonar.external.HTTP_REQUEST
     **************************************************************************/
    loadAjaxAsync : function(uri, handler, args)
    {
        uri     = typeof(uri) == "string" && uri.length > 0 ? uri : null;
        handler = typeof(handler) == "function" && (!Function.prototype.call || typeof(handler.call) == "function") ? handler : null;
        args    = typeof(args) == "object" && args != null ? args : {};

        args.methodType   = /^get|post$/i.test(args.methodType) ? args.methodType.toLowerCase() : "get";
        args.responseType = /^text|xml|json$/i.test(args.responseType) ? args.responseType.toLowerCase() : "text";

        if (sonar.external.HTTP_REQUEST && uri && handler)
        {
            sonar.external.HTTP_REQUEST.abort();
            sonar.external.HTTP_REQUEST.onreadystatechange = function()
            {
                if (sonar.external.HTTP_REQUEST.readyState == 4)
                {
                    if (sonar.external.HTTP_REQUEST.status == 200)
                    {
                        switch (args.responseType)
                        {
                            case "text" : handler(sonar.external.HTTP_REQUEST.responseText); break;
                            case "xml"  : handler(sonar.external.HTTP_REQUEST.responseXML);  break;
                            case "json" : alert("TODO"); break;
                        }
                    }
                }
            };
            sonar.external.HTTP_REQUEST.open(args.methodType, uri, true);
            sonar.external.HTTP_REQUEST.send(null);
        }
    },



    /***************************************************************************
     * @function
     *      loadAjaxSync(uri, args)
     * @arguments
     *      methodType   ==> ("get") |"post"
     *      responseType ==> ("text") | "xml" | "json"
     * @used
     *      sonar.external.HTTP_REQUEST
     **************************************************************************/
    loadAjaxSync : function(uri, args)
    {
        uri  = typeof(uri) == "string" && uri.length > 0 ? uri : null;
        args = typeof(args) == "object" && args != null ? args : {};

        args.methodType   = /^get|post$/i.test(args.methodType) ? args.methodType.toLowerCase() : "get";
        args.responseType = /^text|xml|json$/i.test(args.responseType) ? args.responseType.toLowerCase() : "text";

        if (sonar.external.HTTP_REQUEST && uri)
        {
            sonar.external.HTTP_REQUEST.abort();
            sonar.external.HTTP_REQUEST.onreadystatechange = function() {};
            sonar.external.HTTP_REQUEST.open(args.methodType, uri, false);
            sonar.external.HTTP_REQUEST.send(null);

            switch (args.responseType)
            {
                case "text" : return sonar.external.HTTP_REQUEST.responseText;
                case "xml"  : return sonar.external.HTTP_REQUEST.responseXML;
                case "json" : alert("TODO"); break;
            }
        }
    },



    /***************************************************************************
     * @function
     *      loadXML(uri)
     * @used
     *      sonar.external.HTTP_REQUEST
     **************************************************************************/
    loadXML : function(uri)
    {
        uri = typeof(uri) == "string" && uri.length > 0 ? uri : null;

        if (uri)
        {
            var xdocument = null;

            if (document.implementation && document.implementation.createDocument)
            {
                xdocument = document.implementation.createDocument("", "", null);
            }
            else if (window.ActiveXObject)
            {
                xdocument = new ActiveXObject("Microsoft.XMLDOM");
            }

            try
            {
                xdocument.async = false;
                xdocument.load(uri);
            }
            catch (e)
            {
                try
                {
                    sonar.external.HTTP_REQUEST.abort();
                    sonar.external.HTTP_REQUEST.onreadystatechange = function() {};
                    sonar.external.HTTP_REQUEST.open("get", uri, false);
                    sonar.external.HTTP_REQUEST.send(null);

                    xdocument = sonar.external.HTTP_REQUEST.responseXML;
                }
                catch (e) {}
            }

            return xdocument;
        }
    }
}