function calculatorPackage(){

	var c1=jml.obj;
	var c2=jml.xml.node;
	var c3=jml.events;
	var c4=jml.cookie;
	
	var data;
	var currencySymbol='€';
	var services;
	var container;
	var host;
	var layer;
	var engagement=true;
	var clientInputDataObject;
	var servicesDump={};
	var engagementActivatorActivated = true;
	
	function parseData(){
		data = getData();
		if(!isset(data)) return;
		
		setContainer();
		
		var a1=data.services;
		for(var i=0;i<a1.length;i++){
			if(isset(a1[i])){
				var s1=host.templateId.services;
				var o1=getObj(s1);
				if(isset(o1)){
					var sc = new serviceClass(a1[i],container.services,o1,host,engagement);
					if(!isset(services)) services=[];
					services.push(sc);
					
					var x1 = c2.byPosition(1,container.mensuel);
					var x2 = isset(x1) && i!=0? c2.duplicate(x1) : x1;
					
					var x3 = c2.byPosition(0,x2);
					var x4 = c2.byPosition(0,x3);
					
					var s1 = a1[i].label;
					
					c1.set(x3,'backgroundImage','url(/library/images/icons/'+s1+'_01.gif)');
					
					
					if(s1=='telephone') s1 = 'téléphone';
					if(s1=='television') s1 = 'télévision';
					c1.set(x4,'innerHTML',ucFirst(s1));
					
					servicesDump[a1[i].label] = x2;
					
					var tempString1 = a1[i].label;
					if(tempString1=='telephone') tempString1 = 'phone';
					
					if(isset(host.preSelectedServices) && isset(host.preSelectedServices[tempString1]) && host.preSelectedServices[tempString1].selected){
						sc.selectService();
					}
				}
			}
			
		}
		
		// engagement input
		var engagementActivator = getObj('engagementInput');
		if(isset(engagementActivator)){
			c3.add(engagementActivator,'click',function(e){
				engagementActivatorActivated = !engagementActivatorActivated;
				engagement = engagementActivatorActivated;

				c1.set( engagementActivator, 'src', '/library/images/btns/see-economie_00'+  ( !engagement ? 1 : 2 ) +'_over.gif');
				//engagement = c1.get(engagementActivator,'checked');
				for(var i=0;i<services.length;i++){
					services[i].setEngagement(engagement);
					services[i].updateService(true);
					if(services[i].isSelected()) services[i].selectService();
				}
			});
		}
		
		// autre type de paiment input
		var paiementIndicator = getObj('paiementIndicator');
		if(isset(paiementIndicator)){
			c3.add(paiementIndicator,'click',function(e){
			
				var b1 = c1.get(paiementIndicator,'checked');
				var x1 = c2.byPath('2.0',container.initial);
				var s1 = c1.get(x1,'innerHTML');
				s1 = s1.replace(currencySymbol,'');
				var n1 = Number(s1);

				
				if(n1>0&&n1-2>=0&&!b1) c1.set(x1,'innerHTML', preparePrice(n1-2)+currencySymbol);
				if(b1) c1.set(x1,'innerHTML', preparePrice(n1+2)+currencySymbol);
	
			});
		}				
	}

	function setContainer(){
		var s1=host.templateId.main;
		if(!isset(s1)) return false;
		var o=getObj(s1);
		if(!isset(o)) return false;
		if(!isset(container)) container={};
		container.main=o;
		var a=['services','summary','initial','mensuel'];
		for(var i=0;i<a.length;i++) container[a[i]]=getByClassName(a[i]);
		for(var i in container) if(!isset(container[i])) return false;
		return true;
	}

	function getData(s){
		if(!isset(host.serverData)) return null;
		return decode(host.serverData).data;
	}
	
	function updateSummary(){
	
		var servicesCount = 0;
		var totalCash = 0;
		var frais = 0;				
		
		// reset initial
		var initialContainer = c2.byPath('3.0',container.initial);
		var n1 = c2.length(initialContainer);
		for(var i = n1-1;i >2;i--){
			var x1 = c2.byPosition(i, initialContainer);
			c2.remove(x1);
		}

		var flushed = {};
		
		var tempFeesCaution = 0;
		var tempFeesInstallation = 0;
		var tempFeesCautionCacheLabel = [];	
		
		for(var i in clientInputDataObject){
			var o1 = clientInputDataObject[i]; // services
			
			var serviceTotalCash=0;

			for(var j in o1){
			
				var tempClass = o1[j];
				var tempPrice = tempClass.get.price();
				var priceType = engagement? 'avec':'sans';
				var priceMensuel = tempPrice.mensuel[priceType];
				var priceInitial = tempPrice.initial[priceType];


				
				if( priceType == "sans" ){
					var tempBAFId = tempClass.get.id();
					var tempBAFNum = 0;
					if( tempBAFId == 23 || tempBAFId == 24 || tempBAFId == 25 || tempBAFId == 26 ){
						tempBAFNum = (Number( tempClass.get.label().match(/\d+/gi)[0] ))-1;
						tempFeesCaution += ( tempBAFNum * 50 ) ;
					}
				}
				
				
				if(isset(priceMensuel)){
					var s1 = tempClass.get.parent().get.label();
					var x1 = servicesDump[s1];
					var x2 = c2.byPosition(1,x1);
					if(!isset(flushed[s1])){
					
						for(var k=c2.length(x2)-1;k>0;k--){
							var x3 = c2.byPosition(k,x2);
							c2.remove(x3);
						}							
					
						var tempFeesArray = tempClass.get.parent().get.fees();
						for(var k=0;k<tempFeesArray.length;k++){
							
							var tempFees = tempFeesArray[k];
							var tempFeesPrice = tempFees.price;
							var tempFeesPriceMensuel = tempFeesPrice.mensuel[priceType];
							var tempFeesPriceInitial = tempFeesPrice.initial[priceType];									
							
							if(isset(tempFeesPriceMensuel)){
								var x3 = c2.byPosition(c2.length(x2)-1,x2);
								var x4 = c2.duplicate(x3);
								c1.set(c2.byPosition(0,x4),'innerHTML',tempFees.label);
								c1.set(c2.byPosition(1,x4),'innerHTML',preparePrice(Number(tempFeesPriceMensuel))+currencySymbol);
							}
							
							if(isset(tempFeesPriceInitial)){
								if(lower(tempFees.label)=='caution'){
									var tempCautionLabel = tempClass.get.parent().get.label();
									var foundRuleMatch = false;
									if(tempCautionLabel=='telephone' || tempCautionLabel=='internet'){
										for(var p = 0;p<tempFeesCautionCacheLabel.length;p++){
											var tempCachedCautionLabel = tempFeesCautionCacheLabel[p];
											if(tempCautionLabel=='telephone'  && tempCachedCautionLabel == 'internet') foundRuleMatch = true;
											if(tempCautionLabel=='internet'  && tempCachedCautionLabel == 'telephone') foundRuleMatch = true;
										}
									}
									if(!foundRuleMatch) tempFeesCaution += Number(tempFeesPriceInitial);
									tempFeesCautionCacheLabel.push(tempCautionLabel);									
								}
								if(lower(tempFees.label)=='installation' && tempFeesInstallation==0){
									tempFeesInstallation += Number(tempFeesPriceInitial);
								}
							}
						}

						c1.set(c2.byPosition(1, c2.byPosition(1, initialContainer)),'innerHTML', preparePrice(tempFeesInstallation)+currencySymbol);
						c1.set(c2.byPosition(1, c2.byPosition(2, initialContainer)),'innerHTML', preparePrice(tempFeesCaution)+currencySymbol); // <== display result....
						
						flushed[s1] = true;
					}

					if( priceType == "sans" ) c1.set(c2.byPosition(1, c2.byPosition(2, initialContainer)),'innerHTML', preparePrice(tempFeesCaution)+currencySymbol); // <== display result....

					var x3 = c2.byPosition(c2.length(x2)-1,x2);
					var x4 = c2.duplicate(x3);
					c1.set(x4,'className','');
					
					c1.set(c2.byPosition(0,x4),'innerHTML',tempClass.get.label());
					c1.set(c2.byPosition(1,x4),'innerHTML',preparePrice(Number(priceMensuel))+currencySymbol);
					
					totalCash += Number(priceMensuel);
					serviceTotalCash += Number(priceMensuel);
					
				}
				
				if(isset(priceInitial)){
					frais += Number(priceInitial);
					
					var x1 = c2.duplicate(c2.byPosition(2, initialContainer));
					
					// Prises suplémentaires
					
					var tempLabel = tempClass.get.label();
					
					if( tempClass.get.id() == 23 || tempClass.get.id() == 24 || tempClass.get.id() == 25 || tempClass.get.id() == 26 ){
						tempLabel = "Prises suplémentaires ";
					}

					c1.set(c2.byPosition(0, x1),'innerHTML', tempLabel );
					c1.set(c2.byPosition(1, x1),'innerHTML', preparePrice(Number(priceInitial))+currencySymbol);
				}
			}
			if(i=='internet'){
				var xContainer = c2.byPath('1.0.1',container.mensuel);
				if(isset(xContainer)) c1.set(xContainer,'innerHTML',preparePrice(serviceTotalCash)+currencySymbol);
			}
			if(i=='telephone'){
				var xContainer = c2.byPath('2.0.1',container.mensuel);
				if(isset(xContainer)) c1.set(xContainer,'innerHTML',preparePrice(serviceTotalCash)+currencySymbol);
			}
			if(i=='television'){
				var xContainer = c2.byPath('3.0.1',container.mensuel);
				if(isset(xContainer)) c1.set(xContainer,'innerHTML',preparePrice(serviceTotalCash)+currencySymbol);
			}			
			servicesCount++;
				
		}

		var a1=[];
		for(var i in clientInputDataObject) a1.push(i);
		for(var i=0;i<data.services.length;i++){
			var s1 = data.services[i].label;
			var o1 = {name:null,found:false};
			for(var j = 0; j<a1.length;j++){
				if(s1==a1[j]){
					o1.name = s1;
					o1.found = true;
				}
			}
			if(!o1.found){
				var x1 = servicesDump[s1] ;
				if(isset(x1)){
					var x2 = c2.byPath('0.1',x1);
					c1.set( x2,'innerHTML',preparePrice(0)+currencySymbol);
					var x2 = c2.byPosition(1,x1);
					
					for(var j=c2.length(x2)-1;j>0;j--){
						var x3 = c2.byPosition(j,x2);
						c2.remove(x3);
					}					
				}
			}
		}
		
		if(servicesCount==0){
			c1.set(c2.byPath('3.0.1.1',container.initial),'innerHTML',preparePrice(0)+currencySymbol);
		}

		if(!isset(container) || !isset(container.initial)) return;
	
		// Sous total
		var x1 = c2.byPath('1.0',container.initial);
		
		// Remove current
		for(var i=c2.length(x1); i>0; i--) if(i!=0) c2.remove(c2.byPosition(i,x1));
		var x2 = c2.byPosition(0,x1);
		var x3 = c2.byPosition(2,x2);
		c1.set(x3,'innerHTML',preparePrice(totalCash)+currencySymbol);
		
		var rabais = 0;
		
		for(var i=0;i<data.discounts.length;i++){
			var tempDiscount = data.discounts[i];
			
			var tempPrince = tempDiscount.price;
			var priceType = engagement? 'avec':'sans';
			var priceMensuel = tempPrince.mensuel[priceType];
			if(isset(priceMensuel)) priceMensuel = Number( priceMensuel.match(/\d/)[0] );
			
			var priceInitial = tempPrince.initial[priceType];
				
			if(servicesCount==2 && tempDiscount.id=='2'){
				// add discount for duo
				//alert("priceMensuel = " + priceMensuel );

				rabais = priceMensuel;

				var x4 = c2.duplicate(x2);
				c1.set(c2.byPosition(0,x4),'innerHTML','-');
				c1.set(c2.byPosition(1,x4),'innerHTML',' Rabais');
				c1.set(c2.byPosition(2,x4),'innerHTML', preparePrice( priceMensuel )+currencySymbol );
				
			}
			if(servicesCount==3){
				if(tempDiscount.id=='3'){
				
					// add discount for trio
					//alert("priceMensuel = " + priceMensuel );	
					
					rabais = priceMensuel;
					
					var x4 = c2.duplicate(x2);
					c1.set(c2.byPosition(0,x4),'innerHTML','-');
					c1.set(c2.byPosition(1,x4),'innerHTML',' Rabais');
					c1.set(c2.byPosition(2,x4),'innerHTML', preparePrice(priceMensuel)+currencySymbol);							
										
				}
				if(tempDiscount.id=='4'){
					var x5 = c2.byPath('3.0.1.1',container.initial);
					var s1 = c1.get(x5,'innerHTML');
					s1=s1.replace('€','');
					if(priceInitial.indexOf('%')!=-1){
						priceInitial = Number( String(priceInitial).replace('%','') );
						priceInitial = Number(s1) - ( Number(s1) * (priceInitial/100) );

					}else{
						priceInitial = Number(s1) - priceInitial;
					}
					
					c1.set(x5,'innerHTML', preparePrice(priceInitial)+currencySymbol);
				}
			}
		}

		// Big total
		c1.set(c2.byPath('2.0',container.initial),'innerHTML', preparePrice(totalCash-rabais)+currencySymbol);
		
		// Total frais
		c1.set(c2.byPath('3.0.0.1',container.initial),'innerHTML', preparePrice(frais)+currencySymbol);
		
		// Frais de depart
		var n1 = Number( c1.get(c2.byPath('3.0.1.1',container.initial),'innerHTML').replace(currencySymbol,'') );
		var n2 = Number( c1.get(c2.byPath('3.0.2.1',container.initial),'innerHTML').replace(currencySymbol,'') );
		//c1.set(c2.byPath('3.0.0.1',container.initial),'innerHTML', preparePrice(n1+n2)+currencySymbol);
	
		c1.set(c2.byPath('5.0',container.initial),'innerHTML', preparePrice(n1+n2+frais)+currencySymbol);
		
	}
	
	function getByClassName(s,x){
		try{
			var o=c2.byAttributeValue('class',s,x)[0];
			return o;
		}catch(e){
			return null;
		}
	}
	
	function displayInformation(e, open, node, itemClass){

		var s1 = isset(itemClass)? itemClass.get.description() : null;
		
		if(!open||!isset(s1)||!isset(node)){
		
			if(!isset(layer)) return;
			
			c1.set(layer.box,'display','none');
			c1.set(layer.arrow,'display','none');
			
			return;
		}
		if(!isset(layer)){
			layer={};
			var x1=c2.create('div',document.body);
			var x2=c2.create('div',document.body);
			if(!isset(x1)||!isset(x2)) return;
			layer.box=x1;
			layer.arrow=x2;
			c3.add(layer.box,'mouseover',function()
				{
					displayInformation(null, false);
				}
			);
		}
		
		c1.set(layer.box,			'display'	,'block');
		c1.set(layer.arrow,			'display'	,'block');				
		c1.set(layer.box,			'innerHTML'	,itemClass.get.description());
		c1.set(layer.box,			'className'	,'layer skin');
		c1.set(layer.arrow,			'className'	,'layer arrow');
		c1.set(layer.arrow,			'innerHTML'	,'&nbsp;');
		
		var n1=c1.get(node,			'offsetLeft');
		var n2=c1.get(node,			'offsetTop');
		var n3=c1.get(node,			'offsetWidth');
		var n4=c1.get(node,			'offsetHeight');
		var n6=c1.get(layer.box,	'offsetHeight');
		var n7=c1.get(layer.arrow,	'offsetHeight');
		
		var n8=(n2-(n6+n7-1));
		
		c1.set(layer.box,'left',(n1+30)+'px');
		c1.set(layer.box,'top',n8+'px');
		c1.set(layer.arrow,'left',(n1+40)+'px');
		c1.set(layer.arrow,'top',(n2-n7)+'px');
	}
	
	function preparePrice(total){
		var s1 = String(Number(total));
		var n1 = s1.indexOf('.');
		if(n1!=-1){
			var s2 = s1.substring(n1+1,n1+3);
			if(s2.length==1) s2 = s2 + '0';
			total = s1.split('.')[0] + '.'+ s2;
		}else{
			total = total+'.00';
		}
		return total;			
	}
	
	function pushData(dataLabel, dataObject, toInsert){
		if(!isset(clientInputDataObject)) clientInputDataObject = {};
		if(!isset(clientInputDataObject[dataLabel]) && toInsert) clientInputDataObject[dataLabel] = dataObject;
		if(isset(clientInputDataObject[dataLabel]) && !toInsert) delete clientInputDataObject[dataLabel];
		updateSummary();
	}
	
	return {
		$:function(){
			host=this;
			c3.add(window,'load',parseData);
			return this;
		},
		serverData:null,
		templateId:{main:null,services:null},
		displayInformation:displayInformation,
		addData:function(dataLabel, dataObject){ pushData(dataLabel, dataObject, true); },
		removeData:function(dataLabel, dataObject){ pushData(dataLabel, dataObject, false); },
		currencySymbol:currencySymbol,
		preparePrice:preparePrice,
		preSelectedServices:null
	}.$();
}

