﻿// This javascript taken in part from http://www.hunlock.com/blogs/Totally_Pwn_CSS_with_Javascript

// StyleSheet manipulation
function createStyleSheet(name)
{
    var cssNode = document.createElement('style');
    cssNode.type = 'text/css';
    cssNode.rel = 'stylesheet';
    cssNode.media = 'screen';
    cssNode.title = name;
    document.getElementsByTagName("head")[0].appendChild(cssNode);
}

function createStyleSheet(name, src)
{
    var cssNode = document.createElement('link');
    cssNode.type = 'text/css';
    cssNode.rel = 'stylesheet';
    cssNode.href = src;
    cssNode.media = 'screen';
    cssNode.title = name;
    document.getElementsByTagName("head")[0].appendChild(cssNode);
}

function getStyleSheet(name)
{
    for (var i=0; i<document.styleSheets.length; i++) {
        if(document.styleSheets[i].title == name)
        {
            return document.styleSheets[i];
        }
    }
    
    return false;
}

// Rule manipulation

function getCSSRule(ruleName, deleteFlag) {               // Return requested style obejct
   ruleName=ruleName.toLowerCase();                       // Convert test string to lower case.
   if (document.styleSheets) {                            // If browser can play with stylesheets
      for (var i=0; i<document.styleSheets.length; i++) { // For each stylesheet
         var styleSheet=document.styleSheets[i];          // Get the current Stylesheet
         var ii=0;                                        // Initialize subCounter.
         var cssRule=false;                               // Initialize cssRule. 
         do {                                             // For each rule in stylesheet
            if (styleSheet.cssRules) {                    // Browser uses cssRules?
               cssRule = styleSheet.cssRules[ii];         // Yes --Mozilla Style
            } else {                                      // Browser usses rules?
               cssRule = styleSheet.rules[ii];            // Yes IE style. 
            }                                             // End IE check.
            if (cssRule)  {                               // If we found a rule...
               if (cssRule.selectorText.toLowerCase()==ruleName) { //  match ruleName?
                  if (deleteFlag=='delete') {             // Yes.  Are we deleteing?
                     if (styleSheet.cssRules) {           // Yes, deleting...
                        styleSheet.deleteRule(ii);        // Delete rule, Moz Style
                     } else {                             // Still deleting.
                        styleSheet.removeRule(ii);        // Delete rule IE style.
                     }                                    // End IE check.
                     return true;                         // return true, class deleted.
                  } else {                                // found and not deleting.
                     return cssRule;                      // return the style object.
                  }                                       // End delete Check
               }                                          // End found rule name
            }                                             // end found cssRule
            ii++;                                         // Increment sub-counter
         } while (cssRule)                                // end While loop
      }                                                   // end For loop
   }                                                      // end styleSheet ability check
   return false;                                          // we found NOTHING!
}                                                         // end getCSSRule 

function killCSSRule(ruleName) {                          // Delete a CSS rule   
   return getCSSRule(ruleName,'delete');                  // just call getCSSRule w/delete flag.
}                                                         // end killCSSRule

function addCSSRule(ruleName) {                           // Create a new css rule
   if (document.styleSheets) {                            // Can browser do styleSheets?
      if (!getCSSRule(ruleName)) {                        // if rule doesn't exist...
         if (document.styleSheets[0].addRule) {           // Browser is IE?
            document.styleSheets[0].addRule(ruleName, null,0);      // Yes, add IE style
         } else {                                         // Browser is IE?
            document.styleSheets[0].insertRule(ruleName+' { }', 0); // Yes, add Moz style.
         }                                                // End browser check
      }                                                   // End already exist check.
   }                                                      // End browser ability check.
   return getCSSRule(ruleName);                           // return rule we just created.
} 

function getCSSRuleFromStyleSheet(ruleName, styleSheet, deleteFlag) {              
   ruleName=ruleName.toLowerCase();                      
   if(styleSheet)
   {
     var ii=0;                                       
     var cssRule=false;                              
     do {                                            
        if (styleSheet.cssRules) {                   
           cssRule = styleSheet.cssRules[ii];      
        } else {                                     
           cssRule = styleSheet.rules[ii];          
        }                                            
        if (cssRule)  {                              
           if (cssRule.selectorText.toLowerCase()==ruleName) { 
              if (deleteFlag=='delete') {
                 if (styleSheet.cssRules) {          
                    styleSheet.deleteRule(ii);       
                 } else {                       
                    styleSheet.removeRule(ii);      
                 }                              
                 return true;                  
              } else {                          
                 return cssRule;             
              }                                
           }                                    
        }                                       
        ii++;                                      
     } while (cssRule)   
   }
                                                      
   return false;                                         
}                                                         

function killCSSRuleFromStyleSheet(ruleName, styleSheet) {                          
   return getCSSRuleFromStyleSheet(ruleName, styleSheet,'delete');                
}                                                    

function addCSSRuleToStyleSheet(ruleName, styleSheet) {                         
   if (styleSheet) {                         
      if (!getCSSRuleFromStyleSheet(ruleName, styleSheet)) {                  
         if (styleSheet.addRule) {          
            styleSheet.addRule(ruleName, null,0);   
         } else {                                       
            styleSheet.insertRule(ruleName+' { }', 0); 
         }                                               
      }                                            
   }                                                    
   return getCSSRuleFromStyleSheet(ruleName, styleSheet);                         
} 