﻿/*

	v1.0.0, 09.08.2009, dogan

	©2009 Tanyel Dogan, alle Rechte vorbehalten

	allgemeine Crossbrowser Funktionen
*/

if(! Cms4d)
{
	var Cms4d = {
		CtrlCounter:0
		,UniqueId:function()
		{
			this.CtrlCounter++;
			return(this.CtrlCounter);
		}
	};
}

//Dieses Objekt dient als Puffer zu Sammlung und Gruppierung von Elementen
if(! Cms4d.ElementBuffer)
{
	Cms4d.ElementBuffer = function()
	{
		this.all = new Array();
		this.tags = new Object();
		this.AddElement = function(mynode)
		{
			var nn = mynode.nodeName.toLowerCase();
			this.all.push(mynode);
			if(! this.tags[nn])
			{
				this.tags[nn] = new Array();
			}
			this.tags[nn].push(mynode);
		}
		this.GetTags = function(nn)
		{
			var r = new Array();
			if(this.tags[nn])
			{
				r = this.tags[nn];
			}
			return(r);
		}
		this.GetTagsByClassName = function(nn, cn)
		{
			var r = new Array();
			var a = this.GetTags(nn);
			for(var i = 0; i < a.length; i++)
			{
				var mynode = a[i];
				if(mynode.className.indexOf(cn) != -1)r.push(mynode);
			}
			return(r);
		}
		this.toString = function()
		{
			var t = '';
			t += 'all: ' + this.all.length + '\n';
			t += 'tags:\n';
			for(var i in this.tags)
			{
				var a = this.tags[i];
				t += '\t' + i + ': ' + a.length + '\n';
			}
			return(t);
		}
	}
}
//Allgemeine Funktionen zum Sammlen und Filtern von Elementen im DOM
if(! Cms4d.GetElements)
{
	//Funktion parst alle Elemente unterhalb eines Startelements
	Cms4d.GetElements = function(pnode, lmax)
	{
		//Für bestimmte Zwecke reicht es aus nur bis zu einer bestimmten Tiefe nach Elementen zu suchen.
		if(lmax == undefined)lmax = 128;
		var elms = new Cms4d.ElementBuffer();
		this.GetElements_recurs(pnode, elms, 0, lmax);
		return(elms);
	}
	Cms4d.GetElements_recurs = function(pnode, elms, lcounter, lmax)
	{
		lcounter++;
		var cnodes = pnode.childNodes;
		for(var i = 0; i < cnodes.length; i++)
		{
			var cnode = cnodes[i];
			if(cnode.nodeType == 1)
			{
				elms.AddElement(cnode);
				//REKURSION
				//BEACHTE: lcounter beginnt für den ersten Funktionsaufruf bei 0. Deshalb ist
				//nach lmax-1 Durchläufen auch lcounter==lmax.
				if(lcounter < lmax)
				{
					this.GetElements_recurs(cnode, elms, lcounter, lmax);
				}
			}
		}
		lcounter--;
	}
}


