function XHRComm(listener, scriptUrl){
	this.listener  = listener;
	this.scriptUrl = scriptUrl;
	this.XHR       = null;
}

XHRComm.prototype = {
	sendData: function(mode, values){
		if(typeof(XMLHttpRequest) === 'function' || typeof(XMLHttpRequest) === 'object') this.XHR = new XMLHttpRequest();
		else if(window.ActiveXObject) this.XHR = new ActiveXObject('Microsoft.XMLHTTP');
		
		var selfObj = this;
		
		this.XHR.onreadystatechange = function(){
			selfObj.processResponse();
		};
		
		var parameters = '';
		for(var i = 0; i < values.length; ++i) parameters += (i > 0 ? '&' : '') + values[i][0] + '=' + encodeURI(values[i][1]);
		
		if(mode == 'post'){
			this.XHR.open('post', this.scriptUrl, true);
			this.XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=iso-8859-1');
			this.XHR.setRequestHeader("Content-length", parameters.length);
			this.XHR.send(parameters);
		}
		else{
			this.XHR.open('get', this.scriptUrl + '?' + parameters, true);
			this.XHR.send(null);
		}
	},
	
	processResponse: function(){
		if(this.XHR.readyState != 4) return;
		
		if(this.XHR.status != 200){
			alert('Si è verificato un errore: ' + this.XHR.status);
			return false;
		}
		
		this.listener.XHRresponse(this.XHR);
	}
}

function applyFormErrorHighlighter(item){
	item = new Xu(item);
	if(item.isNull()) return;
	
	var labels = item.getByTag('label');
	if(labels.length === 0) return;
	
	var tmp = new Array();
	for(var i = 0; i < labels.length; ++i) tmp.push(new Xu(labels[i]));
	labels = tmp;
	
	var links    = null;
	var link     = null;
	var labelFor = null;
	var label    = null;
	var done     = false;
	
	links = new Xu('Errori').getByTag('a');
	if(links.length > 0){
		for(i = 0; i < links.length; ++i){
			link = new Xu(links[i]);
			if(link.getVar('className') === 'inlink') continue;
			
			labelFor = link.getVar('href').split('#')[1];
			
			done = false;
			for(var x = 0; x < labels.length; ++x) {
				label = labels[x];
				if(label.getVar('htmlFor') != labelFor) continue;
				
				label.setVar('className',
					label.getVar('className') ? label.getVar('className') + ' errore' : 'errore'
				);
				done = true;
				break;
			}
			
			if(!done){
				label = new Xu(labelFor);
				if(!label.isNull()){
					label.setVar('className',
						label.getVar('className') ? label.getVar('className') + ' errore' : 'errore'
					);
				}
			}
		}
	}
}

function applyDetailsHider(){
	var details = new Xu().getByClass('ul', 'dettagli');
	
	var showDetails = function(e, source, type){
		source = new Xu(source).setStyle('display', 'none');
		
		source.getData('closeLink').setStyle('display', 'block');
		source.getData('detail').setStyle('display', 'block');
	}
	
	var hideDetails = function(e, source, type){
		source = new Xu(source).setStyle('display', 'none');
		
		source.getData('openLink').setStyle('display', 'block');
		source.getData('detail').setStyle('display', 'none');
	}
	
	var detail    = null;
	var openLink  = null;
	var closeLink = null;
	for(var i = 0; i < details.length; ++i){
		detail = new Xu(details[i]);
		
		openLink =
		new Xu('a', true).
		setData('detail', detail).
		append( new Xu('text', true, 'Mostra dettagli') ).
		setVar('href', 'javascript:;').
		addEvent('onclick', showDetails).
		insertBeforeItem(detail);
		
		closeLink =
		new Xu('a', true).
		setData('detail', detail).
		setData('openLink', openLink).
		append( new Xu('text', true, 'Nascondi dettagli') ).
		setVar('href', 'javascript:;').
		addEvent('onclick', hideDetails).
		insertBeforeItem(detail).
		setStyle('display', 'none');
		
		openLink.
		setData('closeLink', closeLink);
		
		detail.
		setVar('className', 'dettagli_popup').
		setStyle('display', 'none');
	}
}

function sendGoogleOrderForm(){
	if(!new Xu('GoogleOrderForm').isNull()) __utmSetTrans();
}

