function getID( id )
{return document.getElementById(id);}

function createNewDiv( root )
{if( !root )
     root = document.getElementsByTagName('body')[0];
  var div = document.createElement('div');
  root.appendChild( div );

  return div;
}

/*  Adds an event-listener to the specified element and forces the DOM-behavior
 *  upon ie. So you can use the this-context whatshowever. Method supports
 *  the definition of the receiving element (so you can catch events from other
 *  objects)
 *  E.g. addListner(img,'click',function(){[..]})
 *
 *  @param element The element that will trigger the event.
 *  @param which String that indicates the event (E.g. 'mouseover', 'click', ..)
 *  @param method Function to be called as the event occurs.
 *  @param receiver Optional, if the receiving element differs from the triggering event.
 *  @author Steffen Friedrich, steffen.friedrich@pingping.ag
 **/
function addListener(element, which, method, receiver)
{if(element.addEventListener)
        if(receiver && receiver!=element)
        {var eventMethod = which+'DOMevent', seeker=0;
            while( element[eventMethod+seeker]
                   || receiver[eventMethod+seeker] ) seeker=Math.round(Math.random()*10000);
            eventMethod = eventMethod+seeker;
            element[eventMethod]=receiver;
            receiver[eventMethod]=method;
            eval('function addListenerCall(ev){return this.'+eventMethod+'.'+eventMethod+'(ev,this)}');
            element.addEventListener(which, addListenerCall, 0);
        } else element.addEventListener(which, method, 0);
    else if(element.attachEvent)
    {var eventMethod = which+'DOMevent', seeker=0;
        if(receiver && receiver==element)
            receiver = 0;
        while(element[eventMethod+seeker]
                || receiver && receiver[eventMethod+seeker] ) seeker++;
        eventMethod = eventMethod+seeker;
        if(receiver)
        {element[eventMethod]=receiver;
            element[eventMethod][eventMethod]=method;
        } else element[eventMethod]=method;

        var strts;

        if( receiver ) strts = 'function addListenerCall(ev){if(ev.srcElement)return ev.srcElement.'+eventMethod+'.'+eventMethod+'(ev, ev.srcElement);else if(window.'+eventMethod+')return window.'+ eventMethod+'.'+eventMethod+'(ev,window);}';
            else strts = 'function addListenerCall(ev){if(ev.srcElement){var src=ev.srcElement; while(!src.'+eventMethod+' && src.parentNode)src=src.parentNode;if(src.'+eventMethod+')return src.'+eventMethod+'(ev,ev.srcElement);}else if(window.'+eventMethod+')return window.'+ eventMethod +'(ev,window);}';

        eval(strts);

        element.attachEvent('on'+which, addListenerCall);
    }
}


function selectThis( obj )
{if( obj.onfocus ) obj.select();
      else this.select();
}
function selectOn( id )
{selectThis( getID(id) );}

function focusThis( obj )
{if( obj.onfocus ) obj.focus();
      else this.focus();
}
function focusOn( id )
{focusThis( getID(id) )}

function setImgWidth( id, width )
{getID(id).width = width;}

function setImgHeight( id, height )
{getID(id).height = height;}

function setTop( id, top )
{getID(id).style.top = top;}

function setLeft( id, left )
{getID(id).style.left = left;}

function getSrc( id )
{return getSource( id );}

function setSrc( id, src )
{setSource( id, src );}

function setSource( id, src )
{getID(id).src = src;}

function getSource( id )
{return getID(id).src;}

function setClassOn( obj, className )
{obj.className = className;}

function setClass( id, className )
{setClassOn( getID(id), className );}

function getInHTML( id )
{return getID(id).innerHTML;}

function setInHTML( id, html )
{getID(id).innerHTML = html;}

function getValue( id )
{return getID(id).value;}

function setValue( id, val )
{getID(id).value = val;}

function setChecked( id, val )
{getID(id).checked = val;}

function getChecked( id )
{return getID(id).checked;}

function inverCheck( id )
{var box = getID( id );
  box.checked = !box.checked;
}

function doubleDigit( digit )
{return (digit<10?'0'+digit:digit);}

function setVisible( id, visibility )
{if( visibility==true ) visibility = "visible";
  else
  if( visibility==false ) visibility = "hidden";

  getID(id).style.visibility = visibility;
}

