/******************************************************
* ingodesign.de 
* [basicLib1.js] allgemeinen funktionen
* tipps zu JS am seitenende
* © 2007 by Ingo Szabo-Reiss  
*******************************************************/



/*****************************************************

DEBUGGING JAVASCRIPT MIT URL-ZEILE ALS JAVASCRIPT CONSOLE:

z.B. Wenn im ich die bildbreite eines geladenen image-Obekt in der seite ¸berpr¸fen will:

javascript:alert(im.width)

********************************************************/
















/*****************************************************
             MEINE WERKZEUGE (KLASSE)
******************************************************/
_ingoUtilClass = function() {
 
	/* 
	REGEX FUNKTIONEN 
	***************************/
	this.rgxRemoveWhiteLead = function(myString) {
		// entferne anfangsleerzeichen 
 		return myString.replace(/^\s+/, ""); 
 	}
	this.rgxRemoveWhiteTrail = function(myString) {
		// entferne endleerzeichen  
		return myString.replace(/\s+$/, "");   
	}
	
	// MAKE GIVEN WORDS BOLD IN A GIVEN TEXT  
	// par 1: text - der text in dem die fettzumachenden woerter liegen
	// par 2, 3,...,n: das wort das fett werden soll
	this.boldText = function(text) {
		var boldedText;
		var boldedText = new Array();
		boldedText.push(text);
		//
		if(arguments.length>1){
		  for(var i=1; i<arguments.length; i++){
		  	var replacetext = arguments[i];
			var replaceRgx = new RegExp(replacetext, "g");
 		    var replacement = "<b>"+replacetext+"</b>";
 			var bolded =  boldedText[i-1].replace(replaceRgx,replacement);
			boldedText.push(bolded);
		  }
		}
		return boldedText[arguments.length-1];		
	}
		
	
	/* 
	NODE TREE AENDERUNGEN 
	***************************/
	
	this.insertNodeAsLastChild = function(zielparent, tag) {
	  var zp = zielparent.appendChild(tag);
	  return zp;
	}
 	this.insertNodeAsFirstChild = function(zielparent, tag) {
	  var zp = zielparent.insertBefore(tag, zielparent.childNodes[0]);
	  return zp;
	}
  	this.insertNodeAtPosition = function(zielparent, pos) {
	  var zp = zielparent.insertBefore(tag, zielparent.childNodes[pos+1]);
	  return zp;
	}
  	this.replaceChildInTag = function(tag, newChild, oldChild) {
	  var t = tag.replaceChild(newChild, oldChild);
 	  return t;
	}
	this.deleteNodeBetweenChildren = function (theElement, nodeType) {
	  var elem = theElement;
	  var type = nodeType;
	  if(elem.hasChildNodes())  var elemChildren = elem.childNodes;
 	  for( var i=0; i< elemChildren.length; i++) {
	    var child = elemChildren[i];
	    if(child.nodeType==type) {
	      elem.removeChild(child);
	    }
	  }
	  return elem;
	}
	

	/* 
	NEUE ATTRIBUTE IN HTML-ELEMENT 
	******************************/
	this.createAttributesInTag = function () { 
		// ---------------------------------------------------
		// (zielTag, attrName1, attrVal1, attrName2, attrVal2, usw.)  
		// --------------------------------------------------- 
		var args = arguments; 
		var zieltag = args[0]; 
		for(var i=1; i<args.length; i+=2) {
			var attrname = args[i];
			var attrval = args[i+1];

	 		/* attribut erstellung kompliziert:
			***********************************/ 
			//var attr = document.createAttribute(attrname); 
			//attr.nodeValue = attvral; 
			//zieltag.setAttributeNode(attr); 
		 
			/* attribut erstellung knackig kurz: 
			***********************************/
			zieltag[attrname] = attrval;
	   	}
		return zieltag;
	}


	/* 
	 FINDE EVENT SOURCE (CROSSBROWSER) 
	**********************************/
	this.findEvtSrc = function (e, identification) {
	  // ------------------------------------------
	  // ACHTUNG! identification muss ein 1wort-regex sein
	  // also in der form /^regex$/ uebergeben werden!
	  // ------------------------------------------
	  var evt, eSrc, eSrcName = identification; 
	  e?evt=e:evt=window.event; 
	  eSrc=evt.target?evt.target:evt.srcElement;
 	  while (eSrc.nodeType != 1) eSrc = eSrc.parentNode; 
	  //
	  // finde den tag dessen classname oder id dem
	  // regex ausdruck eSrcName entspricht, wenn
	  // ein solcher ausdruck vorgegeben wird
	 // alert(eSrc.parentNode);
	  //alert(!(eSrc.className == eSrcName || eSrc.id == eSrcName));
	if(eSrcName) 
 		while ( !( eSrc.className.match(eSrcName)   ||  eSrc.id.match(eSrcName) ) ) 
		eSrc = eSrc.parentNode;	
		//alert("eSrc="+eSrc);
 	  return eSrc;
	}
	

 	/* 
	 FINDE OBJEKT (CROSSBROWSER) 
	**********************************/
	this.findObject = function (id, doc) {
	  var d = (doc? doc: window.document);  
	  var theObj = (d.all)?d.all[id]:((d.layers)?d.layers[id]:d.getElementById(id));
  	  return theObj;
	}


	/* 
	 FINDE <TAG> IN ELEMENT
	**********************************/
	this.findTagIn = function (elementName) {
	  var elem = elementName, theChild; 
	  if (elem.hasChildNodes()) theChild = elem.childNodes[0];
	  while(theChild.nodeType!=1) theChild = theChild.nextSibling; 
	  return theChild;
	}


	/* 
	FINDE BESTIMMTE ELEMENTE, ODER ALLE ELEMENTE UEBER IHREN KLASSENANEN
	von dustin diaz, gesehen im jquery blog von john edwards: http://ejohn.org/blog/tags/xpath/.
	erklaerung: 
	es wird im gewuenschten document (node  - default: aktuelles document)
	alle tags einer bestimmten art (tag - default: alle tags) mit regex
	nach dem klassennamen gesucht und bei regex-treffer werden die entsprechenden
	elemente in einem array gesammelt, das dann ausgegeben wird.
	*********************************************************************/
	this.getElementsByClass = function(searchClass,node,tag) {
		
        var classElements = new Array();
        if ( node == null ) 
			node = document;
        if ( tag == null ) 
			tag = '*'; 
        var els = node.getElementsByTagName(tag);
        var elsLen = els.length;
        var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
        for (i = 0, j = 0; i < elsLen; i++) {
                if ( pattern.test(els[i].className) ) {
                        classElements[j] = els[i];
                        j++;
                }
        }
        return classElements;
	}
	


	/* 
	 FINDE DOKUMENT-NAME (ohne hash/ url-vars) ODER DOKUMENT PFAD AUS URL.
	 [hash und url-vars duerfen keine slashes enthalten]
	*********************************************************************/
	this.findDocName = function (inThisWindow, basisString){ 
	  var theURL, lastSlash, pageName, ausgabe;
	  // pruefe gueltigkeit des fensters, bei ungueltigkeit nutze das aktuelle fenster
	  var win = (inThisWindow ? ((inThisWindow.toString() == "[object Window]")? inThisWindow : window) : window);
	  theURL = win.location.toString();
 	  theURL = this.removeHash(theURL);
          theURL = this.removeURLVars(theURL); 
	  lastSlash = theURL.lastIndexOf("/");
	  pageName = theURL.substr(lastSlash+1);
 	  basisString ? ausgabe = theURL : ausgabe = pageName;
	  return ausgabe;
	}

	/* 
	 ENTFERNE ALLES NACH HASH #(INKL) IM STRING
	**********************************/
	this.removeHash = function (inString){
	  var str = inString;
	  var theHash = str.indexOf("#");
	  if (theHash!=-1)  str = str.substring(0, theHash);
	  return str;
	}

	/* 
	 ENTFERNE URL VARIABLEN
	**********************************/
	this.removeURLVars = function (URLString){
	  var theUrl = URLString;
	  var theSearch = theUrl.indexOf("?");
	  if(theSearch!=-1) theUrl = theUrl.substring(0, theSearch);
 	  return theUrl;
	}

	/* 
	 FINDE EIN VARIABLENWERT IM URL
	**********************************/
	this.getURLVarValue = function (varname, urlToCheck){	
 	  var vn=varname;
	  var varvalue;
	  // pruefe gueltigkeit des fensters, bei ungueltigkeit nutze das aktuelle fenster
	  var theUrl = (urlToCheck ? ((urlToCheck.toString() == "[object Window]")? urlToCheck : window) : window);
 	  // finde variablenstring (inkl. "?")
	  if(theUrl.location.search!=""){
	    // entferne das "?" draus variablenstring
 	    var vars = theUrl.location.search.substring(1);
	    // erstelle array mit den namen-wert paaren
	    var varsArr = vars.split("&");  
	    // find gewuenschten namen werte paar im array
	    for(var i=0; i<varsArr.length; i++){
	      var varpair = varsArr[i].split("=");
	      if(varpair[0] == vn){
	        varvalue = varpair[1]; 
	      }
	    }
	  }
 	  return varvalue;
	}

	/* 
	 SHOW ELEMENT(S) (DISPLAY="BLOCK")
	**********************************/
	this.show = function() {
	  var args = arguments;
	  for(var i=0; i<args.length; i++) {
	    var elem = this.findObject(args[i]);
	    elem.style.display = "block";
	    looseFocus(elem);  
	  }
	}

	/* 
	 HIDE ELEMENT(S) (DISPLAY="NONE")
	**********************************/
	this.hide = function() {
	  var args = arguments;
	  for(var i=0; i<args.length; i++) {
	    var elem = this.findObject(args[i]);
	    // nur bei gueltigem element...
	    // diese bedingung erlaubt mir auch
	    // beliebige werte als param zu uebergeben 
	    // ohne daß die funktion dann abbricht.
	    if(elem) elem.style.display = "none";
	    looseFocus(elem);  
	  }
	}

	/* 
	 SHOW/HIDE SCHALTER 
	 jeder klick schaltet ein element ein bzw. aus
	**********************************/
	this.showHide = function(id) {
 	  var elem = this.findObject(id);
	  elem.style.display = ((elem.style.display!="block")?"block":"none");
	  looseFocus(elem); 
	}

	/* 
	 SET LAYOUT FOR ELEMENT(S) - params: (id1, id2..., CSSClassname)
	**********************************/
	this.setLayout = function(){
	  var args = arguments;  
	  var CSSClss = arguments[arguments.length-1];
	  for(var i=0; i<args.length-1; i++) {
	    var elem = this.findObject(args[i]);
	    elem.className = CSSClss;
	  }
	}



	/* 
	FIND IF ELEM (s) IS CHILD OF ANOTHER ELEM (d)
	**********************************/
	this.isChild = function (s,d) {
	  while(s) {
	    if (s==d) return true;
	    s=s.parentNode;
	  }
	  return false;
	}

	
	
   /*
	SCHREIBE DAS JAHR - OBJEKT METHODE -
	in ein element mit id-wert wie der erste parameters.
	ohne doc-angabe wird im aktuellen document nach dem
	element gesucht, mit doc-angabe eben in dem angegebenen document.
	***************************************************************/
	this.writeYear = function(objID, doc) { 
 	  if(!objID) return;
	  var id = objID;
	  var d = (doc? doc: window.document); 
	  var theObj = (d.all)?d.all[id]:((d.layers)?d.layers[id]:d.getElementById(id));
	  if(!theObj) return;
	  var y= new Date().getFullYear();
	  theObj.innerHTML = " "+y;
 	}

	
	
	 /*
	SCHREIBE DAS UPDATE - OBJEKT METHODE -
	****************************************/
 	this.writeUpdate = function(objID, doc, updateText){
		if(!objID) return;
		var id = objID;
		var theObj = _ingoUtils.findObject(id);
		if(!theObj) return;
		theObj.innerHTML = updateText?updateText:"Last update: 11 May 2008";
	}


	/*
	SCHREIBE DAS DATUM UND DIE UHRZEIT - OBJEKT METHODE -
	*****************************************************/
	this.writeDate = function(objID, doc) {
		//clearInterval(window.writeDateItvl);
		if(!objID) return;
		var id = objID;
		var theObj = _ingoUtils.findObject(id);
		if(!theObj) return;
		var date= new Date();
		var day = date.getDate();
		var month = date.getMonth(); // jan=0
		month++; 
		/**/
		switch(month) {
			case 1: 
			month="Jan"; 
			break;
			case 2: 
			month="Feb"; 
			break;
			case 3: 
			month="Mar"; 
			break;
			case 4: 
			month="Apr"; 
			break;
			case 5: 
			month="May"; 
			break;
			case 6: 
			month="Jun"; 
			break;
			case 7: 
			month="Jul"; 
			break;
			case 8: 
			month="Aug"; 
			break;
			case 9: 
			month="Sep"; 
			break;
			case 10: 
			month="Oct"; 
			break;
			case 11: 
			month="Nov"; 
			break; 
			case 12: 
			month="Dec"; 
			break;
		}
		
 		var year = date.getFullYear(); 
		var hrs = date.getHours();
		if(hrs<10)hrs="0"+hrs;
		var mins = date.getMinutes();
		if(mins<10)mins="0"+mins;
		var secs = date.getSeconds();
		if(secs<10)secs="0"+secs;
		theObj.innerHTML = day + " " + month + " " + year + " | " +hrs+":"+mins+":"+secs+"<!-- | -->";
		//
		// ACHTUNG! hier beim aufruf der funktion genau den namen
		// meines beim init erstellten _ingoUtilsClass - Objekts angeben! z.B. _ingoUtils
 		setTimeout("_ingoUtils.writeDate('datum')", 1000) ;
	}
	
	
	
	
	/* 
	 LOOSE FOCUS - KLASSENINTERNE METHODE
	 solves Firefox retain-focus bug
	**********************************/
 	function looseFocus(elem) {
	  elem.blur();
	}	



}