function FormPriceUpdater(){
	this.euro              = new Xu('prezzo_totale').get().firstChild.nodeValue.slice(0, 1);
	this.inputs            = new Array();
	this.selects           = new Array();
	this.basePrice         = new Xu('prezzo_totale').getVar('title').match(new RegExp(this.euro + ' ([0-9\.]+,[0-9]{2})'))[1].replace('.', '').replace(',', '.') - 0;
	this.fixedOptions      = new Array();
	this.discount          = null;
	this.discountIsPercent = false;
	
	var tmp = new Xu('sconto');
	if(!tmp.isNull()){
		tmp = tmp.get().firstChild.nodeValue;
		if(tmp.indexOf('%') === -1) this.discount = tmp.match(new RegExp('[0-9\.]+,[0-9]{2}'))[0].replace('.', '').replace(',', '.') - 0;
		else{
			this.discount = tmp.match(new RegExp('[0-9]+'))[0] - 0;
			this.discountIsPercent = true;
		}
	}
	
	var item   = null;
	
	var func   = function(e, source, type){
		new Xu(source).getData('FPU').calculatePrice();
	}
	
	this.quantity =
	new Xu('quantita').
	setData('FPU', this).
	addEvent('onkeyup', func);
	
	this.fixedOptions = new Xu('opzioni-articolo').getByClass('span', 'opzione-fissa');
	
	tmp = new Xu('opzioni-articolo').getByTag('select');
	if(tmp.length > 0){
		for(var i = 0; i < tmp.length; ++i){
			input = new Xu(tmp[i]);
			if(!input.getVar('id').match('opzione')) continue;
			input.
			setData('FPU', this).
			addEvent('onchange', func);
			
			this.selects.push(input);
		}
	}
}
FormPriceUpdater.prototype = {
	calculatePrice: function(){
		var total = 0;
		var value = null;
		
		var quantity = this.quantity.getVar('value');
		if(!quantity.match(new RegExp('^[1-9][0-9]?$')) || quantity < 1 || quantity > 10) quantity = 1;
		
		for(var i = 0; i < this.fixedOptions.length; ++i){
			value = this.fixedOptions[i].firstChild.nodeValue.match(new RegExp(this.euro + ' [+]?([0-9\.]+,[0-9]{2})'));
			if(!value) continue;
			value = value[1].replace('.', '').replace(',', '.') - 0;
			
			total+= value * (new Xu(this.fixedOptions[i].id.replace('testo_singolo_', 'indipendente_dalla_quantita_')).isNull() ? quantity : 1);
		}
		
		for(var i = 0; i < this.selects.length; ++i){
			value = this.selects[i].getComboValue('text').match(new RegExp(this.euro + ' [+]?([0-9\.]+,[0-9]{2})'));
			if(!value) continue;
			value = value[1].replace('.', '').replace(',', '.') - 0;
			total+= value * (new Xu(this.selects[i].getVar('id').replace('opzione_', 'indipendente_dalla_quantita_')).isNull() ? quantity : 1);
		}
		
		if(this.discount === null) discount = 0;
		else discount = (this.discountIsPercent ? ((this.basePrice * quantity) + total) / 100 * this.discount : this.discount * quantity);
		
		new Xu('prezzo_totale').
		setVar('title', this.euro + ' ' + this.formatEuro(this.basePrice * quantity) + ' + ' + this.euro + ' ' + this.formatEuro(total) + ' - ' + this.euro + ' ' + this.formatEuro(discount)).
		childItem(0).
		nodeValue = this.euro + ' ' + this.formatEuro((this.basePrice * quantity) + total - discount);
	},
	
	formatEuro: function(value){
		if(value === 0) return '0,00';
		value = Math.round(value * 100) + '';
		var decimals = value.substr(value.length - 2);
		value = value.substr(0, value.length - 2).split('');
		
		var results = '';
		var count   = 0;
		for(var i = value.length - 1; i >= 0; --i){
			if(count == 3){
				results = '.' + results;
				count = 0;
			}
			
			results = value[i] + results;
			++count;
		}
		return results + ',' + decimals;
	}
}


function CategoriesHandler(imgUrl, activeCategory){
	this.imgUrl         = imgUrl;
	
	var ul = new Xu('categorie').getByTag('ul', 0);
	
	if(ul === null) return;
	
	this.applyMenuHandlers(	new Xu(ul).setVar('className', 'menu') );
	
	if(activeCategory != null) this.selectCategory(activeCategory);
}

