
/* 'CSS-Regeln lesen/aendern 040708' (c) cybaer@binon.net - http://Coding.binon.net/cssRule */
/* Lizenz CC <http://creativecommons.org/licenses/by-nc-sa/3.0/> */
/* Kommerzielle Lizenz: lizenzen@aldaron.de */
function cssRule(target,attrib,value) {
 var s=0, r=0, i, result=false, clipper, sheetNo=NaN, startSheetNo, endSheetNo, mediaType, unifiedSelectorText, unifiedTagName, complete, write;
 var sheetObj=false, ruleColl=false, ruleObj=false, styleObj=false, ownerObj=false, rulePointer="", sheetIndex=NaN, mediaTextObj, mediaTypeIndex;
 if(!target && document.styleSheets) {
  result=true;
 }
 if(typeof(target)=="object") {
  sheetObj=true;
  styleObj=target;
  target=false;
 }
 if(document.styleSheets && document.styleSheets.length && (target || typeof(target)=="number")) {
  if(typeof(target)=="number") { target+="/0"; }
  if(!isNaN(parseInt(target)) && target.indexOf("/")>0) {
   s=parseInt(target.split("/")[0],10);
   r=parseInt(target.split("/")[1],10);
   if(typeof(document.styleSheets[s])=="object" && document.styleSheets[s]) {
    sheetObj=document.styleSheets[s];
    rulePointer=""+s;
    ownerObj=(sheetObj.ownerNode)?sheetObj.ownerNode:sheetObj.owningElement;
    if(sheetAccessible(s)) {
     if(sheetObj.rules && typeof(sheetObj.media)=="string") {
      ruleColl=sheetObj.rules;
      if(ruleColl[r]) {
       ruleObj=ruleColl[r];
       styleObj=ruleObj.style;
       rulePointer+="/"+r;
      }
     } else if(sheetObj.cssRules) {
      ruleColl=sheetObj.cssRules;
      if(ruleColl[r]) {
       if(ruleColl[r].type==1) {
        ruleObj=ruleColl[r];
        styleObj=ruleObj.style;
        rulePointer+="/"+r;
       }
      }
     }
    }
   }
  } else {
   target=target.toLowerCase();
   i=target.indexOf("@")+1;
   if(i) {
    clipper=target.substring(i);
    target=target.substring(0,i-1);
    sheetNo=parseInt(clipper);
    mediaType=(isNaN(sheetNo))?clipper:"*"
   } else {
    mediaType="*";
   }
   if(!isNaN(sheetNo)) {
    startSheetNo=sheetNo;
    endSheetNo=sheetNo;
   } else {
    startSheetNo=document.styleSheets.length-1;
    endSheetNo=0;
   }
   if(startSheetNo>=endSheetNo && startSheetNo<document.styleSheets.length && endSheetNo>=0) {
    for(s=startSheetNo; s>=endSheetNo; s-=1) {
     sheetObj=document.styleSheets[s];
     rulePointer=""+s;
     ownerObj=(sheetObj.ownerNode)?sheetObj.ownerNode:sheetObj.owningElement;
     if(sheetAccessible(s)) {
      if(sheetObj.rules && typeof(sheetObj.media)=="string") {
       ruleColl=sheetObj.rules;
       for(r=ruleColl.length-1; r>=0; r-=1) {
        if(((mediaType && sheetObj.media.toLowerCase().indexOf(mediaType)>=0) || (!mediaType && !sheetObj.media) || mediaType=="*") && ruleColl[r].selectorText.toLowerCase().indexOf(target)>-1) {
         unifiedSelectorText=unifySelectorText(ruleColl[r].selectorText);
         if(unifiedSelectorText==target) {
          ruleObj=ruleColl[r];
          styleObj=ruleObj.style;
          rulePointer=s+"/"+r;
          break;
         }
        }
       }
      } else if(sheetObj.cssRules) {
       ruleColl=sheetObj.cssRules;
       for(r=ruleColl.length-1; r>=0; r-=1) {
        mediaTextObj=sheetObj.media.mediaText;
        mediaTypeIndex=(!mediaTextObj)?-1:mediaTextObj.toLowerCase().indexOf(mediaType);
        if(ruleColl[r].type==1 && ((mediaType && mediaTypeIndex>=0) || (!mediaType && !sheetObj.media.mediaText) || mediaType=="*") && ruleColl[r].selectorText.toLowerCase().indexOf(target)>-1) {
         unifiedSelectorText=unifySelectorText(ruleColl[r].selectorText);
         if(unifiedSelectorText==target) {
          ruleObj=ruleColl[r];
          styleObj=ruleObj.style;
          rulePointer=s+"/"+r;
          break;
         } else if(unifiedSelectorText.indexOf(",")>-1) {
          selectorArray=unifiedSelectorText.split(",");
          for(i=0; i<selectorArray.length; i++) {
           while(selectorArray[i].charAt(0)==" ") { selectorArray[i]=selectorArray[i].substring(1,selectorArray[i].length); }
           while(selectorArray[i].charAt(selectorArray[i].length-1)==" ") { selectorArray[i]=selectorArray[i].substring(0,selectorArray[i].length-1); }
           if(selectorArray[i]==target) {
            ruleObj=ruleColl[r];
            styleObj=ruleObj.style;
            rulePointer=s+"/"+r;
            break;
           }
          }
          if(styleObj) { break; }
         }
        }
       }
      }
      if(styleObj) { break; }
     }
    }
   }
   if(isNaN(sheetNo) && !styleObj) {
    sheetObj=false;
    ruleColl=false;
    ownerObj=false;
    rulePointer="";
   }
  }
 }
 if(!sheetObj) {
  if(attrib=="sheetindex") { result=NaN; }
 } else {
  switch(attrib) {
   case "sheetobject":
    result=sheetObj;
    break;
   case "rulecollection":
    result=ruleColl;
    break;
   case "ruleobject":
    result=ruleObj;
    break;
   case "styleobject":
    result=styleObj;
    break;
   case "ownerobject":
    result=ownerObj;
    break;
   case "ownermarkup":
    /*@cc_on
    @if(@_jscript)
     result=ownerObj.outerHTML;
     while(result.charCodeAt(0)==13 || result.charCodeAt(0)==10) { result=result.substring(1); } 
    @else @*/
     unifiedTagName=ownerObj.tagName.toLowerCase();
     result="<"+unifiedTagName;
     for(i=0; i<ownerObj.attributes.length; i++) { result+=' '+ownerObj.attributes[i].name+'="'+ownerObj.attributes[i].value+'"'; }
     result+=">";
     if(unifiedTagName=="style") {
      for(i=0; i<ruleColl.length; i++) { result+=ruleColl[i].selectorText+" { "+ruleColl[i].style.cssText+" }\n"; }
      result+="</"+unifiedTagName+">";
     }
    /*@end @*/
    break;
   case "sheetindex":
    result=parseInt(rulePointer);
    break;
   case "rulepointer":
    result=(rulePointer.indexOf("/")>-1 || rulePointer===false)?rulePointer:(sheetAccessible(rulePointer)?false:"");
    break;
  default:
   complete=(!attrib)?true:false;
   write=(typeof(value)!="undefined")?true:false;
   if(!complete) {
    attrib=propertyToStyle(attrib);
    if(write) {
     styleObj[attrib]=value;
     result=true;
    } else {
     result=styleObj[attrib];
    }
   } else if(styleObj.cssText!=null) {
    if(write) {
     styleObj.cssText=value;
     result=true;
    } else {
     result=styleObj.cssText.toLowerCase();
    }
   }
  }
 }
 return result;
}
function unifySelectorText(selText) {
 var i, addSelectors, addSelectorsRegExp;
 addSelectors=selText.match(/\.([A-Za-z]+[\w-]*\[)/g);
 if(addSelectors) {
  for(i=0; i<addSelectors.length; i++) {
   addSelectorsRegExp=new RegExp("\\"+addSelectors[i].substring(0,addSelectors[i].length-1)+"\\[(CLASS|class)~=["+'"'+"|']?"+addSelectors[i].substring(1,addSelectors[i].length-1)+"["+'"'+"|']?\\]","g");
   selText=selText.replace(addSelectorsRegExp,addSelectors[i].substring(0,addSelectors[i].length-1));
  }
 }
 addSelectors=selText.match(/#([A-Za-z]+[\w-]*\[)/g);
 if(addSelectors) {
  for(i=0; i<addSelectors.length; i++) {
   addSelectorsRegExp=new RegExp(addSelectors[i].substring(0,addSelectors[i].length-1)+"\\[(ID|id)["+'"'+"|']?"+addSelectors[i].substring(1,addSelectors[i].length-1)+"["+'"'+"|']?\\]","g");
   selText=selText.replace(addSelectorsRegExp,addSelectors[i].substring(0,addSelectors[i].length-1));
  }
 }
 selText=selText.toLowerCase();
 return selText;
}
function propertyToStyle(property) {
 var i, syntax;
 if(property=="float") { property=((typeof(window.cssFloat)=="undefined")?"style":"css")+property.charAt(0).toUpperCase()+property.substring(1); }
 else if(property.indexOf("-")>=0) {
  syntax=property.split("-");
  property=syntax[0];
  for(i=1; i<syntax.length; i++) { property+=syntax[i].charAt(0).toUpperCase()+syntax[i].substring(1); }
 }
 return property;
}
function sheetAccessible(sheetNo) {
 try {
  if(document.styleSheets[sheetNo].cssRules || document.styleSheets[sheetNo].rules) {
   throw "sheetAccessible";
  }
 } catch(e) {
  return (e=="sheetAccessible");
 }
}

