// --------------------------------------------------------------------------

/* 'CSS-Regeln lesen/aendern 160608' (c) cybaer@binon.net - http://Coding.binon.net/cssRule */
/* Lizenz CC <http://creativecommons.org/licenses/by-nc-sa/2.5/> */
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");
 }
}

// --------------------------------------------------------------------------

/* 'Stylesheet/Regeln hinzufuegen 260907' (c) Cybaer - http://Coding.binon.net/AddStyle */
function addStyle(rules,target) {
 var styleObj=null, styleSheetObj=null, i, j, p, selector, singleSelector, text;
 if(document.createElement && document.getElementsByTagName) {
  if(typeof(target)=="number") {
   if(target<=-1) { target=document.getElementsByTagName("style").length+Math.ceil(target); }
   target=Math.max(0,Math.min(document.getElementsByTagName("style").length-1,Math.floor(target)));
  }
  if(typeof(target)=="undefined" || typeof(target)=="string" || !document.getElementsByTagName("style")[target]) {
   if(document.createStyleSheet) {
    styleSheetObj=document.createStyleSheet();
    styleObj=styleSheetObj.owningElement || styleSheetObj.ownerNode;
   } else {
    styleObj=document.createElement("style");
    document.getElementsByTagName("head")[0].appendChild(styleObj);
   }
   styleObj.setAttribute("type","text/css");
   if(target) { styleObj.setAttribute("media",target); }
  } else if(typeof(target)=="number") {
   styleObj=document.getElementsByTagName("style")[target];
   styleSheetObj=styleObj.sheet || styleObj.styleSheet;
  }
  if(styleObj && rules) {
   /*@cc_on
   @if(@_jscript)
    rule=rules.replace(/\s+/g," ").replace(/\/\*.+?\*\//g,"").split("}");
    for(i=0;i<rule.length;i++) {
     p=rule[i].indexOf("{");
     selector=rule[i].substring(0,p).replace(/^\s+|\s+$/g,"");
     text=rule[i].substring(p+1).replace(/^\s+|\s+$/g,"");
     if(selector) {
      if(selector.indexOf(",")) {
       singleSelector=selector.split(",");
      } else {
       singleSelector=new Array(selector);
      }
      for(j=0;j<singleSelector.length;j++) {
       styleSheetObj.addRule(singleSelector[j].replace(/^\s+|\s+$/g,""),(text)?text:" ");
      }
     }
    }
   @else @*/
    if(styleObj.firstChild) { styleObj.firstChild.nodeValue=styleObj.firstChild.nodeValue.replace("<!--",""); }
    if(styleObj.lastChild) { styleObj.lastChild.nodeValue=styleObj.lastChild.nodeValue.replace("-->",""); }
    styleObj.appendChild(document.createTextNode(rules+"\n"));
   /*@end @*/
  }
 }
 return styleObj;
}

// --------------------------------------------------------------------------

/* 'Stil via Stylesheet setzen 280907' - Kombination aus http://Coding.binon.net/cssRule & http://Coding.binon.net/addStyle */
function setCssStyle(selector,attribute,value,media) {
 var result;
 if(typeof(value)=="undefined") { value=""; }
 if(typeof(media)=="undefined") { media="*"; }
 result=cssRule(selector+"@"+media,attribute,value);
 if(!result && value) { result=addStyle(selector+" { "+attribute+":"+value+"; }",(!media || media=="*")?"":media); }
 return (result)?true:false;
}

// --------------------------------------------------------------------------