CategoriesHandler.prototype = {
	applyMenuHandlers: function(ul){
		ul = new Xu(ul);
		
		var lis = new Xf(ul.childItem()).filterByTag('li').getXu();
		
		if(lis.length == 0) return;
		
		var li = null;
		var ul = null;
		for(var i = 0; i < lis.length; ++i){
			li = lis[i];
			ul = new Xf(li.childItem()).filterByTag('ul').getXu(0);
			if(ul == null) continue;
			else{
				this.applySubMenu(li);
				this.applyMenuHandlers(ul);
			}
		}
	},
	
	applySubMenu: function(li){
		li = new Xu(li);
		
		var ul = new Xf(li.childItem()).filterByTag('ul').getXu(0);
		
		var func = function(e, source, type){
			var item = new Xu(source);
			
			if(item.getData('open')){
				item.
				setData('open', false).
				removeAll().
				append(
					new Xu('span', true).
					setVar('className', 'menu-chiuso').
					append(
						new Xu('text', true, '\u00A0')
					)
				).
				getData('ul').
				setStyle('display', 'none');
			}
			else{
				item.
				setData('open', true).
				removeAll().
				append(
					new Xu('span', true).
					setVar('className', 'menu-aperto').
					append(
						new Xu('text', true, '\u00A0')
					)
				).
				getData('ul').
				setStyle('display', 'block');
			}
			
			source.blur();
		}
		
		var linkFunc = function(e, source, type){
			var span = new Xu(new Xu(new Xu(source).parentItem()).getByTag('span', 0));
			
			if(span && span.getVar('className') === 'menu-chiuso'){
				new Xu(span.parentItem()).fireEvent('onclick');
				return false;
			}
		}
		
		var link = new Xu(li.getByTag('a', 0));
		link.addEvent('onclick', linkFunc);
		var mbID = link.getVar('id').replace('cat', 'mb');
		
		new Xu('a', true).
		setData('li', li).
		setData('ul', ul).
		setData('imgUrl', this.imgUrl).
		setData('open', false).
		setVar('href', 'javascript:;').
		setVar('id', mbID) .
		setVar('className', 'menu-bottone').
		addEvent('onclick', func).
		insertBeforeItem(li.getByTag('a', 0)).
		append(
			new Xu('span', true).
			setVar('className', 'menu-chiuso').
			append(
				new Xu('text', true, '\u00A0')
			)
		);
		
		ul.setStyle('display', 'none');
	},
	
	selectCategory: function(catID){
		var cat = new Xu('cat' + catID);
		
		if(cat.isNull()) return;
		
		cat.setVar('className', 'selezionato');
		
		var toOpen   = new Array();
		var menuLink = null;
		
		while(true){
			menuLink = new Xu(cat.getVar('id').replace('cat', 'mb'));
			if(!menuLink.isNull()) toOpen.push(menuLink);
			
			cat = cat.parentItem(2);
			
			if(cat && cat.tagName.toLowerCase() != 'li') break;
			
			cat = new Xu(cat);
			cat = new Xu(new Xu(cat).getByTag('a', 1));
		}
		
		for(var i = toOpen.length - 1; i >= 0; --i) toOpen[i].fireEvent('onclick');
	}
}



function applyShoppingCartFormConfirm(){
	var carrello = new Xu('tabella-carrello');
	if(carrello.isNull()) return;
	
	var func = function(){
		return confirm('Sei sicuro di voler rimuovere questo articolo dal carrello?');
	}
	
	var links = carrello.getByClass('a', 'rimuovi-link');
	
	for(var i = 0; i < links.length; ++i) new Xu(links[i]).addEvent('onclick', func);
}

function applyShoppingCartSendFormConfirm(){
	var carrello = new Xu('form-carrello');
	if(carrello.isNull()) return;
	
	var func = function(){
		return confirm('Sei sicuro di voler inviare il tuo ordine?');
	}
	
	carrello.addEvent('onsubmit', func);
}



function applyBlankTargetLinks(){
	var links = new Xu().getByTag('a');
	if(!links) return;
	
	links = new Xf(links).filterByVar('rel', 'external').getXu();
	
	for(var i = 0; i < links.length; ++i) links[i].setVar('target', '_blank');
	
	links = new Xf(new Xu().getByClass('a', 'blankLink')).getXu();
	
	if(!links) return;
	
	for(var i = 0; i < links.length; ++i) links[i].setVar('target', '_blank');
}



function ScreenManager(){
}

