﻿
var mu = {
	spworld :{}
};

mu.spworld.ModelSelector = (function(){
	
	var config;
	var container;
	var priceBox;
	var prodCode;
	var buckets;
	var modFeatVal = {};
	var modFeat = {};
	var lastSelected = {};
	var relatedValues;
	var featuresById;
	var unavailableMessage;
	var	unavMsg;
	var selectionCount = 0;
	var hiddenField;
	var addButton;
	var availBox;
	var discountTemplate;
	var normalTemplate;
	var selModelString;
	var addButtonActiveUrl;
	var ProductImage;
	var quantityOffers;
	var freeShipping;
	var freeShippingMessage;
	var bonus;
	var bonusMessage;
	var bonusMessageExclude;
	var F_SEP = '§';
	
	
	function fixid(id){
	    var s = id.split(F_SEP);
	    var l = s.length;
	    for(var i=0;i<l;i++) s[i]=escape(s[i]);
	    return s.join(F_SEP);
	}
	
	
	
	/**
	*	Raggruppa i valori per caratteristica
	*/
	function createBuckets(){
		var m = config.models;
		var f	=	config.features;
		var b	=	buckets = {};
		
		relatedValues = {};
		featuresById = {};
		
		//per ogni caratteristica crea una tabella dei valori			
		for(var i = 0; i < f.length; i++){
			buckets[f[i].id] = {
				values:	[]
			};
			featuresById[f[i].id] = f[i];
		}
		
		//scorre i modelli e riempe i buckets caratteristica/valori
		for(var i = 0; i < m.length; i++){
			var mf = m[i].features;			
			if(mf){
				modFeatVal[m[i].id] = {};
				modFeat[m[i].id] = {};
				for(var j = 0; j < mf.length; j++){
					var bv = b[mf[j].id].values;
					if(bv.indexOf(mf[j].value) === -1){
						bv[bv.length] = mf[j].value;
					}
					modFeatVal[m[i].id][mf[j].id+F_SEP+mf[j].value] = true;
					modFeat[m[i].id][mf[j].id] = true;
				}			
			}	
		}	
		
		for(var i = 0; i < f.length; i++){
			var v = buckets[f[i].id].values;			
			for(var j = 0; j < v.length; j++){
				var id = f[i].id + F_SEP + v[j];
				if(relatedValues[id] == null ){
					relatedValues[id] = [];					
					for(var k = 0; k < m.length; k++){						
						if(modFeatVal[m[k].id] && modFeatVal[m[k].id][id] === true){						
							//alert( id + ' è nel modello ' + m[k].id)
							var mf = m[k].features;
							for(var h = 0; h < mf.length; h++){
								if(mf[h].id != f[i].id){
									relatedValues[id][relatedValues[id].length] = mf[h];
									//alert([id, mf[h].id, mf[h].value]);	
								}																								
							}				
						}						
					}
				}									
			}							
		}
		
		
			
	}
	
	
	/**
	*	Crea i layout in cui inserire la lista delle caratteristiche selezionabili
	*/
	function buildLayout()	{			
		var f	=	config.features;
		var o = [];
		for(var i = 0; i < f.length; i++){
			o[o.length] = ['<div class="feature-label">', f[i].name, '</div><ul class="feature-values">'].join('');								
			var v = buckets[f[i].id].values;
			for(var j = 0; j < v.length; j++){
				o[o.length] = [
					'<li '
				,	'id="', f[i].id ,F_SEP, escape(v[j]) ,'" '
				,	'onmouseover="mu.spworld.ModelSelector.over(', f[i].id ,',\'', v[j] ,'\', arguments[0])" '
				,	'onmouseout="mu.spworld.ModelSelector.out(', f[i].id ,',\'', v[j] ,'\')" '
				, 'onclick="mu.spworld.ModelSelector.click(', f[i].id ,',\'', v[j] ,'\')"'
				,	'>'
				, v[j] 
				,	'</li>'
				].join('');
			}
			
			o[o.length] = ['</ul>'].join('');				
		}
		container.update(o.join(''));
	}
	

	function bo(fid, v, els, selmodels){
		var models		=	config.models;
		var features	=	config.features;
		
		//trova la caratteristica da sostituire
		var sel		= els.clone();
		var found = false;
		var elid	= fid+F_SEP+v;
		for(var i = 0; i < sel.length; i++){
			if(sel[i].indexOf(fid+F_SEP)==0){
				sel[i] = elid;
				found = true;
				break;
			}						
		}
		
		if(!found)
			return null;
			
		for(var i = 0; i < models.length; i++){			
			var m = models[i];
			if(selmodels.indexOf(i)<0){
				var featFound = 0;
				for(var j = 0; j < m.features.length; j++){
					var fe = m.features[j];
					var id = fe.id +F_SEP+fe.value;				
					if(sel.indexOf(id)>=0){
						featFound++;
					}				
				}
				if(featFound==sel.length){
					//if(selmodels.indexOf(i)<0)			
					selmodels[selmodels.length] = i;
				}
			}			
		}
		return selmodels;
	}
	
	
	
	
	function showSelectableFeatures(els) {
		
		//1-	cerco i modelli che contengono le caratteristiche selezionate
		//2-	le caratteristcihe selezionabili, sono quelle non selezionate e
		//		presenti nei modelli trovati.
		var models		=	config.models;
		var features	=	config.features;
		var selmodels	=	[];		
		var selmodelsFeat = [];
		var els1 = getSelectedIDValueArray();
			
		for(var i = 0; i < models.length; i++){
			var m = models[i];
			var featFound		= 0;
			var featFound1	= 0;			
			//controlliamo le caratteristiche del modello
			for(var j = 0; j < m.features.length; j++){
				var fe = m.features[j];
				var id = fe.id +F_SEP+fe.value;				
				if(els.indexOf(id)>=0){					
					featFound++;					
				}
				if(els1.indexOf(id)>=0){
					featFound1++;					
				}
			}
			if ( featFound==els.length || featFound1==els1.length){
				//conservo l'indice del modello trovato.
				if(selmodels.indexOf(i)<0){								
					selmodels[selmodels.length] = i;						
				}
			} 				
		}
				
				
		//per i modelli trovati controlla se vi sono modelli altri selezionabili
		
		
		//array degli id delle caratteristcihe selezionate
		var featSel = [];
		for(var i = 0; i < els.length; i++){
			featSel[i] = parseInt(els[i].split(F_SEP)[0]);						
		}
		
				
		
		//array degli id delle caratteristiche selezionabili
		var featLeft = [];
		for(var i = 0; i < features.length; i++){
			if(featSel.indexOf(features[i].id)<0)
				featLeft[featLeft.length] = features[i].id;			
		}	
		
		//spegne le caratteristiche non selezionate
		for(var i = 0; i < features.length; i++){
			var values = buckets[features[i].id].values;
			for(var j = 0 ; j < values.length; j++){
				var id  = features[i].id+F_SEP+values[j];
				var el = $(features[i].id+F_SEP+escape(values[j]));
				if(lastSelected[features[i].id] != el)
					el.addClassName('unavailable');						
			}
		}		
		
		//controlliamo quali caratteristiche non selezionate
		//sono selezionabili ( si trovano nei modelli trovati )
		for(var i = 0 ; i < selmodels.length; i++){
			var m = models[selmodels[i]];
			for(var j =0; j < m.features.length; j++){
				var f = m.features[j];				
				$(f.id+F_SEP+escape(f.value)).removeClassName('over-unavailable');
				$(f.id+F_SEP+escape(f.value)).removeClassName('unavailable');				
			}
		}
		
		var getFid = function(id){
			return parseInt(id.split(F_SEP)[0])
		}
		
		//sono selezionabili anche le caratteristiche presenti in altri modelli
		//condivise con quello selezionato
		var oth =[];
		for(var i = 0; i < models.length; i++){
			var m = models[i];			
			for(var j = 0 ; j < selmodels.length; j++){
				if(selmodels.indexOf(i)<0){				
					var sm = models[selmodels[j]];				
					var commonFeat = [];					
					var otherFeat = [];
					
					for(var mf in modFeatVal[m.id]){						
						var fid = getFid(mf);
						if(modFeatVal[sm.id][mf] && featSel.indexOf(fid)>=0)
							commonFeat[commonFeat.length] = mf;
						else if (!modFeatVal[sm.id][mf] && featSel.indexOf(fid)>=0)
							otherFeat[otherFeat.length] = mf;
					}
					if(commonFeat.length>=els.length-1){
						commonFeat = commonFeat.concat(otherFeat);
						for(var k = 0; k < commonFeat.length; k++){							
							$(fixid(commonFeat[k])).removeClassName('over-unavailable');
							$(fixid(commonFeat[k])).removeClassName('unavailable');											
						}	
					}
				}
			}
		}
									
	}
	
	
	
	
	function showAllFeatures(){
		var f	=	config.features;
		for(var i = 0; i < f.length; i++){
			var v = buckets[f[i].id].values;
			for(var j = 0; j < v.length; j++){					
				var el = $(f[i].id+F_SEP+escape(v[j]));					
				el.removeClassName('unavailable');					
			}
		}			
	}
	
	
	function showUnavailableMessage(fid, value){
		var el = $(config.unavailableMessage);
		
		var sa	= getSelectedArray();
		var o		=	['<ul>']; 
		for(var i = 0; i < sa.length; i++){
			var args = sa[i].id.split(F_SEP);
			if(args[0] != fid){
				o[o.length] = ['<li>', featuresById[args[0]].name, ': <span class="value">', unescape(args[1]), '</span></li>' ].join('');
			}
		}
		o[o.length] = ['<li>', featuresById[fid].name, ': <span class="value">', value,'</span></li></ul>'].join('');
		
		el.update(unavMsg.replace('{0}', o.join('')));
		el.show();			
		
	}
	
	function hideUnavailableMessage(){
		var el = $(config.unavailableMessage);
		el.hide();			
	}
	
	
	function debugBuckets(){
		//debug: stampa buckets
		var f	=	config.features;
		for(var i = 0; i < f.length; i++){
			var v = buckets[f[i].id].values;
			var s = [ f[i].name, ' {', ];
			for(var j = 0; j < v.length; j++){
				s[s.length] = (j==0?'':',') + v[j];
			}
			s[s.length] = '}';
			alert(s.join(''));
		}
	}
	
	function checkNewSelection(fid, v) {		
		var el	= $(fid+F_SEP+escape(v));
		var f		=	config.features;
		if(el.hasClassName('unavailable')){
			el.removeClassName('over-unavailable');
			el.removeClassName('unavailable');
			for(var i = 0; i < f.length; i++){
				if(fid != f[i].id && lastSelected[f[i].id]){
					lastSelected[f[i].id].removeClassName('selected');
					lastSelected[f[i].id] = null;
					selectionCount--;
				}
			}
			hideUnavailableMessage();
			showSelectableFeatures(getSelectedIDValueArray());			
		}				
		if(selectionCount == f.length){
			showModelProperties(getSelectedIDValueArray());			
			activateAddButton();
		} else {
			deactivateAddButton();	
		}

		mu.spworld.ModelSelector.out.apply(this,[fid,v]);
				
	}
	
	function anySelection(){
		return selectionCount>0;	
	}
	
	function getSelectedArray(){
		var a = []
		var f	=	config.features;
		for(var i = 0; i < f.length; i++){
			if(lastSelected[f[i].id] != null )
				a[a.length] = lastSelected[f[i].id];
		}
		return a;
	}
	
	function getSelectedIDValueArray(){
		var a = []
		var f	=	config.features;
		for(var i = 0; i < f.length; i++){
			if(lastSelected[f[i].id] != null ){
				var value = unescape(lastSelected[f[i].id].id.split(F_SEP)[1]);
				a[a.length] = f[i].id + F_SEP + value;
			}
		}
		return a;
	}
	
	function showModelProperties(selected){
		//find the model with all the selected features
		var m = config.models;
		for(var i = 0; i < m.length; i++){
			var mf = m[i].features;
			if(mf){
				var found = 0;
				for(var j = 0; j< mf.length; j++){
					if(selected.indexOf(mf[j].id+'§'+mf[j].value) > -1){
						found++;
					}else{
						break;
					}						
				}
									
				if(found == config.features.length){
					var mod = m[i];
					showModel(mod);
					break;
				}
			}
		}	
	}
	
	function showModel(mod){
		hiddenField.value = mod.id;
		availBox.update(getAvailability(mod.availability));
		if(mod.notSellable){
		    prodCode.update(mod.productCode);
		    ProductImage.src="Thumbnail.axd?guidkey=cartMid&guid="+ mod.defaultImageId;
		    priceBox.update("Richiedi info");
		    quantityOffers.hide();
		    addButton.hide();
		}else{
		    var discountTemplate = '<span class="striked">&euro; {0}</span> <span class="special">&euro; {1}</span>\
		    <div class="small">risparmio di <span class="save">&euro; {2} ({3}%)</span></div>';					
		    var normalTemplate = '<span>&euro; {0}</span>';
    		
		    var tpl = mod.hasDiscount?  discountTemplate : normalTemplate;
    							
		    priceBox.update (
			    tpl	.replace('{0}', mod.price)
					    .replace('{1}', mod.discountedPrice)
					    .replace('{2}', mod.discount)
					    .replace('{3}', mod.discountPercentage)
		    );
		    prodCode.update(mod.productCode);
		    ProductImage.src="Thumbnail.axd?guidkey=cartMid&guid="+ mod.defaultImageId;
    		
		    tmpOffer='<tr><td class="value" style="text-align:right;">{0}</td><td class="value" style="text-align:right;">{1}</td><td class="value" style="text-align:right;">{2}</td></tr>';
		    var tplArr = [], tplRes = '';
		    if(mod.offerte!=null){
		    for(var i = 0; i < mod.offerte.length; i++)
		    {
			    tplArr[i] = tmpOffer.replace('{0}', mod.offerte[i].start)
					    .replace('{1}', mod.offerte[i].end)
					    .replace('{2}', mod.offerte[i].price)
		    }
		    tplRes = '<table style="background-image:url(../images/quantityOfferBackground.png);background-repeat:repeat-x;background-color:#deeffe;margin:0px 0px 0px 0px;padding-bottom:0px;border-bottom:1px solid #5B9FD4;width=320px;"><tr><td style="font-size:12px;font-weight:bold;" colspan="3"><h3>Offerta Quantit&agrave;</h3></td></tr><tr><td class="caption" style="width:40px;"><IW:Translate runat="server">Da</IW:Translate></td><td class="caption" style="width:50px;"><IW:Translate runat="server">A</IW:Translate></td><td class="caption" style="width:240px;">Offerta</td></tr>' + tplArr.join('') + '</table>';
		    }
		    if(mod.spedGratuita){
		        freeShipping.style.display = "block";
		    } 
		    if(mod.bonus){
		        var bonusString = '<table style="background-image:url(../images/bonusBoxBackground.png);background-repeat:repeat-x;background-color:#dee271;margin:0px 0px 10px 0px;padding-bottom:10px;border-bottom:1px solid #5B9FD4;width=320px;"><tr><td style="font-size:12px;font-weight:bold;" colspan="3"></td></tr><tr><td style="font-size:12px;font-weight:bold;" colspan="3"><h3>Bonus Sportimeworld</h3></td></tr><tr><td style="font-size:12px;" colspan="3">'+mod.bonusMessage+'</td></tr></table>'
		        bonus.update(bonusString);
		        bonus.show();
		    }else{
		        bonus.update("");
		        bonus.hide();
		    }
		    quantityOffers.show();
		    quantityOffers.update (tplRes);
		}
	}
	
	
	function getAvailability(a){
		var cs = config.strings;
		var a0 = a.substr(0,1);
		if(a.indexOf(F_SEP)>0){
			var range = a.replace(/(d|w|m|)+/gi, '');			
			switch(a0){
				case 'd': return range + ' ' + cs['giorni'];		break;
				case 'w': return range + ' ' + cs['settimane']; break;
				case 'm': return range + ' ' + cs['mesi'];			break;
			}			
		} else if(a0 == 'c'){
			switch(a){
				case 'c1': return cs['Immediata']; break;
				case 'c2': return cs['Entro breve'];			break;
				case 'c3': return cs['Al momento non disponibile'];	break;
			}			
		}else if(a=='sr'){
		    return cs['Su richiesta'];
		}else {
			var range = a.replace(/(d|w|m|\+)+/gi, '');
			var maj		=	a.indexOf('+')>0 ? '&gt;' : '';
			var s			=	range == 1;			
			switch(a0){
				case 'd': return maj + range + ' ' + (s?cs['giorno']:cs['giorni']); break;
				case 'w': return maj + range + ' ' + (s?cs['settimana']:cs['ettimane']); break;
				case 'm': return maj + range + ' ' + (s?cs['mese']:cs['mesi']); break;
			}		
		}	
	}
	
	function activateAddButton(){
	    addButton.show();
		addButton.href = addButtonActiveUrl;
		addButton.removeClassName('addToCartOff');
		addButton.addClassName('addToCartOn');
	}
	
	function deactivateAddButton(){
		if(!addButtonActiveUrl)
			addButtonActiveUrl = addButton.href;
		addButton.href = 'javascript:alert("'+ config.strings['select model'] +'")';		
		addButton.removeClassName('addToCartOn');
		addButton.addClassName('addToCartOff');
	}
	
		
	return {
		//inizializza
		init: function(cfg){				
			config			= cfg;
			container		= $(config.container);
			unavMsg			=	$(config.unavailableMessage).innerHTML;
			priceBox		=	$(config.priceBox);
			prodCode = $(config.prodCode);
			hiddenField =	$(config.hiddenField);
			addButton		=	$(config.addButton);
			normalTemplate = config.normalTemplate;
			discountTemplate = config.discountTemplate;
			selModelString	=	config.selModelString;
			availBox		=	$(config.availBox);
			ProductImage = $(config.ProductImage);
			quantityOffers = $(config.quantityOffers);
			freeShipping   = $(config.freeShipping);
			freeShippingMessage = config.freeShippingMessage || 'prova';
			bonus = $(config.bonus);
			deactivateAddButton();
			hideUnavailableMessage();
			
						
			if(null == config.models /*|| null == config.features*/)
				return;
			
			if(null == config.features && config.models.length>1)
				return;
			
			if(config.features){
				createBuckets();				
				buildLayout();
			}
			
			priceBox.update(selModelString);
			availBox.update(selModelString);
			//prodCode.update(selModelString);
			if(1 == config.models.length ){
				container.hide();
				
				var m = config.models[0];				
				if(config.features){
					for(var i = 0; i < m.features.length; i++){
						var f = m.features[i];
						this.click(f.id, f.value);
					}			
				}else{
					showModel(m);
				}
			}
			
			
		},
		
		over	: function(fid,v, e){
			
			//prepara l'array degli elementi selezionati.
			var sel		= getSelectedIDValueArray().clone();
			var found = false;
			var elid	= fid+F_SEP+v;
			for(var i = 0; i < sel.length; i++){
				if(sel[i].indexOf(fid+F_SEP)==0){
					sel[i] = elid;
					found = true;
					break;
				}						
			}
			if(!found)
				sel[sel.length] = elid;				
			showSelectableFeatures(sel);
						
			var el = $(fid+F_SEP+escape(v));
			
			if(el.hasClassName('unavailable')){
				el.addClassName('over-unavailable');
				showUnavailableMessage(fid,v);
			}
			else {
				el.addClassName('over');	
			}			
			
		},
		
		out		: function(fid,v){		
			var el = $(fid+F_SEP+escape(v));
			el.removeClassName('over');
			el.removeClassName('over-unavailable');
											
			var idarr = getSelectedIDValueArray();
			if(anySelection()){									
				showAllFeatures();
				showSelectableFeatures(idarr);
				showModelProperties(idarr);
			} else {					
				showAllFeatures();
			}
			
			hideUnavailableMessage();
			
			if(selectionCount != config.features.length){
				priceBox.update(selModelString);
				availBox.update(selModelString);
			    //prodCode.update(selModelString);
				
			}
			
		},
		
		click	:	function(fid,v){
			var el = $(fid+F_SEP+escape(v));
			if(lastSelected[fid]) {
				lastSelected[fid].removeClassName('selected');
				selectionCount--;
			}
			
			selectionCount++;
			lastSelected[fid] = el;
			lastSelected[fid].addClassName('selected');
			checkNewSelection(fid,v);
		}
	}

})();






