
/*** (C)Scripterlative.com

 Info: scripterlative.com?changeclass

 Please notify any suspected errors in this text or code, however minor.

GratuityWare
~~~~~~~~~~~~
If you wish to express your gratitude for my efforts, please visit: www.scripterlative.com

***/


var ClassManager=/*2843295374657068656E204368616C6D657273*/
{
 append:false,

 setAppend:function(state) /**Set state of append flag***/
 {
   this.append=state; 
 },
    
 setClass:function(elem, cName)
 {
  if( typeof elem.className != 'string' || elem.className == "" )  
   elem.className=cName;
  else
   if( this.append )
   {
    if( !new RegExp("\b"+cName+"\b").test(elem.className) )
     elem.className+=' '+cName;
   }
   else
    elem.className=cName;
 },
 
 setOneToMany:function() /* First param=new classname, subsequent params = IDs of all elems to change */
 {
  var ref;
  document.eFunc=document.getElementById || document.all;

  if( document.eFunc )
   for( var i=1; i<arguments.length; i++ )
    if( (ref=document.eFunc( arguments[i] )) )
     this.setClass(ref, arguments[0]);
 },

 setMultipleClasses:function() /* Specify multiple id/class pairs */
 {
  var ref;  
  document.eFunc=document.getElementById || document.all;

  if( document.eFunc )
   for( var i=0; i<arguments.length; i+=2 )
    if( (ref=document.eFunc( arguments[i] )) )
     this.setClass( ref, arguments[i+1] );
 },

 changeAll:function(cName, newName) /* Change all elems with class name cName to newName */
 {
  var isWild=document.getElementsByTagName && document.getElementsByTagName('*') ?true:false;
  
  var elems = (this.isWild ? document.getElementsByTagName('*') : (document.all || this.getElements(document.childNodes[0])));
 
  if( elems )
   for( var i=0; i<elems.length; i++ )
    if( elems[i].className == cName )
     this.setClass(elems[i], newName);
 },
 
 toggleClass:function(classA, classB)  /* Toggle className of one or more elems between classA & classB. */
 {                                     /* Subsequent parameters specify IDs of all elements to change. */
  var ref, elems;                      /* If an element has neither class name, don't change. */
  document.eFunc=document.getElementById || document.all; /*If no elements are specified, all elements are checked*/

  if( document.eFunc )
   if(arguments.length>2)
   {
    for( var i=2; i<arguments.length; i++ )
     if( (ref=document.eFunc( arguments[i] )) )
      this.setClass(ref, (ref.className==classA?classB:ref.className==classB?classA:ref.className) );
   }
   else
    {
      elems=this.getAllElems();
      
      for(var i=0, rslt; i<elems.length; i++)
       if(typeof elems[i].className=='string' && elems[i].className!="")
        if( (rslt=new RegExp("("+classA+"|"+classB+")").exec( elems[i].className )) )
         elems[i].className = elems[i].className.replace(rslt[1], rslt[1] == classB ? classA : classB);
    }
 },
 
 getAllElems:function()
 {
  var isWild=document.getElementsByTagName && document.getElementsByTagName('*');
  
  return  isWild ? document.getElementsByTagName('*') : (document.all || this.getElements(document.childNodes[0]));
 },
 
 getElements:function(obj)
 {
  var allElems=[]; 
 
  if(obj.childNodes)
   for (var i=0; i < obj.childNodes.length; i++)
    if (obj.childNodes[i].nodeType==1) // Elements only
    { 
     allElems[ allElems.length ]=obj.childNodes[i];
     allElems=allElems.concat( this.getElements(obj.childNodes[i]) );
    } 
 
  return allElems;
 }
 
}
  