ScreenManager.prototype = {
	getSize: function(){
		var width  = 0;
		var height = 0;
		
		if(window.innerWidth){
			width = window.innerWidth;
			height = window.innerHeight;
		}
		else if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)){
			width  = document.documentElement.clientWidth;
			height = document.documentElement.clientHeight;
		}
		else if(document.body && (document.body.clientWidth || document.body.clientHeight)){
			width  = document.body.clientWidth;
			height = document.body.clientHeight;
		}
		
		return {
			width:  width,
			height: height
		}
	},
	
	getScroll: function(){
		var scrollX = 0;
		var scrollY = 0;
		
		if(window.pageYOffset){
			scrollX = window.pageXOffset;
			scrollY = window.pageYOffset;
		}
		else if(document.body && (document.body.scrollLeft || document.body.scrollTop)){
			scrollX = document.body.scrollLeft;
			scrollY = document.body.scrollTop;
		}
		else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)){
			scrollX = document.documentElement.scrollLeft;
			scrollY = document.documentElement.scrollTop;
		}
		
		return {
			scrollX: scrollX,
			scrollY: scrollY
		}
	}
}



function ImagePopupManager(link, closeText, loadingText, displayText){
	link = new Xu(link);
	if(link.isNull()) return;
	
	this.link        = link;
	this.closeText   = (closeText ? closeText : 'Chiudi');
	this.loadingText = (loadingText ? loadingText : 'Loading...');
	this.displayText = (displayText ? displayText : null);
	this.imagePath   = null;
	this.description = null;
	this.image       = null;
	this.loaded      = false;
	this.display     = null;
	
	this.updateLink();
}

ImagePopupManager.prototype = {
	updateLink: function(){
		this.imagePath   = this.link.getVar('href');
		this.description = this.link.getVar('title');
		
		var func = function(e, source, type){
			new Xu(source).getData('main').loadImage();
		}
		
		this.link.
		setVar('href', 'javascript:;').
		setVar('target', '_self').
		setData('main', this).
		addEvent('onclick', func);
	},
	
	loadImage: function(){
		if(!new Xu('ImagePopupManagerDiv').isNull()) new Xu('ImagePopupManagerDiv').removeSelf();
		if(this.image == null){
			this.displayLoading();
			
			var selfObj = this;
			
			var func = function(){
				selfObj.imageLoaded();
			}
			
			this.image = new Image();
			this.image.onload = func;
			this.image.src = this.imagePath;
		}
		else if(this.loaded) this.displayImage();
	},
	
	imageLoaded: function(){
		this.loaded = true;
		this.displayImage();
	},
	
	displayLoading: function(){
		this.removeDisplay();
		
		this.display =
		new Xu('div', true).
		setVar('id', 'ImagePopupManagerDiv').
		setStyle('position', 'absolute').
		append(
			new Xu('h1', true).
			append( new Xu('text', true, this.loadingText) ).
			get()
		).
		appendTo( new Xu().getByTag('body', 0) );
		
		this.centerDisplay();
	},
	
	displayImage: function(){
		this.removeDisplay();
		
		var image =
		new Xu('img', true).
		setVar('src', this.imagePath);
		
		var func = function(e, source, type){
			new Xu(source).getData('main').removeDisplay();
		}
		
		var closeLink =
		new Xu('a', true).
		setVar('href', 'javascript:;').
		setData('main', this).
		addEvent('onclick', func).
		append( new Xu('text', true, this.closeText) );
		
		this.display =
		new Xu('div', true).
		setVar('id', 'ImagePopupManagerDiv').
		setStyle('position', 'absolute').
		append( closeLink ).
		append(image).
		appendTo( new Xu().getByTag('body', 0) );
		
		if(this.description){
			this.display.
			append(
				new Xu('h1', true).
				append( new Xu('text', true, this.description) ).
				get()
			);
		}
		
		this.centerDisplay();
		/*if(location.href.indexOf('#') != -1){
			var newHref = location.href.split('#');
			newHref = newHref[0] + '#ImagePopupManagerDiv';
		}
		else var newHref = location.href + '#ImagePopupManagerDiv';
		location.href = newHref;*/
	},
	
	centerDisplay: function(){
		if(this.display == null) return;
		
		var SM        = new ScreenManager();
		var size      = SM.getSize();
		var scroll    = SM.getScroll();
		
		var divWidth  = parseInt(this.display.getStyle('width'));
		var divHeight = parseInt(this.display.getStyle('height'));
		
		
		if(!divWidth)  divWidth  = (this.image ? this.image.width : 0);
		if(!divHeight) divHeight = (this.image ? this.image.height + 20 : 0);
		
		if(divWidth) this.display.setStyle('width', (divWidth + 10) + 'px');
		
		var posX = scroll.scrollX + Math.round(size.width / 2 - (divWidth / 2));
		if(posX < 0) posX = 0;
		var posY = scroll.scrollY + Math.round(size.height / 2 - (divHeight / 2));
		if(posY < 168) posY = 168;
		
		this.display.
		setStyle('left', posX + 'px').
		setStyle('top',  posY + 'px');
	},
	
	removeDisplay: function(){
		if(this.display == null) return;
		
		new Xu( this.display.parentItem() ).removeItem(this.display.get());
		this.display = null;
	}
}

