var _AjaxElements = Class.create( {

	initialize:function( jsonElements ){
		this.json = null;
		if( isSet( jsonElements ) ){
			this.url = jsonElements.url;
			this.parametres = isSet( jsonElements.parametres ) ? jsonElements.parametres : '';
			this.XML = isSet( jsonElements.XML ) ? true : false;
			this.elementXML = null;
			this.myMethod = jsonElements.myMethod;
			this.myClass = isSet( jsonElements.myClass ) ? jsonElements.myClass : null;
			this.resultat = isSet( jsonElements.resultat ) ? jsonElements.resultat : 'XML';
		}
	},
	
	setJson:function( json , parametres ){
		this.json = json;
		this.parametres = parametres;
	},

	getAjaxInformations:function(){
		 new Ajax.Request( this.url , {
			method: 'post',
			parameters:this.parametres,
			myMethod:this.myMethod,
			myClass:this.myClass,
			onComplete:function( transport ){
			 	myClass = eval( transport.request.options.myClass );
		 		if( this.resultat == 'XML' )
		 			myClass.setJson ( this.makeItJson( transport ) , this.parametres );
		 		else
		 			myClass.setJson( transport.responseText , this.parametres );
		 		try{
		 			eval( 'myClass.'+transport.request.options.myMethod );
		 		}catch(e){
		 			eval( transport.request.options.myMethod );
		 		}
		 		
		 	}.bind(this)
		});
	},

	makeItJson:function( transport ){
		XML = transport.responseXML;
		if( isNull( XML ) || isNull( XML.childNodes[0] ) ){
			return json = null;
		}
		var firstChild = XML.childNodes[0];
		var json = new Object();
		var pl = 0;
		var cnt = 0;
		var rememberMain = new Array();
		var remember = new Array();
		var testTab = new Array();
		var testTab2 = new Array();
		var toReturn = new Array();
		var objValues = new Object();
		
		while( firstChild.childNodes.length == 0 ){
			firstChild = XML.childNodes[pl];
			pl++;
		}
				
		var countFirst = firstChild.childNodes.length;
		
		for( var i = 0 ; i < countFirst ; i++ ){
			var nodeName = countFirst == 1 ? firstChild.nodeName : firstChild.childNodes[i].nodeName;
			//var poids = XML.getElementsByTagName(nodeName).length;
			var nodeItSelf = countFirst == 1 ? firstChild : firstChild.childNodes[i];
			json[nodeName] = new Object();

			/*if( poids == 1 && nodeItSelf.hasChildNodes() ){
				var countSub = nodeItSelf.childNodes.length;
				if( countSub > 1 || ( countSub.length == 1 && countSub[0].hasChildNodes() ) ){
					var remember2 = new Array();
					testTab = new Array();
					var tabValSub = new Object();
					for( var j = 0 ; j < countSub ; j++ ){
						if( nodeItSelf.childNodes[j].childNodes.length > 0 ){
							if( !remember2.in_array( nodeItSelf.childNodes[j].nodeName ) ){
								remember2.push( nodeItSelf.childNodes[j].nodeName );
								tabValSub[nodeItSelf.childNodes[j].nodeName] = this.createTabJson( nodeName , nodeItSelf.childNodes[j].nodeName , XML , 0 );
							}
						}
					}
					testTab.push( tabValSub );
					json[nodeName] = testTab;
				}else{
					json[nodeName] = nodeItSelf.firstChild.data;
				}
				
			}else{*/
				var countChilds = nodeItSelf.childNodes;
				var rememberSub = new Array();
				
				if( countChilds.length > 1 || ( countChilds.length == 1 && countChilds[0].hasChildNodes() ) ){
					
					if( nodeItSelf.hasChildNodes() ){
						if( !remember.in_array( nodeName ) ){
							cnt = 0;
							testTab2 = new Array();
							var tabValSub = new Object();
							remember.push( nodeName );
						}else{
							cnt++;
						}
					}
					
					var countSub = XML.getElementsByTagName(nodeName)[cnt].childNodes;
					
					for( var m = 0 ; m < countSub.length ; m++ ){
						if( countSub[m].hasChildNodes() ){
							if( XML.getElementsByTagName(nodeName)[cnt].getElementsByTagName(countSub[m].nodeName).length >= 1 ){
								if( !rememberSub.in_array( countSub[m].nodeName ) ){
									rememberSub.push( countSub[m].nodeName );
									var tabRes = this.createTabJson(nodeName , countSub[m].nodeName , XML , cnt );
									tabValSub[countSub[m].nodeName] = tabRes;
									toReturn.push( nodeName );
								}
							}
						}
					}
					
					if( XML.getElementsByTagName(nodeName)[cnt].attributes.length > 0 ){
						for( attr = 0 ; attr < XML.getElementsByTagName(nodeName)[cnt].attributes.length ; attr++ ){
							tabValSub[XML.getElementsByTagName(nodeName)[cnt].attributes[attr].nodeName] = XML.getElementsByTagName(nodeName)[cnt].attributes[attr].nodeValue;
						}
					}
					
					testTab2.push( tabValSub );
					
					json[nodeName] = testTab2;
					tabValSub = new Object();
				}else{
					if( nodeItSelf.hasChildNodes() ){
						if( !rememberMain.in_array( nodeName ) ){
							rememberMain.push( nodeName );
						}
					}
				}
			//}
		}
		
		for ( var l = 0 ; l < rememberMain.length ; l++ ){
			if( toReturn.in_array( rememberMain[l] ) ){
				continue;
			}

			json[rememberMain[l]] = this.createTabJson( rememberMain[l] , null , XML , 0 );
			
		}
		return json;
	},

	createTabJson:function( nodeName , nodeSub , XML , cnt ){
		var json = new Array(); 
		var objValues = new Object();
		var objAttrValues = new Object();
		var remember = new Array();
		var multChilds = new Array();
		if( nodeSub == null ){
			var poids = XML.getElementsByTagName(nodeName).length;
		}else{
			var poids = XML.getElementsByTagName(nodeName)[cnt].getElementsByTagName(nodeSub).length;
		}

		for( var j = 0 ; j < poids ; j++ ){
			if( nodeSub == null ){
				var nodeItSelf = XML.getElementsByTagName(nodeName)[j];
			}else{
				var nodeItSelf = XML.getElementsByTagName(nodeName)[cnt].getElementsByTagName(nodeSub)[j];
			}

			if( nodeItSelf.attributes.length > 0 ){
				for( attr = 0 ; attr < nodeItSelf.attributes.length ; attr++ ){
					objValues[nodeItSelf.attributes[attr].nodeName] = nodeItSelf.attributes[attr].nodeValue;
				}
			}

			for( var k = 0 ; k < nodeItSelf.childNodes.length ; k++ ){
				child = nodeItSelf.childNodes[k].hasChildNodes() ? nodeItSelf.childNodes[k] : false;
				if( nodeItSelf.childNodes.length == 1 && child == false ){
					objValues = null;
					break;
				}
				if( child ){
					countChilds = nodeItSelf.getElementsByTagName( child.nodeName ).length;
					remember = new Array();
					multChilds = new Array();
					if( countChilds > 1 ){
						if( !remember.in_array( child.nodeName ) )
							remember.push( child.nodeName );
						else
							continue;
						
						for( var chi = 0 ; chi < countChilds ; chi++ ){
							multChilds.push( nodeItSelf.getElementsByTagName( child.nodeName )[chi].firstChild.data );
						}
						objValues[child.nodeName] = multChilds ;
					}else{
						objValues[child.nodeName] = isSet( child.firstChild.data ) ? child.firstChild.data : null;
					}
				}
			}

			if( objValues != null ){
				json.push( objValues );
			}else{
				if( isSet( nodeItSelf.firstChild.data ) )
					json.push( nodeItSelf.firstChild.data );
				
			}
			
			if( objValues != null )
				objValues = new Object();
		}
		return json;
	}
});