first part of ACL and re-skinning work and some other small stuff
[freeside.git] / httemplate / elements / cssexpr.js
diff --git a/httemplate/elements/cssexpr.js b/httemplate/elements/cssexpr.js
new file mode 100644 (file)
index 0000000..c434d8d
--- /dev/null
@@ -0,0 +1,66 @@
+function constExpression(x) {
+       return x;
+}
+
+function simplifyCSSExpression() {
+       try {
+               var ss,sl, rs, rl;
+               ss = document.styleSheets;
+               sl = ss.length
+       
+               for (var i = 0; i < sl; i++) {
+                       simplifyCSSBlock(ss[i]);
+               }
+       }
+       catch (exc) {
+               //alert("Got an error while processing css. The page should still work but might be a bit slower");
+               throw exc;
+       }
+}
+
+function simplifyCSSBlock(ss) {
+       var rs, rl;
+       
+       for (var i = 0; i < ss.imports.length; i++)
+               simplifyCSSBlock(ss.imports[i]);
+       
+       if (ss.cssText.indexOf("expression(constExpression(") == -1)
+               return;
+
+       rs = ss.rules;
+       rl = rs.length;
+       for (var j = 0; j < rl; j++)
+               simplifyCSSRule(rs[j]);
+       
+}
+
+function simplifyCSSRule(r) {
+       var str = r.style.cssText;
+       var str2 = str;
+       var lastStr;
+       do {
+               lastStr = str2;
+               str2 = simplifyCSSRuleHelper(lastStr);
+       } while (str2 != lastStr)
+
+       if (str2 != str)
+               r.style.cssText = str2;
+}
+
+function simplifyCSSRuleHelper(str) {
+       var i, i2;
+       i = str.indexOf("expression(constExpression(");
+       if (i == -1) return str;
+       i2 = str.indexOf("))", i);
+       var hd = str.substring(0, i);
+       var tl = str.substring(i2 + 2);
+       var exp = str.substring(i + 27, i2);
+       var val = eval(exp)
+       return hd + val + tl;
+}
+
+if (/msie/i.test(navigator.userAgent) && window.attachEvent != null) {
+       window.attachEvent("onload", function () {
+               simplifyCSSExpression();
+       });
+}