mu.spworld.ProductInfo = (function(){
	var productID;
	var _s= [];
	return {
		init: function(s){
			_s = s;
		},
		
		show	:function(pid){
			productID = pid;
			var p = $('info-panel');
			p.toggle();
			
			$('info-panel-name').disabled = '';
			$('info-panel-from').disabled = '';
			$('info-panel-msg').disabled = '';	
			
		},
		
		hide: function(){
			$('info-panel').hide();
			$('info-panel-name').value = '';
			$('info-panel-from').value = '';
			$('info-panel-msg').value = '';	
			
		},
		
		request: function(){
			var name	= $('info-panel-name').value;
			var from	= $('info-panel-from').value;
			var msg		= $('info-panel-msg').value;
			var check   = $('PrivacyCheck').checked;
			
			if(	name.strip().empty() 
			||	from.strip().empty() 
			||	msg.strip().empty()){
				alert(_s[0]);
				return;
			}
			
			var emailRegX = /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i;
			if(!from.match(emailRegX)){
				alert(_s[1]);
				return;
			}
			
			
			$('info-panel-name').disabled = 'disabled';
			$('info-panel-from').disabled = 'disabled';
			$('info-panel-msg').disabled = 'disabled';
			if(check==true){
			var me = this;
			new Ajax.Request(
				'ajax/reqinfo.aspx',
				{
					parameters: {
						pid	:productID
					,	from:from
					,	msg	:msg
					,	name:name
					}
				,	onSuccess: function(){
						alert('Richiesta inviata');
						me.hide();				
					}	
				}
			);
			}else{
			    alert("Per inviare la richiesta devi prima dare il consenso al trattamento dei dati personali.");
			}
		}
	}
})();