/* Returns screen dimensions */
 function dimensions()
 {var dim;
 	if( document.body.offsetHeight ) dim = {"x":document.body.offsetWidth,"y":document.body.offsetHeight}
 	else dim = {"x":window.innerWidth,"y":window.innerHeight};
 	return dim;
 }

 /** Returns top-left coordinates of element and optionally stores those values.
  	  If storing is desired the stored values will be returned if any could be found.

  	  If no element is supplied the Viewport of the top-left coordinates will be returned.
  	  Those values cannot be stored.
   **/
  function topLeftCoords( element, store )
  {var x = y = 0;

  	if( !element )
	  {if( window.pageYOffset )
		  {y = window.pageYOffset;
		    x = window.pageXOffset;
		  }else
		  {y = document.documentElement.scrollTop;
		    x = document.documentElement.scrollLeft;

		    if( !x && !y )
		    {
		    	x = document.body.scrollLeft;
		    	y = document.body.scrollTop;
		    }
		  }

	  	coords = {"x":x,"y":y};
	  	return coords;
	  }

  	if( store && element.coords )
  		return element.coords;
  	var pele = element;

  	if (pele.offsetParent) {
  	  do {x += pele.offsetLeft;
		   y += pele.offsetTop;
  	  } while (pele = pele.offsetParent);
	  var coords = {"x":x,"y":y};
	  if( store ) element.coords = coords;
	  return coords;
	}
  }


 function scrollSmoothlyTo( top, currentTop )
 {
 	if( typeof currentTop == "undefined" )
 		currentTop = topLeftCoords().y;
 	else
 	if( currentTop != topLeftCoords().y )
 		return;

 	if( top!=currentTop )
 	{
 		var step = Math.round( Math.sqrt( Math.abs( currentTop-top ) ) );

 		if( top<currentTop ) step = 0-step;

 		window.scrollBy( 0, step );

 		currentTop += step;

 		if( !currentTop || currentTop == top ) return;
 		step = 20 - Math.round( Math.abs( currentTop-top )/600 * 15 );

 		window.setTimeout( 'scrollSmoothlyTo('+top+','+currentTop+')', step > 4 ? step : 4 );
 	}
 }

/** Returns BOOLEAN !
*/
function getVis( id )
{return getID(id).style.visibility == 'visible';
}

allIDsPRIVATELYnottobeTOUCHEDpleaze = 0;
function generateID()
{allIDsPRIVATELYnottobeTOUCHEDpleaze++;
  return allIDsPRIVATELYnottobeTOUCHEDpleaze;
}

  function applyScriptSheet( rootNode )
  {var telements, docFunc;
  	if( !rootNode )
  		rootNode = document;

    for( var getTypes in relations )
    {if( !relations[getTypes] )
    		continue;

    	docFunc = 'getElement'
    				+ ( getTypes.substr(getTypes.length-1)=='s' ? 's' : '' )
    				+ 'By' + getTypes.substr(0,1).toUpperCase()
    				+ getTypes.substring(1, ( getTypes.substr(getTypes.length-1)=='s' ? getTypes.length-1 : getTypes.length ) );

    	for( var className in relations[getTypes] )
	      if( relations[getTypes][className] && classes[className] )
			 {if( typeof relations[getTypes][className] == "object" ) // is array of multiple
			 	{
			 		for( var sklave=0; sklave<relations[getTypes][className].length; sklave++ )
				    {telements = rootNode[docFunc]( relations[getTypes][className][sklave] );
				      for( var knecht = 0; knecht<telements.length; knecht++ )
				         if( telements[knecht].getAttributeNode("js")!=null
				      	       && contains(telements[knecht].getAttribute("js").split(" "), className) )
				      	       		new classes[className]( telements[knecht] );
				      telements = null;
			      	}
				}else // is single of type

                                if( getTypes.substr(getTypes.length-1)=='s' ) // returns html collection
					{telements = rootNode[docFunc]( relations[getTypes][className] );
				      for( var knecht = 0; knecht<telements.length; knecht++ )
				         if( telements[knecht].getAttributeNode("js")!=null
				      	       && contains(telements[knecht].getAttribute("js").split(" "), className) )
				      	   		new classes[className]( telements[knecht] );
				      telements = null;
					}else 
					new classes[className]( document[docFunc]( relations[getTypes][className] ) );
			 }
    }
  }