//
// Service class
// For each services
function serviceClass(data, container, template, parent, engagement){
	
	var c1=jml.obj;
	var c2=jml.xml.node;
	var c3=jml.events;
	var c4=jml.cookie;
	
	var host;
	var parent = isset(parent)? parent : null;
	var node;
	var nodeData={
		forfait:[],
		options:{}
	}
	var selectedElement;
	var engagement = engagement||true;
	var serviceSelected = false;
	var firstRun = true;
	var label = data.label;
	var fees = data.fees;

	function init(){
		if(!isset(node)) node={};
		add();				
		
		node.check=c2.byPath('0.0',node.main);
		node.image=c2.byPath('0.1.0',node.main);
		node.price=c2.byPath('0.2',node.main);
		node.forfait=c2.byPath('1.0.0',node.main);
		node.options=c2.byPath('1.1.0',node.main);
		
		for(var i in node) if(!isset(node[i])) return;
						
		if(isset(node.image)){
			c1.set(node.image,'src','/library/images/icons/calculator-title-'+data.label+'.gif');
			c1.set(node.image,'alt',data.label);
			c1.set(node.image,'title',data.label);				
		}
		
		if(isset(node.forfait)) nodeData.forfait = createItemList(data,node.forfait,'forfait');
		if(isset(node.options)) nodeData.options = createItemList(data,node.options,'options');
		
		// node.check;
		c1.set(node.check,'innerHTML','<input type="checkbox" name="activator-'+data.label+'" id="activator-'+data.label+'" value="" />');
		var checkInput = c2.byPosition(0,node.check);
		if(isset(checkInput)){
			c3.add(checkInput,'click',function(){
				serviceSelected = c1.get(checkInput,'checked');
				serviceSelected? parent.addData(data.label, selectedElement) : parent.removeData(data.label, selectedElement) ;
			});
		}
		firstRun = false;
	}
	
	function selectService(){
		serviceSelected = c1.set( c2.byPosition(0, node.check), 'checked' ,true);
		parent.addData(data.label, selectedElement);
	}
	
	function search(a,o){
		for( var i=0;i<a.length;i++){ if(a[i] === o) return true; }
		return false;
	}
	
	function selectItem(eventObject, itemClass){
		
		var action 		={remove:[],add:[]};
		var nodeObject 	= itemClass.get.node();
		var classType 	= itemClass.get.type();
		var nodeInput 	= nodeObject.input;
		var nodeType 	= c1.get(nodeObject.input,'type');
		var rules			= itemClass.get.rules();
		var isSelected 	= c1.get(nodeInput,'checked');
		var eventObject = isset(eventObject)? c3.initialize( eventObject ) : null ;
		var targetObject = isset(eventObject)? c3.getElement( eventObject ) : nodeInput ;
		var nodeName 	= lower(targetObject.nodeName);				
		var disabled    = c1.get(nodeObject.input,'disabled');
		
		if (disabled) return;
		
		if(isset(targetObject)&&nodeName!=='input'){
		
			if( lower( c1.get(  nodeInput , "type") ) == "radio"){
				if(!isSelected) c1.set(nodeInput,'checked',!isSelected);
			}else{
				c1.set(nodeInput,'checked',!isSelected);
			}
			
		}
		var isSelected 	= nodeInput.checked;
		
		if(isSelected && isset(rules)){
			for(var i = 0;i < rules.length; i++){
				if(rules[i].action=='replace'){
					for(var x = 0;x < rules[i].id.length; x++){
						var tempClass = nodeData[classType][ classType +'_'+ rules[i].id[x] ];
						if(isset(tempClass)){
							var tempClassNodeObject	= tempClass.get.node();
							var tempClassNodeInput = tempClassNodeObject.input;
							c1.set(tempClassNodeInput,'checked',false);
							action.remove.push(tempClass);
						}
					}
				}
				
				if(rules[i].action=='disable' || rules[i].action=='enable'){
					for(var x = 0;x < rules[i].id.length; x++){
						var status = rules[i].action=='enable' ? false : true;
						//Force node type to options
						var tempClass = nodeData["options"][ "options"  +'_'+ rules[i].id[x] ];
						if(isset(tempClass)){
							var tempClassNodeObject	= tempClass.get.node();
							var tempClassNodeInput = tempClassNodeObject.input;
							c1.set(tempClassNodeInput,'disabled', status);
							c1.set(tempClassNodeInput,'checked', false);
							action.remove.push(tempClass);
						}
					}
				}

			}
		}
		
		if(isSelected) action.add.push(itemClass);
		if(!isSelected) action.remove.push(itemClass);
		if(!isset(selectedElement)) selectedElement = {};
		
		for(var i = 0; i < action.remove.length; i++){
			var tempClass = action.remove[i];
			if(isset(tempClass)){
				var tempClassId = tempClass.get.id();
				var tempClassType = tempClass.get.type();
				if( isset( selectedElement[ tempClassType + '_' + tempClassId ] ) ){
					delete selectedElement[ tempClassType + '_' + tempClassId ];
				}
			}
		}
		for(var i = 0; i < action.add.length; i++){
			var tempClass = action.add[i];
			var tempClassId = tempClass.get.id();
			var tempClassType = tempClass.get.type();
			if( !isset( selectedElement[ tempClassType + '_' + tempClassId ] ) ){
				selectedElement[ tempClassType + '_' + tempClassId ] = tempClass;
			}
		}
		if(!firstRun) selectService();
		updateService();
	}
	
	function updateService(forcedUpdate){
		var total = 0;
		var forcedUpdate = forcedUpdate||false;
		for( var i in selectedElement ){
			var tempClass = selectedElement[i];
			if(isset(tempClass)){
				var price = tempClass.get.price();
				var n1 = Number(price.mensuel[engagement? 'avec' : 'sans' ]);
				total += n1;
			}
		}
		
		// plus modify item on each node...
		if(forcedUpdate){
			var t1= createItemList(data,node.forfait,'forfait','update');
			var t2= createItemList(data,node.options,'options','update');		
		}
		
		total = parent.preparePrice(total);
		c1.set(node.price,'innerHTML','Total: <span>'+ total + parent.currencySymbol + '</span>');
	}
	
	function createItemList(data,node,type,action){
		var a1=data[type];
		var a2={};
		var x2=c2.byPosition(0,node);
		var groupNode={};
		var firstItem;
		var callAction = false;
		var action = action||null;
		
		for(var i=0;i<a1.length;i++){
			var o1=a1[i];
			if(isset(o1)){
				// Special cases
				if(isset(o1.group) && !isset(action)){
					if(o1.group==1){
						if(!isset(groupNode['group'+o1.group])){

							var x3 = c2.parent(node,3);
							var x4 = c2.create('div',x3, c2.byPosition(0,x3),false);
							var x5 = c2.create('ul',x4);
							var x6 = c2.create('div',x4);
							
							if(  isset( o1.note ) ){
								var x7 = c2.create('div',x4);	
								c1.set( x7 , 'innerHTML' , o1.note );
								c1.set( x7, 'className' , 'note' );
							}
							
							c1.set(x6,'innerHTML','&nbsp;');
							c1.set(x4,'className','group1Skin');
							c1.set(x6,'className','clear');
							groupNode['group'+o1.group] = {container:x5,first:null};
						}
						var x3 = c2.add(c2.clone(x2), groupNode['group'+o1.group].container);
						var tempName = data.label+'_'+type+'_offer' + '_group'+o1.group;
						c1.set(x3,'innerHTML','<input type="radio" name="'+tempName+'" id="" value="" title="" /><span></span><strong></strong><span></span>');

						var x4=c2.byPosition(0,x3);
						var x5=c2.byPosition(1,x3);
						if(!isset(groupNode['group'+o1.group].first)){
							groupNode['group'+o1.group].first=x4;
							c1.set(x4,'checked',true);
							callAction = true;
						}
					}
				}else{
					
					var x3 = !isset(action)? c2.duplicate(x2) :  c2.byPosition(i,node);
					if( !isset(action)){
					
						var s1 = c1.get(c2.byPath('0.0',x3),'type');
						var tempName = data.label+'_'+type+'_offer' + (s1=='checkbox'? '_'+i : '');
						
						var structure = '<span class="li-left">';
						structure += '<input type="' + s1 + '" name="' + tempName + '" id="" value="" title="" />';
						structure += '</span>';
						structure += '<span class="li-middle"></span>';
						structure += '<span class="li-right">';
						structure += '<strong></strong>';
						structure += '<span></span>';
						structure += '</span>';

						c1.set(x3,'innerHTML', structure);						
						
						//alert("x3 = " + x3);
						
						//c1.set(x3,'innerHTML','<input type="'+s1+'" name="'+tempName+'" id="" value="" title="" /><span></span><strong></strong><span></span>');
					}
					
					var x4=c2.byPosition(0,x3);
					if( lower( x4.nodeName) != 'input' ) x4 = c2.byPath('0.0', x3);
					
					var x5=c2.byPosition(1,x3);			
				}

				var x6=c2.byPosition(2,x3);
				//Television groups (1 channel, 2 channels... etc) are different from the others
				if( !isset(x6) || lower( x6.nodeName) != 'strong' ) x6 = c2.byPath('2.0', x3);
				
				var x7=c2.byPosition(3,x3);
				if(!isset(x7)) x7 = c2.byPath('2.1', x3);
				
				if( !isset(action)){
					c1.set(x4,'title',o1.label);
					c1.set(x4,'value',o1.id);
					c1.set(x4,'id',data.label+'_'+type+'_offer_'+i);
					c1.set(x5,'innerHTML',o1.label);
				}		
				
				//parent.preparePrice(price3)+parent.currencySymbol
				//engagement
				
				var elementPriceType = engagement? 'avec':'sans';
				
				var price1 = o1.price.mensuel[elementPriceType];
				var price2 = o1.price.initial[elementPriceType];
				var price3 = isset(price1)? price1 : isset(price2)? price2 : null;
				
				if(isset( price3) && (!isset(o1.group) || o1.group!=1) ){
					c1.set(x6,'innerHTML',parent.preparePrice(Number(price3))+parent.currencySymbol);
					c1.set(x7,'innerHTML',isset(price2)?'*' : '/mois');
				}
				if( !isset(action)){
					o1.index=i;
					o1.type=type;
					o1.node={main:x3,input:x4,textContainer:x5};
					a2[type+'_'+o1.id] = new itemClass(o1, host);
					if(callAction) selectItem(null, a2[type+'_'+o1.id]);
					if(!isset(firstItem)) firstItem = a2[type+'_'+o1.id];
				}
			}
		}
		if( !isset(action)){		
			if(type != 'options'){
				var t_x1  = c2.byPosition(0, c2.byProximity(x2,1) );
				if( lower( t_x1.nodeName ) != 'input') t_x1 = c2.byPosition(0, t_x1);
				c1.set(t_x1,'checked',true);
				if(isset(firstItem)) selectItem(null, firstItem);
			}
			c2.remove(x2);
		}
		return a2;
	}
	
	function add(){
	
		var x1=c2.clone(template);
		if(!isset(x1)) return false;
		
		var x2=c2.add(x1,container);
		if(!isset(x2)) return false;
		
		c1.set(x2,'id','');
		node.main=x2;
		
		return true;
	}
	
	return {
		$:function(){
			host=this;
			init();
			return this;
		},
		parent:parent,
		selectItem:selectItem,
		selectService:selectService,
		updateService:updateService,
		setEngagement:function(b){ if(isset(b)) engagement = b;},
		setSelected:function(b){ if(isset(b)){serviceSelected = b;} },
		isSelected:function(b){ return serviceSelected; },
		get:{
			label:function(){ return label; },
			fees:function(){ return fees; }
		}
	}.$();
}		

