var Selection =(function(){
	//Private Methoden und Eigenschaften
	var outputContainer = "";
	
	var selectionCache = {};
	var getIdNode = function (selection,element){
		if(element){
			element.getElementById(selection)
		}else{
			var output = document.getElementById(selection);
		}
		return output;
	}
	var getTagNodes = function(element,selection){
		if(element!=null){
			var output = element.getElementsByTagName(selection);
		}else{
			//alert(element +  " - " +selection);
		}
		return output;
	}
	//Öffentliche Methoden und Eigenschaften
	return {
		get :  function(selection, optionalElement){ //Gibt ein Array mit Objekten zurueck
				var  subSelection="";
				var  i=0;
				var output= [];
				var elements =[];
				var newElements = [];
				if(optionalElement==null){
					elements[0]=document.getElementsByTagName('html')[0];
				}else{
					elements[0]=optionalElement;
				}
				do{
					selectedChar = selection.charAt(i);
					if(subSelection!=""){
						if(	selectedChar == "." ||
							selectedChar == "#" ||
							selectedChar == " " ||
							selectedChar == "[" ||
							i==selection.length
						){
							delete newElements;
							newElements = [];
					jumpOut :	for(var x=0; x<elements.length;x++){
								if(subSelection.charAt(0)=="."){
									outputContainer = [];
									getClassNodes(elements[x], subSelection.substr(1, subSelection.length));
									classNodes  = outputContainer;
									try{
										outputContainer = [];
										if(classNodes.length<1){
											getSingelClass(elements[x], subSelection.substr(1, subSelection.length));
											classNodes  = outputContainer;
											outputContainer = [];
										}
										for(y=0;y<classNodes.length; y++){
											newElements[newElements.length] =classNodes[y];
										}
									}catch(e){
										////console.log("FEHLER: " +  e );
									}
								}else if(subSelection.charAt(0)=="["){
									try{
										_getAttributeNodes(elements[x],subSelection.substr(1, subSelection.length));
										attributeNodes  = [];
										outputContainer = [];
										if(attributeNodes.length<1){
											_getSingelAttribute(elements[x],subSelection.substr(1, subSelection.length));
											attributeNodes  = outputContainer;
											outputContainer = [];
										}
										for(y=0;y<attributeNodes.length; y++){
											newElements[newElements.length] =attributeNodes[y];
										}
										//i++;
									}catch(e){
										////console.log("FEHLER: " +  e );
									}
								}else if(subSelection.charAt(0)=="#"){
									result = getIdNode(subSelection.substr(1, subSelection.length));
									if(result){
										newElements[newElements.length] = result;
									}
									break jumpOut;
								}else{
									tagNodes = getTagNodes(elements[x],subSelection);
									if(tagNodes){
										for(y=0;y<tagNodes.length; y++){
											newElements[newElements.length] = tagNodes[y];
										}
									}else{
										////console.log("Selection nicht gefunden", "Die Methode get konnte die Selektion "+subSelection+" nicht finde", "Selection");
									}
								}
							}
							elements = newElements;
							subSelection = "";
						}
					}
					if(selectedChar!=" "){
						subSelection+=selectedChar;
					}
					i++;
				}while(i<=selection.length);
				output = newElements;
				
			return output;
		}
	}
})();