function getFromRGB(r, g, b)
{var color;

  if( !g && !b && typeof r == "object" )
  	color = r;
      else color = new Array(r, g, b);

  for( var sklave=0; sklave<3; sklave++ )
  {color[sklave] = Number( color[sklave] ).toString(16);
  	if( color[sklave].length==1 )
  	color[sklave] = "0" + color[sklave];
  }
  return color.join("");
}


/* returns the RGB values for a color in an Object */
function getRGB( color )
{
  var colO = new Object();
  colO.r = 0;
  colO.g = 0;
  colO.b = 0;
  colO.color = '#000000';

  if( !color )
      return colO;

  if( color.substr(0,1)=='#' )
  	color = color.substr(1);

  if( color.length==3 )
      color = color.charAt(0)+color.charAt(0)+color.charAt(1)+color.charAt(1)+color.charAt(2)+color.charAt(2);

  if( color.length==6 )
  {colO.r = parseInt( color.substr(0,2), 16 );
	  colO.g = parseInt( color.substr(2,2), 16 );
	  colO.b = parseInt( color.substr(4,2), 16 );
  }else if( color.substr(0,3) == 'rgb' )
  {color = color.substring(4, color.length-1);
  	color = color.split(', ');
  	if( color.length!=3 )  return colO;
	colO.r = parseInt( color[0] );
	colO.g = parseInt( color[1] );
	colO.b = parseInt( color[2] );
  	color = getFromRGB(color);
  }

  colO.color = '#'+color;
  return colO;
}

function getAllChildNodes( node )
{var retA = new Array();
  node = node.firstChild;
  while( node )
  {retA.push( node );
    if( node.firstChild )
      retA = retA.concat( getAllChildNodes(node) );
    node = node.nextSibling;
  }
  return retA;
}

  var cachedImageObjects = new Object();
  
  function _default_images_onfailure()
  {if( !this.failures ) this.failures = 1;
  		else if( this.failures>5 )return;
  	else this.failures++;

  	this.src = this.src;
  }

  function _default_images_onload()
  {this.style.visibility = 'visible';
    if( this.cacheListeners )
    	for( var sklave=0; sklave<this.cacheListeners.length; sklave++ )
    	{this.cacheListeners[sklave].oncache( this );
    	    this.cacheListeners[sklave] = null;
    	}
  }  

  function cacheImage( path, cacheListener )
  {
  	if( !cachedImageObjects[path] )
    	{cachedImageObjects[path] = new Image();
    		if( cacheListener )
    			cachedImageObjects[path].cacheListeners = new Array( cacheListener );
    		cachedImageObjects[path].src = path;
    		
			if( !cachedImageObjects[path].complete 
				&& !cachedImageObjects[path].onload )
				{cachedImageObjects[path].style.visibility = 'hidden';
		  		  cachedImageObjects[path].onload = _default_images_onload;
				}
		    		
    	}else if( cacheListener ) 
    	{if( cachedImageObjects[path].complete )
    		  cacheListener.oncache( cachedImageObjects[path] );
    	  else if( cachedImageObjects[path].cacheListeners )
    	  	cachedImageObjects[path].cacheListeners.push( cacheListener );
    	  else cachedImageObjects[path].cacheListeners = new Array( cacheListener );    		
    	}
    	

  }
  
  function cacheImages( rootNode )
  {if( !rootNode )
  		rootNode = document;

    var ims = rootNode.getElementsByTagName("img");
    for( var sklave=0; sklave<ims.length; sklave++ )
  	  	if( ims[sklave].src )
  			cacheImage( ims[sklave].src );

  }

function getStyle( element, cssRule )
{
  if( document.defaultView && document.defaultView.getComputedStyle )
  {var value = document.defaultView.getComputedStyle( element, '' ).getPropertyValue(
      cssRule.replace( /[A-Z]/g, function( match, char )
      {
        return "-" + char.toLowerCase();
      } )
    );
  }
  else if ( element.currentStyle ) var value = element.currentStyle[ cssRule ];
  else                             var value = false;
  return value;
}

function isIe()
{return  0/*@cc_on || @_jscript_version > 4 @*/;
}

function isIe7()
{return  0/*@cc_on || @_jscript_version >= 5.7 @*/;
}

function isIe6()
{return  0/*@cc_on || @_jscript_version < 5.7 @*/;
}

function getColor(element, which)
{if( document.defaultView && document.defaultView.getComputedStyle )
     return document.defaultView.getComputedStyle( element, '' ).getPropertyValue( which );
  else if ( element.currentStyle ) return element.currentStyle[ which ];
  else return '#f5f7f9';
}
