108 lines
3.3 KiB
JavaScript
108 lines
3.3 KiB
JavaScript
//>>built
|
|
define("dojox/data/css", ["dojo/_base/lang", "dojo/_base/array"],
|
|
function(lang, array) {
|
|
|
|
var css = lang.getObject("dojox.data.css",true)
|
|
|
|
css.rules = {};
|
|
|
|
css.rules.forEach = function(fn,ctx,context){
|
|
if(context){
|
|
var _processSS = function(styleSheet){
|
|
//iterate across rules in the stylesheet
|
|
array.forEach(styleSheet[styleSheet.cssRules?"cssRules":"rules"], function(rule){
|
|
if(!rule.type || rule.type !== 3){// apply fn to current rule with approp ctx. rule is arg (all browsers)
|
|
var href = "";
|
|
if(styleSheet && styleSheet.href){
|
|
href = styleSheet.href;
|
|
}
|
|
fn.call(ctx?ctx:this,rule, styleSheet, href);
|
|
}
|
|
});
|
|
//process any child stylesheets
|
|
};
|
|
array.forEach(context,_processSS);
|
|
}
|
|
};
|
|
|
|
css.findStyleSheets = function(sheets){
|
|
// Takes an array of stylesheet paths and finds the currently loaded StyleSheet objects matching
|
|
// those names
|
|
var sheetObjects = [];
|
|
var _processSS = function(styleSheet){
|
|
var s = css.findStyleSheet(styleSheet);
|
|
if(s){
|
|
array.forEach(s, function(sheet){
|
|
if(array.indexOf(sheetObjects, sheet) === -1){
|
|
sheetObjects.push(sheet);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
array.forEach(sheets, _processSS);
|
|
return sheetObjects;
|
|
};
|
|
|
|
css.findStyleSheet = function(sheet){
|
|
// Takes a stylesheet path and finds the currently loaded StyleSheet objects matching
|
|
// those names (and it's parent(s), if it is imported from another)
|
|
var sheetObjects = [];
|
|
if(sheet.charAt(0) === '.'){
|
|
sheet = sheet.substring(1);
|
|
}
|
|
var _processSS = function(styleSheet){
|
|
if(styleSheet.href && styleSheet.href.match(sheet)){
|
|
sheetObjects.push(styleSheet);
|
|
return true;
|
|
}
|
|
if(styleSheet.imports){
|
|
return array.some(styleSheet.imports, function(importedSS){ //IE stylesheet has imports[] containing @import'ed rules
|
|
//console.debug("Processing IE @import rule",importedSS);
|
|
return _processSS(importedSS);
|
|
});
|
|
}
|
|
//iterate across rules in the stylesheet
|
|
return array.some(styleSheet[styleSheet.cssRules?"cssRules":"rules"], function(rule){
|
|
if(rule.type && rule.type === 3 && _processSS(rule.styleSheet)){// CSSImportRule (firefox)
|
|
//sheetObjects.push(styleSheet);
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
};
|
|
array.some(document.styleSheets, _processSS);
|
|
return sheetObjects;
|
|
};
|
|
|
|
css.determineContext = function(initialStylesheets){
|
|
// Takes an array of stylesheet paths and returns an array of all stylesheets that fall in the
|
|
// given context. If no paths are given, all stylesheets are returned.
|
|
var ret = [];
|
|
if(initialStylesheets && initialStylesheets.length > 0){
|
|
initialStylesheets = css.findStyleSheets(initialStylesheets);
|
|
}else{
|
|
initialStylesheets = document.styleSheets;
|
|
}
|
|
var _processSS = function(styleSheet){
|
|
ret.push(styleSheet);
|
|
if(styleSheet.imports){
|
|
array.forEach(styleSheet.imports, function(importedSS){ //IE stylesheet has imports[] containing @import'ed rules
|
|
//console.debug("Processing IE @import rule",importedSS);
|
|
_processSS(importedSS);
|
|
});
|
|
}
|
|
//iterate across rules in the stylesheet
|
|
array.forEach(styleSheet[styleSheet.cssRules?"cssRules":"rules"], function(rule){
|
|
if(rule.type && rule.type === 3){// CSSImportRule (firefox)
|
|
_processSS(rule.styleSheet);
|
|
}
|
|
});
|
|
};
|
|
array.forEach(initialStylesheets,_processSS);
|
|
return ret;
|
|
};
|
|
|
|
return css;
|
|
|
|
});
|