//
// Item class
// For each offers (forfaits/options)
function itemClass( data, parent ){
	
	var c1				=jml.obj;
	var c2				=jml.xml.node;
	var c3				=jml.events;
	var c4				=jml.cookie;
	
	var host;
	
	var price					=isset(data.price)?data.price:null;
	var id						=isset(data.id)?data.id:null;
	var label					=isset(data.label)?data.label:null;
	var description		=isset(data.description)?data.description:null;
	var rules					=isset(data.rules)?data.rules:null;
	var index					=isset(data.index)?data.index:null;
	var node					=isset(data.node)?data.node:null;
	var type					=isset(data.type)?data.type:null;
	var group				=isset(data.group)?data.group:null;
	var parent				=isset(parent)?parent:null;
	var data					=isset(data)?data:null;
	var note					=isset(data.note)?data.note:null;
	
	if( isset(price) ){
		if(id ==23){
			price.mensuel.avec = 6;
			price.mensuel.sans = 6;
		}
		if(id ==24){
			price.mensuel.avec = 12;
			price.mensuel.sans = 12;
		}
		if(id ==25){
			price.mensuel.avec = 18;
			price.mensuel.sans = 18;
		}
		if(id ==26){
			price.mensuel.avec = 24;
			price.mensuel.sans = 24;
		}
	}
		
	
	

	function addAction(){

		if(!isset(node.main)) return;

		c3.add(node.main,'mouseover',	delegate(null,parent.parent.displayInformation, true, node.main, host));
		c3.add(node.main,'mouseout',	delegate(null,parent.parent.displayInformation, false));
		c3.add(node.main,'click',		delegate(null,parent.selectItem, host));
	}

	return {
		$:function(){
			host=this;
			addAction();
			return this;
		},
		parent:parent,
		get:{
			id:function(){ return id; },
			label:function(){ return label; },
			description:function(){ return description; },
			rules:function(){ return rules; },
			index:function(){ return index; },
			node:function(){ return node; },
			type:function(){ return type; },
			group:function(){ return group; },
			price:function(){ return price; },
			parent:function(){ return parent; },
			data:function(){ return data; },
			note:function(){ return note; }
		}
	}.$();
}
