//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
/*
EFW framework (ErnstisFrameWork)
Version 0.11
It's not recommend to use this Framework with it's loose documentation.
By now its just in bild and only for private intersts in programming around.
But maybe you'll find some interesting lines...or not..;)
*/
{//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
	
	//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
	//EFW general vars
	{//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
		var EFW = {};
		EFW.dBug									= "";
		EFW.buffer									= "";
		EFW.fi										= "";
		EFW.fii										= "";
		EFW.fiii									= "";
		EFW.body									= document.getElementsByTagName("body")[0];	

	//EFW general vars
	//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	}
	
	
	//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
	//EFW general functions
	{//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
		EFW.getActualDimensions			= function()	//DRAFT
		{
			var buffer;
			return [(buffer = EFW.dim2num(document.body.clientWidth)) ? buffer : EFW.dim2num(window.innerWidth), (buffer = EFW.dim2num(document.body.clientHeight)) ? buffer : EFW.dim2num(window.innerHeight)];
		}
		
		EFW.dim2num						= function()	//DRAFT
		{
			var dim		= arguments[0];
			var refDim	= arguments[1];
			
			if(typeof(dim) == "string")	if(dim.search(/%/) == -1) if(isNaN(dim = Number(dim.replace(/px/,'').replace(/%/,'').replace(/pt/,'')))) dim = "ROF";	
			return dim;
		}
		
		EFW.getObjVarLen				= function	(/* obj  */)
		//gives length of arguments that are no functions
		{
			var fi;
			var i = 0;
			var obj = arguments[0];
			for(fi in obj)	if(typeof(obj[fi]) != "function") i++;
			return i;
		}

		EFW.getObjMethods				= function	(/* obj  */)
		//gives length of arguments that are no functions
		{
			var fi;
			var buffer = [];
			var obj = arguments[0];
			for(fi in obj)	if(typeof(obj[fi]) == "function") buffer[buffer.length] = fi;
			return buffer;
		}

		EFW.attribute2Object			= function(/* nodeValue */)
		//writes all attributes of an attributeNode in css synthax into an object..
		{
			var attributeKnodeValue	= arguments[0];
			var attributes;
			var attributeValue;
			var fi;
			var obj					= {};
			
			attributes =	attributeKnodeValue.replace(/\s/g,"").split(";");
		
			if(attributes.length < 1) return false;		//exit  function if there are no attributes in this node..
			else
			{
				for(fi in attributes)
				{
					if(!!(attributes[fi] = attributes[fi].replace(/\s/g,"")))						//filter the generated last field if there was a semicolon at the end of the attribute knode
					{
						attributeValue = attributes[fi].split(":");
						if(attributeValue.length > 1)	obj[attributeValue[0]] = attributeValue[1].split(",");
						else obj[attributeValue[0]] = [true];
					}
				}
			}
		
			return obj;
		}

		EFW.attributeArray2Object			= function(/* nodeValue */)
		//writes array of attribues values 2 object like [array[0] = true, array[0] = true...] --> better access for getting set parameters
		{
			var arrayIn = arguments[0];
			var i;
			var obj = [];
			for(i=0; i<arrayIn.length; i++)	
			{
				if(arrayIn[i].replace) arrayIn[i] = arrayIn[i].replace(/\s/g, "");
				if(arrayIn[i]) obj[arrayIn[i]] = true;
			}
			return obj;
		}
		
		EFW.getElementsWithAttribute	= function(/*[attribute < !attribute -> "jStyle" >], [obj < !obj -> body >]*/)
		//goes down the hierarchy and returns an array of all elements with a certain attribute, links the corresponding nodes as parent and child
		{
			var attribute		= (arguments[0])	? arguments[0] : "jStyle";
			var obj				= (arguments[1]) 	? arguments[1]	: EFW.body;
			var fi;
			var i,ii;
			var elementsWithAttribute =[];
			var buffer;
			var capitilicedAttribute = attribute.slice(0,1).toUpperCase()+attribute.slice(1);
			var attributeBuffer;
			
			if(obj.tagName)
			{		
				if(obj.getAttribute && obj.getAttribute(attribute))
				{
					elementsWithAttribute[elementsWithAttribute.length] = obj;		
					obj["is"+capitilicedAttribute+"Element"] = true; 
					
					//WRITE ATTRIBUTES TO OBJECT
					//attributes need to be buffert because the IE wirtes objects directly to the tags
					//thats why getAttribute() returns an object and not a string as firefox does -> therfore the if/else
					{
						attributeBuffer = obj.getAttribute(attribute);
						obj[attribute] = {};
						if(typeof(attributeBuffer) == "string") obj[attribute].params = EFW.attribute2Object(attributeBuffer);	
						else obj[attribute].params = attributeBuffer;
					}
					
					if(EFW[attribute] && EFW[attribute].methods && EFW[attribute].methods.toElement) EFW[attribute].methods.toElement(obj);
				}
				

				
				obj[attribute+"ChildNodes"] = [];
				
				for(i=0; i< obj.childNodes.length; i++)
				{	
					if(!!(buffer = EFW.getElementsWithAttribute(attribute,obj.childNodes[i],obj)))	for(fi in buffer) if(buffer[fi])	elementsWithAttribute[elementsWithAttribute.length] = buffer[fi];

					if(!!obj.childNodes[i]["is"+capitilicedAttribute+"Element"])
					{
						obj[attribute+"ChildNodes"][obj[attribute+"ChildNodes"].length] = obj.childNodes[i];
						obj.childNodes[i][attribute+"ParentNode"] = obj;			
					}
					else for(ii=0; ii<obj.childNodes[i].childNodes; ii++) obj[attribute+"ChildNodes"][obj[attribute+"ChildNodes"].length] = obj.childNodes[i].childNodes[ii]; //skip hirarchy level if next child is not element of attribute
				}
				//elementsWithAttribute
				obj[attribute+"Elements"] = elementsWithAttribute;
			}
			
			return (elementsWithAttribute) ? elementsWithAttribute : false;
		}
		
		EFW.DOMID = function()
		{
				return document.getElementById(arguments[0]);
		}

	//general functions
	//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	}

	
	//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
	//EFW jStyle
	{//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
		
		EFW.jStyle								= {};
		
		{ EFW.jStyle.params						= {};		
			EFW.jStyle.params.resizeCoefficients	= [1,1]
			EFW.jStyle.params.resize				= {height:1, width:0, left:0, right:0, top:1, bottom:1, fontSize:1}; //0:depending on horizontal resize, //1:depending on horizontal resize
		}
		
		{ EFW.jStyle.methods					= {};
			
			EFW.jStyle.methods.resize			= function()
			{
				var fi, fii;
				var dim;
				var actualDims;
				actualDims					= EFW.getActualDimensions();

				EFW.jStyle.params.resizeCoefficients		= [actualDims[0]/EFW.jStyle.params.dimensionsOnStart[0], actualDims[1]/EFW.jStyle.params.dimensionsOnStart[1]]
				if(EFW.body.jStyle.methods.resize) EFW.body.jStyle.methods.resize();
			}
		

			EFW.jStyle.methods.toElement		= function()
			{
				var element		= arguments[0];
				var buffer;
				
				if(!element.jStyle.methods) element.jStyle.methods = {};
				
				element.jStyle.methods.display		= function()
				{
					var fi;	
					var params	= arguments;
					
					if(arguments.length == 0) if(!(params = element.jStyle.params.display)) params = [];
					
					
					
					switch(params[0])
					{					
						case "none":			element.style.display = "none";	break;
						case "inline-block":	element.style.display = "inline-block";	break;	
						case "inline":			element.style.display = "inline";	break;
						case "toggle":
						case "toggleIb":	(element.style.display == "inline-block") ? element.style.display = "none" : element.style.display = "inline-block"; break;					
						case "toggleI":		(element.style.display == "inline-block") ? element.style.display = "none" : element.style.display = "inline-block"; break;					
					}
				
					return element.style.display;
				}
				
				if(element.jStyle.params.resize)//resize --> configuration of attributes
				{	
					//alert(element.id);
					buffer = element.jStyle.params.resize;
					element.jStyle.params.resize = {};
					element.jStyle.params.resize.params = {};
					
					if(!((buffer.length == 1) && (buffer[0] == true))) element.jStyle.params.resize.params = EFW.attributeArray2Object(buffer);
				}
				
				element.jStyle.methods.resize		= function()
				{
					var fi,fii, buffer, buffer2, dim;					
					var params		= element.jStyle.params.resize.params;
					var ratio;
					var resizeCoefficients;
					var resizeCoefficientsOut;
					var keepRatio = false;
					var prot;
					
					if(element.id == "HTML_galeryMenueTop") prot = true;
					
					if(params.block) keepRatio = true;
					
					if(!(resizeCoefficients = arguments[0])) resizeCoefficients = EFW.jStyle.params.resizeCoefficients;						
					resizeCoefficientsOut = resizeCoefficients;					
					
					
					if(params.free) resizeCoefficients = EFW.jStyle.params.resizeCoefficients;
	
					if(element.jStyle.params.dim) // get ratio of element if possibe, dimentions must be given in jStyle attributeNode, if there is only one dimension given the element is a square
					{
						if(element.jStyle.params.dim.length == 1) element.jStyle.params.dim[1] = element.jStyle.params.dim[0];
						ratio = element.jStyle.params.dim[0]/element.jStyle.params.dim[1];
					}
										
					if((element.jStyle.params.resize.params.keepRatio || keepRatio) && ratio) //calculate CSS width and height of object from dimensions and ratio
					{
						if(element.style.width && !element.style.height)		element.style.height	= EFW.dim2num(element.style.width)/ratio+"px";
						else if(!element.style.width && element.style.height)	element.style.width		= EFW.dim2num(element.style.height)*ratio+"px";
					}
					

					
					for(fii in EFW.jStyle.params.resize)
					{	
						buffer = EFW.jStyle.params.resize[fii];														
					
						if(element.style[fii])
						{
							if(!element.jStyle.params[fii+"OnStart"]) element.jStyle.params[fii+"OnStart"] = EFW.dim2num(element.style[fii]); // get elementsize on startup
							if(element.jStyle.params[fii+"OnStart"] != "ROF") element.style[fii] = element.jStyle.params[fii+"OnStart"]*resizeCoefficients[buffer]+"px"; //compute resized dimensions									
						}
					}
					
					if(element.jStyle.params.maxWidth && ((buffer =EFW.dim2num(element.style.width)) != "ROF") && (buffer > element.jStyle.params.maxWidth)) element.style.width = element.jStyle.params.maxWidth+"px";
					if(element.jStyle.params.maxHeight && ((buffer =EFW.dim2num(element.style.height)) != "ROF")  && (buffer > element.jStyle.params.maxHeight)) element.style.height = element.jStyle.params.maxHeight+"px";
					
					
					if(ratio && params.dimIsMax)
					{
						if(((buffer = EFW.dim2num(element.style.width)) != "ROF") && ((buffer2 = EFW.dim2num(element.style.height)) != "ROF"))
						{
							if(buffer > element.jStyle.params.dim[0])	element.style.width		= element.jStyle.params.dim[0]+"px";
							if(buffer2 > element.jStyle.params.dim[1])	element.style.height	= element.jStyle.params.dim[1]+"px";							
						}						
					}
					
					if(element.jStyle.params.minWidth && ((buffer =EFW.dim2num(element.style.width)) != "ROF")  && (buffer < element.jStyle.params.minWidth)) element.style.width = element.jStyle.params.minWidth+"px";
					if(element.jStyle.params.minHeight && ((buffer =EFW.dim2num(element.style.height)) != "ROF")  && (buffer < element.jStyle.params.minHeight)) element.style.height = element.jStyle.params.minHeight+"px";
					
					
					
					if((params.keepRatio || keepRatio) && ratio)
					{
					
						if(((buffer =EFW.dim2num(element.style.width)/ratio) != "ROF") && !element.jStyle.params.minHeight && (buffer <EFW.dim2num(element.style.height))) element.style.height = buffer;
						else if((buffer =EFW.dim2num(element.style.height)) != "ROF") element.style.width = buffer * ratio;
						
						if(element.jStyle.params.minWidth && ((buffer = EFW.dim2num(element.style.width)) != "ROF") && (element.jStyle.params.minWidth > buffer))
						{
							element.style.width		= element.jStyle.params.minWidth+"px";
							element.style.height = (element.jStyle.params.minWidth/ratio)+"px";
						}
					}
					
					if(params.block) resizeCoefficientsOut = [(EFW.dim2num(element.style.width)/EFW.dim2num(element.jStyle.params.widthOnStart)), (EFW.dim2num(EFW.dim2num(element.style.height)/EFW.dim2num(element.jStyle.params.heightOnStart)))];
					
					
					for(fi in EFW.jStyle.params.resize)
					{	
						buffer = EFW.jStyle.params.resize[fi];
						if(element.style[fi] && (fi != "width")  && (fi != "height"))	if(element.jStyle.params[fi+"OnStart"] != "ROF") element.style[fi] = element.jStyle.params[fi+"OnStart"]*resizeCoefficientsOut[buffer]+"px"; //compute resized dimensions									
					}
					
					for(fi in element.jStyleChildNodes) if(element.jStyleChildNodes[fi].jStyle.params.resize) element.jStyleChildNodes[fi].jStyle.methods.resize(resizeCoefficientsOut);
				}
					
				
				element.jStyle.methods.width		=  function() {element.jStyle.methods.put2CSS("width")};
				element.jStyle.methods.height		=  function() {element.jStyle.methods.put2CSS("height")};
				
				element.jStyle.methods.put2CSS		= function()
				{
					var attribute = arguments[0];					
					if(attribute && element.jStyle.params[attribute]) element.style[attribute] =  element.jStyle.params[attribute][0];
				}
				
			}

			EFW.jStyle.methods.startUp			= function()
			{
				var buffer;
				var fi, fii;
				
				EFW.jStyle.params.dimensions			= [(EFW.buffer = EFW.dim2num(EFW.body.style.width)) ? EFW.buffer : EFW.getActualDimensions()[0], (EFW.buffer = EFW.dim2num(EFW.body.style.height)) ? EFW.buffer : EFW.getActualDimensions()[1]];
				EFW.jStyle.params.dimensionsOnStart		= EFW.jStyle.params.dimensions;
				
				window.onresize							= EFW.jStyle.methods.resize;
				EFW.getElementsWithAttribute();
				
				buffer ="";
				if(EFW.body.jStyle)
				{
					for(fi in EFW.body.jStyle.params) buffer += fi+", ";
				
					window.onresize();
					for(fi in EFW.body.jStyleElements)	for(fii in EFW.body.jStyleElements[fi].jStyle.methods) EFW.body.jStyleElements[fi].jStyle.methods[fii]();
				}
			}
		}
	
	//EFW jStyle
	//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	}
	
	
//EFW framework
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}


//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//EFW startUp deklarations
{//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

	EFW.jStyle.methods.startUp();

////EFW startUp deklarations
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}

//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//runtime deklarations
{//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

/*
//GET ALL jStyleS
EFW.dBug = '';
EFW.buffer = EFW.body.jStyleElements;
for(fi in EFW.buffer)
{
	EFW.dBug += EFW.buffer[fi]+"\n";
	for(fii in EFW.buffer[fi].jStyle)
	{
		EFW.dBug += "\t"+EFW.buffer[fi]+"."+"jStyle."+fii+" =\t"+EFW.buffer[fi].jStyle[fii]+";\n";
	}
}
alert(EFW.dBug);
*/

//runtime deklarations
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}


//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
//2DO
{//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
/*

	- resize topDown?
	

*/
//2DO
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}

