/* Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
'use strict';

// User service
flowableModule.service('ResourceService', ['$http', '$q', 'appResourceRoot',
    function ($http, $q, appResourceRoot) {

        var loadedResources = {};

        function loadStylesheet(relativeUrl, cache)
        {
            var url = appResourceRoot + relativeUrl;
            if (!cache || !loadedResources[url])
            {
                if (cache) {
                    loadedResources[url] = true;
                }
                if (document.createStyleSheet)
                {
                    try
                    {
                        document.createStyleSheet();
                    } catch (e) { }
                }
                else {
                    var link = document.createElement("link");
                    link.rel = "stylesheet";
                    link.type = "text/css";
                    link.media = "all";
                    link.href = url;
                    document.getElementsByTagName("head")[0].appendChild(link);
                }
            }
        }

        function loadScript(relativeUrl, callback, cache)
        {
            var url = appResourceRoot + relativeUrl;
            if (cache && loadedResources[url] && callback)
            {
                callback();
            }
            else
            {
                if (cache) {
                    loadedResources[url] = true;
                }

                // Insert the node so it gets loaded
                var script = document.createElement("script");
                script.type="text/javascript";
                script.src = url;

                if (callback) {
                    var done = false;

                    // Attach handlers for all browsers
                    script.onload = script.onreadystatechange = function()
                    {
                        if (!done && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete"))
                        {
                            done = true;
                            callback();
                        }
                    };
                }
                var el = document.getElementsByTagName("head")[0];
                el.appendChild(script);
            }
        }

        function loadScripts(relativeUrls, callback, cache)
        {
            function loadNext()
            {
                var relativeUrl = relativeUrls.shift();
                if (relativeUrl)
                {
                    loadScript.call(this, relativeUrl, loadNext.bind(this), cache);
                }
                else
                {
                    if (callback)
                    {
                        callback();
                    }
                }
            }
            loadNext.call(this);
        }

        function loadFromHtml(url, callback, cache)
        {
            $http.get(url).success(function(responseText)
            {
                var xmlDoc;
                if (window.DOMParser)
                {
                    var parser = new DOMParser();
                    xmlDoc = parser.parseFromString(responseText, "text/xml");
                }
                else // Internet Explorer
                {
                    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                    xmlDoc.async = false;
                    xmlDoc.loadXML(responseText);
                }
                var resources = xmlDoc.getElementsByTagName("link");
                var resourceUrl;
                var resourceUrls = [];
                for (var i = 0, il = resources.length; i < il; i++)
                {
                    resourceUrl = resources[i].getAttribute("href");
                    if (resourceUrl)
                    {
                        loadStylesheet(resourceUrl, cache);
                    }
                }
                resources = xmlDoc.getElementsByTagName("script");
                for (i = 0, il = resources.length; i < il; i++)
                {
                    resourceUrl = resources[i].getAttribute("src");
                    if (resourceUrl)
                    {
                        resourceUrls.push(resourceUrl);
                    }
                }
                loadScripts(resourceUrls, callback, cache);
            });
        }

        this.loadFromHtml = loadFromHtml;
        this.loadScript = loadScript;
        this.loadStylesheet = loadStylesheet;
    }]);