/*****************************************************

            * STRING OBJEKT ERWEITERN *
			 
******************************************************/
// String.reversed() - text rueckwaerts ausgeben
String.prototype.reversed = function (){
	// VARIANTE 1
	// wenn split("") nicht korrekt funzen sollte - z.B. in Actionscript ?!
	/*
	var result = "";
	for(var i=0; i<=this.length; i++) result+= this.substring(this.length-i, this.length-i+1); 
	return result;
	*/
	// -----
	// VARIANTE 2 - die elegante
	return this.split("").reverse().join("");
}
// String.substringreversed() - substringtext rueckwaerts ausgeben
String.prototype.substringreversed = function (a, b) {
	return this.substring(a,b).reversed();
}


 


/***************************************************** 

  		   * SCROLL TEXT IN STATUS BAR * 
     diese funktion mit window.onload aufrufen
		   
 ******************************************************/
 
var Text = "+++ Suchen Sie nicht nur irgendeinen Illustrator sondern den Profi? Sie haben ihn gefunden.  +++ ";  
var Textspeed = 50;         
var Width = 150;             
var TextLength = Text.length;
var Position = 1 - Width;

function StatusLineText() { 
	Position++;
	var Textstate="";
	if (Position == TextLength) {
		Position = 1 - Width;
	}
	if (Position < 0)  {
		for (var PosCount=1; PosCount <= Math.abs(Position); PosCount++)   {
			Textstate = Textstate + " ";
		};
		Textstate = Textstate + Text.substring(0, Width - PosCount + 1);
	} else {
		Textstate = Textstate + Text.substring(Position, Width + Position);
	}
	window.status = Textstate;
	setTimeout("StatusLineText()",Textspeed);
}






/***************************************************** 

  * TEXTTICKER-TYPEWRITEEFFEKT MIT "_" VOR BUCHSTABEN *
 dies an  ort und stelle in HTML rein wo es erscheinen soll

******************************************************/
var max=0; 
function textlist() { 
	max=textlist.arguments.length; 
	for (i=0; i<max; i++) 
	  this[i]=textlist.arguments[i]; 
} 
tl=new textlist ( "Place your message here !" ); 
var x=0; 
pos=0; 
var l=tl[0].length; 
function textticker() {
	document.tickform.tickfield.value=tl[x].substring(0,pos)+"_"; 
	if(pos++==l) { 
	  pos=0; 
	  setTimeout("textticker()",1000); 
	  x++; 
	  if(x==max) 
	    x=0; 
	  l=tl[x].length; 
	} else 
	  setTimeout("textticker()",50); 
}

































 
