﻿var preloadCssImages = {
    imgUrls: [],
    divPreImages: null,

    Load: function() {
        this.parseCSS(document.styleSheets);
    },

    InitPreImageDiv: function() {
        this.divPreImages = document.createElement("div");
        this.divPreImages.style.display = "none";
        this.divPreImages.style.visibility = "hidden";
        document.body.appendChild(this.divPreImages);
    },

    inArray: function(elem, array) {
        for (var i = 0, length = array.length; i < length; i++)
            if (array[i] === elem)
            return i;
        return -1;
    },

    parseCSS: function(sheets) {
        var w3cImport = -1;
    },

    parseCSS: function(sheets) {
        var w3cImport = false,
            imported = [],
            importedSrc = [],
            baseURL;
        var sheetIndex = sheets.length;
        while (sheetIndex--) {//loop through each stylesheet
            var cssPile = ''; //create large string of all css rules in sheet
            var csshref = (sheets[sheetIndex].href) ? sheets[sheetIndex].href : 'window.location.href';
            var baseURLarr = csshref.split('/'); //split href at / to make array
            baseURLarr.pop(); //remove file path from baseURL array
            baseURL = baseURLarr.join('/'); //create base url for the images in this sheet (css file's dir)
            if (baseURL) {
                baseURL += '/'; //tack on a / if needed
            }
            if (sheets[sheetIndex].cssRules || sheets[sheetIndex].rules) {
                thisSheetRules = (sheets[sheetIndex].cssRules) ? //->>> http://www.quirksmode.org/dom/w3c_css.html
                    sheets[sheetIndex].cssRules : //w3
                    sheets[sheetIndex].rules; //ie
                var ruleIndex = thisSheetRules.length;
                while (ruleIndex--) {
                    if (thisSheetRules[ruleIndex].style && thisSheetRules[ruleIndex].style.cssText) {
                        var text = thisSheetRules[ruleIndex].style.cssText;
                        if (thisSheetRules[ruleIndex].selectorText.indexOf('hover') != -1) { //only add hover class....
                            if (text.toLowerCase().indexOf('url') != -1) { // only add rules to the string if you can assume, to find an image, speed improvement
                                cssPile += text; // thisSheetRules[ruleIndex].style.cssText instead of thisSheetRules[ruleIndex].cssText is a huge speed improvement
                            }
                        }
                    } else if (thisSheetRules[ruleIndex].styleSheet) {
                        imported.push(thisSheetRules[ruleIndex].styleSheet);
                        w3cImport = true;
                    }

                }
            }
            //parse cssPile for image urls
            var tmpImage = cssPile.match(/[^\("]+\.(gif|jpg|jpeg|png)/g);
            //reg ex to get a string of between a "(" and a ".filename" / '"' for opera-bugfix
            if (tmpImage) {
                var i = tmpImage.length;
                while (i--) { // handle baseUrl here for multiple stylesheets in different folders bug
                    var imgSrc = (tmpImage[i].charAt(0) == '/' || tmpImage[i].match('://')) ? // protocol-bug fixed
                        tmpImage[i] :
                        baseURL + tmpImage[i];

                    if (this.inArray(imgSrc, this.imgUrls) == -1) {
                        this.imgUrls.push(imgSrc);
                    }
                }
            }
            if (!w3cImport && sheets[sheetIndex].imports && sheets[sheetIndex].imports.length) {
                for (var iImport = 0, importLen = sheets[sheetIndex].imports.length; iImport < importLen; iImport++) {
                    var iHref = sheets[sheetIndex].imports[iImport].href;
                    iHref = iHref.split('/');
                    iHref.pop();
                    iHref = iHref.join('/');
                    if (iHref) {
                        iHref += '/'; //tack on a / if needed
                    }
                    var iSrc = (iHref.charAt(0) == '/' || iHref.match('://')) ? // protocol-bug fixed
                        iHref :
                        baseURL + iHref;

                    importedSrc.push(iSrc);
                    imported.push(sheets[sheetIndex].imports[iImport]);
                }
            }
        } //loop
        if (imported.length) {
            parseCSS(imported, importedSrc);
            return false;
        }
        if (this.imgUrls && this.imgUrls.length > 0) {
            this.InitPreImageDiv();
            this.loadImgs();
        }
    },

    loadImgs: function() {
        if (this.imgUrls && this.imgUrls.length) {
            for (var i = 0, length = this.imgUrls.length; i < length; i++) {
                var img = new Image(); //new img obj
                img.src = this.imgUrls[i];    //set src either absolute or rel to css dir
                this.divPreImages.appendChild(img);
            }
        }
    }
}