function applyPictureZoomByClass(className){
	var links = new Xu().getByClass('a', className);
	if(!links) return;
	
	for(var i = 0; i < links.length; ++i) new ImagePopupManager(new Xu(links[i]));
}

function applyAnimation(path){
	var swfDiv = new SWFObject(path + 'images/arredamento.swf', 'arredamento', '281', '153', '6', '#ffffff');
	swfDiv.write('flash');
}

function articleLinkAdder(){
	var articles = new Xu().getByClass('li', 'articolo');
	
	if(articles.length === 0) return;
	
	var article = null;
	var link    = null;
	var href    = null;
	var title   = null;
	var zoom    = null;
	for(var i = 0; i < articles.length; ++i){
		article = new Xu(articles[i]);
		
		link  = new Xu(article.getByClass('a', 'entra-titolo', 0));
		href  = link.getVar('href');
		title = link.getVar('title');
		
		article.
		append(
			new Xu('a', true).
			setVar('className', 'entra-link').
			setVar('href', href).
			setVar('title', title).
			append(
				new Xu('text', true, '» Entra')
			)
		);
		
		zoom = article.getByClass('a', 'zoom', 0);
		
		if(!zoom){
			new Xu(article.getByClass('div', 'immagine', 0)).
			append(
				new Xu('a', true).
				setVar('className', 'entra-link').
				setVar('href', href).
				setVar('title', title).
				append(
					new Xu(new Xu(article.getByClass('div', 'immagine', 0)).getByTag('img', 0))
				)
			);
		}
		else{
			new Xu('a', true).
			setVar('className', 'entra-link').
			setVar('href', href).
			setVar('title', title).
			append(
				new Xu(new Xu(article.getByClass('div', 'immagine', 0)).getByTag('img', 0))
			).
			insertBeforeItem(zoom);
		}
	}
}

function pageEnancher(page, param1){
	applyBlankTargetLinks();
	articleLinkAdder();
	
	var path = '';
	switch(page){
		case 'scheda_prodotto':      path = '../'; break;
		case 'categoria_principale': path = '../../'; break;
		case 'categoria_secondaria': path = '../../../'; break;
		case 'categoria_terziaria':  path = '../../../../'; break;
	}
	
	switch(page){
		case 'home':
		applyPictureZoomByClass('zoom');
		break;
		
		case 'categoria_principale':
		applyPictureZoomByClass('zoom');
		break;
		
		case 'categoria_secondaria':
		applyPictureZoomByClass('zoom');
		break;
		
		case 'categoria_terziaria':
		applyPictureZoomByClass('zoom');
		break;
		
		case 'carrello':
		applyDetailsHider();
		applyShoppingCartFormConfirm();
		applyShoppingCartSendFormConfirm();
		applyFormErrorHighlighter('modulo');
		break;
		
		case 'contatti':
		applyFormErrorHighlighter('modulo');
		break;
		
		case 'guida':
		applyFormErrorHighlighter('modulo');
		break;
		
		case 'pagamento_bonifico':
		sendGoogleOrderForm();
		break;
		
		case 'pagamento_paypal_riuscito':
		sendGoogleOrderForm();
		break;
		
		case 'registrazione':
		applyFormErrorHighlighter('modulo');
		break;
		
		case 'disconnessione':
		applyFormErrorHighlighter('modulo');
		break;
		
		case 'login':
		applyFormErrorHighlighter('modulo');
		break;
		
		case 'scheda_prodotto':
		applyPictureZoomByClass('zoom');
		applyFormErrorHighlighter('opzioni-articolo');
		new FormPriceUpdater();
		break;
	}
	
	new CategoriesHandler(path + 'images/', (param1 ? param1 : null));
	applyAnimation(path);
}
