/****************** MAIN OBJECT ********/
window.addEvent('domready', function() {
	browserEngine = new browserObj( );
} );

window.addEvent('unload', function() {
	browserEngine = null;
} );

function browserObj( )
{
	this.loops = new Array();
	
	this.initDocument();
	this.initControls(document);
	this.initActions(document);
	this.initDrags(document);
	
	document.addEvent('updateblock', function(obj) {
			if (obj.refreshplot == 'true')
				browserEngine.refreshPlot();
			if (obj.openclosefav == 'true')
				browserEngine.openCloseFav();
			browserEngine.initControls(obj);
			browserEngine.initActions(obj);
			browserEngine.initDrags(obj);
		}
	);
}

browserObj.prototype.initDocument = function( )
{
	var thisObj = this;
	
	if ($('favourites'))
	{
		// initialize document
		thisObj.favouritesPosition = window.ie6 ? 'absolute' : 'fixed';
		thisObj.favouritesContainer = $('favourites');
		thisObj.favouritesContainer.setStyles({'position': thisObj.favouritesPosition});
		thisObj.favourites = $('favourites-box');
		thisObj.favourites.toHeight = thisObj.favourites.getCoordinates().height;
		thisObj.favourites.fx = thisObj.favourites.effect('height', {duration:200, wait:false});
		thisObj.favourites.setStyles({ 'height': 1 });
		if (window.ie6)
		{
			window.addEvent('scroll', function() {
				browserEngine.posFav();
			} );
		}
		
		// add toggler
		thisObj.favourites.state = 0;
		var openCloseFav = (function() {
			var thisObj = this;
			if (thisObj.favourites.state == 1)
			{
				thisObj.closeFav();
				thisObj.favourites.state = 0;
			}
			else
			{
				thisObj.openFav();
				thisObj.favourites.state = 1;
			}
		}).bind(thisObj);
		thisObj.favouritesTitle = $('favourites-title');
		thisObj.favouritesTitle.addEvent('click', openCloseFav );
	}
}

browserObj.prototype.initControls = function( obj )
{
	var thisObj = this;
	
	var numbers = $(obj).getElementsByClassName('numbers');
	for (var x=0; x<numbers.length; x++)
	{
		thisObj.importRel( numbers[x] );
		numbers[x].onkeyup = numbers[x].onblur = function() { return browserEngine.ctrlNumbers(this, this.extrachars); }
 	}
	
	var range_sliders = $(obj).getElementsByClassName('range');
	for (var i=0; i<range_sliders.length; i++)
	{
		// import rel settings
		parts = range_sliders[i].getAttribute("rel").split('|');
		for (var j=0; j<parts.length; j++)
		{
			kv = parts[j].split(':');
			eval("range_sliders["+i+"]."+kv[0]+" = '"+kv[1]+"'");
		}
		thisObj.putRangeSlider( range_sliders[i] );
	}
	
	var thumbslides = $(obj).getElementsByClassName('thumbslide');
	for (var m=0; m<thumbslides.length; m++)
	{
		thisObj.importRel(thumbslides[m]);
		if (thumbslides[m].total > 1)
		{
			var proto = '';
			var pt = thumbslides[m].getProperty('src').split("/");
			for (var i=0; i<pt.length-1; i++)
			{
				proto += pt[i] + '/';
			}
			proto += thumbslides[m].dragget + '_[num].jpg';
			thumbslides[m].thumbslide = new Thumbchange( thumbslides[m], { total: thumbslides[m].total, proto: proto } );
			thumbslides[m].addEvent('mouseenter', function(event) {
				new Event(event).stop();
				this.thumbslide.start();
				return false;
			} );
			thumbslides[m].addEvent('mouseleave', function(event) {
				new Event(event).stop();
				this.thumbslide.stop();
				return false;
			} );
		}
 	}
	
	var galleries = obj.getElementsByClassName('gallery');
	for (var i=0; i<galleries.length; i++)
	{
		galleries[i].gallery = new gallery(galleries[i], {
			timed: true,
			delay: 4000,
			embedLinks: false,
			showInfopane: false
		});
	}
	
	var openWindows = $(obj).getElementsByClassName('open-window');
	for (var i=0; i<openWindows.length; i++)
	{
		openWindows[i].addEvent('click', function() {
			newWindow = window.open(this.href, 'window', "menubar=0,toolbar=0,location=0,status=0,scrollbars=0,width="+screen.width+",height=" + screen.height);
  			newWindow.moveTo(0,0);
		});
		openWindows[i].onclick = function() { return false; }
 	}
	
	var openPopups = $(obj).getElementsByClassName('open-popup');
	for (var i=0; i<openPopups.length; i++)
	{
		openPopups[i].addEvent('click', function() {
			browserEngine.wait(1);
			new Ajax(this.getProperty('href'), {
			method: 'get',
			evalScripts: true,
			onComplete: browserEngine.startPopup
			}).request();
		});
		openPopups[i].onclick = function() { return false; }
 	}
}

browserObj.prototype.initActions = function( obj )
{
	var thisObj = this;
	
	var ghosts = $(obj).getElements('[class^=after-]');
	for (var p=0; p<ghosts.length; p++)
	{
		var css = ghosts[p].getProperty('class');
		ghosts[p].setProperty( 'class', css.replace('after-','') );
 	}
	
	/**** AJAX RELATED *****/	
	var elements = $(obj).getElementsByClassName('exec');
	for (var i=0; i<elements.length; i++)
	{
		thisObj.importRel( elements[i] );
		thisObj.parseExec( elements[i] );
	}
	
	var updates = $(obj).getElementsByClassName('update');
	for (var v=0; v<updates.length; v++)
	{
		thisObj.importRel( updates[v] );
		if (updates[v].tagName == 'FORM')
			thisObj.updateFormDelay(updates[v]);
		if (updates[v].tagName == 'SELECT')
		{
			$(updates[v]).addEvent('change', function(event) {
				new Event(event).stop();
				browserEngine.feedSelect(this);
				return false;
			   	}
			);
		}
	}
	
	var loops = $(obj).getElementsByClassName('loop');
	for (var y=0; y<loops.length; y++)
	{
		thisObj.importRel( loops[y] );
		thisObj.startLoop( loops[y] );
	}
	
	/******* DHTML RELATED *****/
	var enables = $(obj).getElementsByClassName('enable');
	for (var q=0; q<enables.length; q++)
	{
		$(enables[q]).addEvent('change', function() {
				browserEngine.enableInputs(this);
			   	}
			);
		$(enables[q]).addEvent('click', function() {
				browserEngine.enableInputs(this);
			   	}
			);
 	}
	
	var expands = $(obj).getElementsByClassName('expand');
	for (var h=0; h<expands.length; h++)
	{
		expands[h].fx = new Fx.Slide($(expands[h].getProperty('rel')), {duration: 400}).hide();
		expands[h].fx.linkObj = expands[h];
		expands[h].addEvent('click', function(event) {
				new Event(event).stop();
				this.fx.toggle().chain(
					function() { this.linkObj.toggleClass('expand-selected');
					} );
				return false;
			   	}
			);
	}
	
	var selectables = $(obj).getElementsByClassName('selectable');
	for (var a=0; a<selectables.length; a++)
	{
		thisObj.importRel( selectables[a] );
		selectables[a].addEvent('mouseover', function(event) { return browserEngine.highlightRow(this); } );
		selectables[a].addEvent('mouseout', function(event) { return browserEngine.lowlightRow(this); } );
		selectables[a].addEvent('mousedown', function(event) { return browserEngine.selectRow(this); } );
 	}
}

browserObj.prototype.initDrags = function( obj )
{
	var thisObj = this;

	var draggables = $(obj).getElementsByClassName('drag');
	for (var u=0; u<draggables.length; u++)
	{
		thisObj.importRel( draggables[u] );
		thisObj.startDrag( draggables[u] );
	}	
}

browserObj.prototype.importRel = function( obj )
{
	if (obj.getProperty("rel"))
	{
		// import rel settings
		var parts = obj.getProperty("rel").split('|');
		for (var j=0; j<parts.length; j++)
		{
			kv = parts[j].split(':');
			eval("obj."+kv[0]+" = '"+kv[1]+"'");
		}
	}
}

browserObj.prototype.posFav = function( ) // damn IE6
{
	var thisObj = this;
	//document.title = (window.getScrollTop()+window.getHeight()-thisObj.favourites.getCoordinates().height);
	thisObj.favouritesContainer.setStyle('top', (window.getScrollTop()+window.getHeight()-thisObj.favouritesContainer.getCoordinates().height));
}

browserObj.prototype.openFav = function( )
{
	var thisObj = this;
	thisObj.favouritesTitle.addClass('fav-selected'); 
	thisObj.favourites.fx.start(thisObj.favourites.toHeight).chain( function() { if (window.ie6) browserEngine.posFav(); } );
}

browserObj.prototype.closeFav = function( )
{
	var thisObj = this;
	thisObj.favouritesTitle.removeClass('fav-selected'); 
	thisObj.favourites.fx.start(1).chain( function() { if (window.ie6) browserEngine.posFav(); } );;
}

browserObj.prototype.openCloseFav = function( )
{
	var thisObj = this;
	if (browserEngine.favourites.state != 1)
	{
		var funcOpen = thisObj.favourites.fx.start(thisObj.favourites.toHeight);
		var funcClose = thisObj.favourites.fx.start.delay(1000, thisObj.favourites.fx, 1);
		funcOpen.chain( function() { funcClose; } );
	}
}


browserObj.prototype.controlFx = function( obj, transaction )
{
	if (obj.fxTransaction != transaction)
	{
		obj.fxTransaction = transaction;
		switch (transaction)
		{
			case 'fade':
				obj.fx = obj.effects({duration: 400});
			break;
			case 'slide':
				obj.fx = new Fx.Slide(obj, {duration: 400});
			break;
		}
	}
}

browserObj.prototype.startFx = function( obj, transaction, HTML )
{
	var thisObj = this;

	thisObj.controlFx( obj, transaction );
	switch (transaction)
	{
		case 'fade':
			obj.fx.start ({'opacity': 1}).chain(function() {
				this.start({'opacity': 0});
			}).chain(function() {
				this.element.setHTML( HTML );
				this.start ({'opacity': 1});
				document.fireEvent('updateblock', this.element);
			});
		break;
		case 'slide':
			obj.fx.slideOut().chain(function() {
				this.element.setHTML( HTML );
				this.slideIn();
				document.fireEvent('updateblock', this.element);
			});
		break;
	}
}

browserObj.prototype.highlightRow = function( obj )
{
	obj.addClass('row-over');
}

browserObj.prototype.lowlightRow = function( obj )
{
	obj.removeClass('row-over');
}
browserObj.prototype.selectRow = function( obj )
{
	var container = $(obj.container);
	var items = container.getElementsByClassName('selectable');
	for (var i=0; i<items.length; i++)
	{
		items[i].removeClass('row-selected');	
	}
	obj.addClass('row-selected');
}
browserObj.prototype.enableInputs = function( obj )
{
	if (obj.checked)
		$(obj.getProperty('rel')).removeClass('disabled');
	else
		$(obj.getProperty('rel')).addClass('disabled');
	var inputs = $(obj.getProperty('rel')).getElementsBySelector('input,select,textarea');
	for (var i=0; i<inputs.length; i++)
	{
		inputs[i].disabled = !obj.checked;
	}
	var range_sliders = $(obj.getProperty('rel')).getElementsByClassName('range');
	for (var k=0; k<range_sliders.length; k++)
	{
		range_sliders[k].disabled = !obj.checked;
	}
}
browserObj.prototype.ctrlNumbers = function( obj, extrachars )
{
	var new_value = '';
	for(var i=0;i < obj.value.length; ++i)
    {
		var new_key = obj.value.charAt(i);
		if ( ( (new_key >= 0) && (new_key <= 9) ) || ( (extrachars) && (extrachars.indexOf(new_key) > -1)) )
		{
			new_value += new_key;	
		}
	}
	obj.value = new_value;
}

browserObj.prototype.parseExec = function( obj )
{
	obj.addEvent(obj.action, function(event) {
		new Event(event).stop();
		browserEngine.feedElement(this);
		return false;
		}
	);
}

browserObj.prototype.feedElement = function( obj )
{
	var thisObj = this;
	
	if (obj.get == 'same')
		var url = obj.href;
	else
		var url = obj.get;
	if (obj.tagName == 'SELECT')
		url += obj.options[obj.selectedIndex].value
	if ( (obj.tagName == 'A') && (obj.container) )
		thisObj.selectRow( obj );
	$(obj.targetEl).sourceEl = obj;
	$(obj.targetEl).setProperty('lasturl', url);
	if (obj.cachedHTML)
	{
		var func = thisObj.updateBlock.bind($(obj.targetEl));
		func( obj.cachedHTML );
	}
	else
	{
		thisObj.wait(1);
		new Ajax(url, {
			method: 'get',
			evalScripts: true,
			data: $(obj.targetEl),
			onComplete: browserEngine.updateBlock.bind($(obj.targetEl))//,
			//update: $(obj.targetEl)
		}).request();
	}
}

browserObj.prototype.feedSelect = function( obj )
{
	var thisObj = this;
	
	var url = obj.get
	url += obj.options[obj.selectedIndex].value
	url += '&ajax=true';
	thisObj.wait(1);
	new Ajax(url, {
		method: 'get',
		evalScripts: true
	}).request();
}

browserObj.prototype.updateFormDelay = function( obj )
{
	var thisObj = this;
	
	var inputs = obj.getElementsBySelector('input,select,textarea')
	for (var i=0; i<inputs.length; i++)
	{
		inputs[i].formObj = obj;
		var func = function() { browserEngine.waitFunction( browserEngine.updateForm, this.formObj.delay, { 'obj': this.formObj } ); return false; }
		$(inputs[i]).addEvent('change', func);
		$(inputs[i]).addEvent('keypress', func);
	}
}

browserObj.prototype.updateForm = function( )
{
	var thisObj = browserEngine;
	
	var params = thisObj.waitFunctionParams;
	var obj = params.obj;
	var url = obj.get;
	if (url.indexOf('?') > -1) url += '&'; else url += '?';
	var queryString = [];
	obj.getElements('.formSave').each(function(el){
		var name = el.name;
		var value = el.getValue();
		if (value === false || !name || el.disabled) return;
		var qs = function(val){
			queryString.push(name + '=' + encodeURIComponent(val));
		};
		if ($type(value) == 'array') value.each(qs);
		else qs(value);
	});
	url += queryString.join('&');
	thisObj.wait(1);
	new Ajax(url, {
		method: 'get',
		data: $(obj.targetEl),
		onComplete: browserEngine.updateBlock,
		evalScripts: true
	}).request();
}

browserObj.prototype.updateBlock = function( response )
{
	if (this.options)
		var obj = this.options.data;
	else
		var obj = this;
	
	browserEngine.wait(0);
	browserEngine.importRel( obj );
	
	if (obj.sourceEl)
	if (obj.sourceEl.transaction)
	{
		browserEngine.startFx( obj, obj.sourceEl.transaction, response );
		if (obj.sourceEl.cache == 'true') obj.sourceEl.cachedHTML = response;
		return;
	}
	// default action
	obj.setHTML(response);
	if (obj.sourceEl)
	if (obj.sourceEl.cache)
	if (obj.sourceEl.cache == 'true') obj.sourceEl.cachedHTML = response;
	document.fireEvent('updateblock', obj);
}

browserObj.prototype.refreshPlot = function( )
{
	var thisObj = this;
	
	thisObj.waitFunction( browserEngine.updateForm, 10, { 'obj': $('form-plot') } );	
}


browserObj.prototype.startPopup = function( response )
{
	var thisObj = browserEngine;
	
	thisObj.openPopup( response );
	thisObj.wait(0);
}

browserObj.prototype.startDrag = function( obj )
{
	var thisObj = this;
	
	obj.box = $(obj.targetEl);
	obj.drops = obj.getElementsByClassName( obj.items );
	for (var i=0; i<obj.drops.length; i++)
	{
		thisObj.importRel(obj.drops[i]);
		obj.drops[i].addEvent('mousedown', function(e) {
			e = new Event(e).stop();
			var clone = this.clone()
				.setStyles(this.getCoordinates())
				.setStyles({'opacity': 0.7, 'z-index': 1200, 'position': 'absolute', 'cursor': 'move'})
				.inject(document.body);
			clone.url = obj.get + obj.dropget + this.dragget;
			clone.startX = (e.page.x);
			clone.startY = (e.page.y);
			var drag = clone.makeDraggable({
				droppables: [obj.box],
				onStart: function() { obj.box.addClass('ondrag'); browserEngine.openFav(); },
				onComplete: thisObj.completeDrag,
				onDrag: thisObj.checkDragOver
			});
			/*clone.addEvent('mouseup', function(e) {
				e = new Event(e).stop();
				this.endX = (e.page.x);
				this.endY = (e.page.y);
				if (this.startX == this.endX && this.startY == this.endY)
					document.title = ('click');
				else
					document.title = ('not click');
			} );*/
			drag.start(e);
			
		});
	}
}

browserObj.prototype.checkDragOver = function( )
{
	var box = this.droppables[0];
	var windowPos = { 'offsetX': window.getScrollLeft(), 'offsetY': window.getScrollTop() };
	var pos = box.getCoordinates( );
	var now = {'x': this.mouse.now.x - (browserEngine.favouritesPosition == 'fixed' ? windowPos.offsetX : 0), 'y': this.mouse.now.y - (browserEngine.favouritesPosition == 'fixed' ? windowPos.offsetY : 0) };
	//document.title = window.getScrollTop() + ': ' + now.y +'<'+ pos.bottom +' | '+ now.y +'>'+ pos.top;
	if (now.x > pos.left && now.x < pos.right && now.y < pos.bottom && now.y > pos.top)
		return true;
	else
		return false;
}

browserObj.prototype.completeDrag = function( )
{
	var box = this.droppables[0];
	var ctrl = browserEngine.checkDragOver.bind(this);
	if (ctrl())
	{
		browserEngine.wait(1);
		new Ajax(this.element.url, {
			method: 'get',
			evalScripts: true,
			data: box,
			onComplete: browserEngine.updateBlock
		}).request();
		var delay = 1000;
	}
	else
	{
		var delay = 0;	
	}
	box.removeClass('ondrag');
	box.removeEvents();
	if (browserEngine.favourites.state != 1)
	{
		browserEngine.closeFav.bind(browserEngine).delay(delay);
	}
	this.element.remove();
}

browserObj.prototype.startLoop = function( obj )
{
	var thisObj = this;
	
	var indexLoop = thisObj.loops.length;
	var items = obj.getElementsByClassName('exec');
	thisObj.loops[indexLoop] = { 
		'obj': obj,
		'items': items,
		'interval': window.setInterval( "browserEngine.stepLoop("+indexLoop+")", obj.timer ),
		'loopIndex': obj.startIndex || 0,
		'transaction': obj.transaction
		};
	for (var i=0; i<items.length; i++)
	{
		if (obj.cache == 'true')
			items[i].cache = 'true';
		items[i].indexLoop = indexLoop;
		items[i].addEvent(items[i].action, function(event) {
			new Event(event).stop();
			browserEngine.stopLoop(this.indexLoop);
			return false;
			}
		);	
	}
}

browserObj.prototype.stepLoop = function( indexLoop )
{
	var thisObj = this;
	
	var _item = thisObj.loops[indexLoop].items[thisObj.loops[indexLoop].loopIndex];
	thisObj.feedElement(_item);
	if (thisObj.loops[indexLoop].loopIndex >= (thisObj.loops[indexLoop].items.length - 1) )
		thisObj.loops[indexLoop].loopIndex = 0;
	else
		thisObj.loops[indexLoop].loopIndex++;
}

browserObj.prototype.stopLoop = function( indexLoop )
{
	var thisObj = this;
	window.clearInterval( thisObj.loops[indexLoop].interval );
}

browserObj.prototype.waitFunction = function( func, delay, params )
{
	var thisObj = this;
	
	if (thisObj.waitFunctionTimer)
		clearTimeout(thisObj.waitFunctionTimer);
	thisObj.waitFunctionParams = params;
	thisObj.waitFunctionTimer = window.setTimeout(func, delay);
}

/********** POPUP ******************/
browserObj.prototype.openPopup = function( HTML )
{
	var thisObj = this;
	
	if (!thisObj.popup)
	{
		// construct popup layer
		thisObj.popup = new Element('div', {'id': 'popup'} ).injectTop($E('body'));
		thisObj.popupContainer = new Element('div').injectTop(thisObj.popup);
		thisObj.popup.setStyles( {'position': 'absolute', 'zIndex': 1000} );
		thisObj.popup.fx = new Fx.Style(thisObj.popup, 'opacity').set(0);
	}
	thisObj.obscure('all');
	thisObj.popupContainer.setHTML( HTML );
	thisObj.initControls( thisObj.popup );
	thisObj.initActions( thisObj.popup );
	thisObj.putClose( );
	thisObj.centerElement( thisObj.popup );
	thisObj.popup.setStyle('display', 'block');
	thisObj.popup.fx.start(0,1);
}

browserObj.prototype.centerElement = function( popup )
{
	var popupPos = popup.getCoordinates();
	var win = {'x': window.getWidth(), 'y': window.getHeight()};
	var scroll = {'x': window.getScrollLeft(), 'y': window.getScrollTop()};
	popupPos.left = ( win.x - popupPos.width ) / 2 + scroll.x;
	popupPos.top = ( win.y - popupPos.height ) / 2 + scroll.y ;
	if (popupPos.left < 0)	popupPos.left = 0;
	if (popupPos.top < 0)	popupPos.top = 0;
	popup.setStyle('left', popupPos.left);
	popup.setStyle('top', popupPos.top);
}


browserObj.prototype.putClose = function( )
{
	var thisObj = this;
	
	var popupPos = thisObj.popup.getCoordinates();
	if (!thisObj.popup.closeEl)
	{
		thisObj.popup.closeEl = new Element('a', {'class':'close'}).setHTML('Chiudi');
		thisObj.popup.closeEl.setProperty('title', 'Chiudi');
		thisObj.popup.closeEl.setProperty('href', '#');
		thisObj.popup.closeEl.toClose = thisObj.popup;
		thisObj.popup.closeEl.addEvent("click", function() 
		{
			this.toClose.fx.start(1,0).chain( function() { browserEngine.obscure('all'); browserEngine.popup.remove(); browserEngine.popup = null; } );
		});
		thisObj.popup.closeEl.onclick = function() { return false; }
		thisObj.popup.closeEl.injectTop( thisObj.popup );
	}
	//thisObj.popup.closeEl.setStyle('margin-left', popupPos.width - thisObj.popup.closeEl.getCoordinates().width);
	//thisObj.popup.closeEl.setStyle('margin-top', thisObj.popup.closeEl.getCoordinates().height );
}


browserObj.prototype.obscure = function( obj )
{
	var thisObj = this;
	
	if (!thisObj.waitDiv)
	{
		// construct wait layer
		thisObj.waitDiv = new Element('div').injectTop(document.body);
		thisObj.waitDiv.setStyles( {'position': 'absolute', 'background': '#000', 'z-index': 999} );
		thisObj.waitDiv.fx = new Fx.Style(thisObj.waitDiv, 'opacity').set(0);	
	}
	
	if (thisObj.waitLayerOpen)
	{
		thisObj.waitDiv.fx = new Fx.Style(thisObj.waitDiv, 'opacity').start(.7,0);
		thisObj.waitLayerOpen = false;
		if (window.ie6) $E('body').removeClass('obscured');
	}
	else
	{
		if (obj == 'all')
			var objPos = {'top': 0, 'left': 0, 'width': window.getScrollWidth(), 'height': window.getScrollHeight()};
		else
			var objPos = obj.getCoordinates();
		thisObj.waitDiv.setStyle('width', objPos.width);
		thisObj.waitDiv.setStyle('height', objPos.height);
		thisObj.waitDiv.setStyle('left', objPos.left);
		thisObj.waitDiv.setStyle('top', objPos.top);
		thisObj.waitDiv.fx = new Fx.Style(thisObj.waitDiv, 'opacity').start(0,.7);
		thisObj.waitLayerOpen = true;
		if (window.ie6) $E('body').addClass('obscured');
	}
}

browserObj.prototype.wait = function( status )
{
	var thisObj = this;
	
	if (status > 0)
	{
		$E('body').addClass('wait');
	}
	else
	{
		$E('body').removeClass('wait');
	}
}

/********** M A P **************************/
browserObj.prototype.startMap = function( obj, full )
{
	var thisObj = this;
	
	var item_maps = obj.getElementsByClassName('item-map');
	
	for (var k=0; k<item_maps.length; k++)
	{
		var item_map = item_maps[k];
		thisObj.importRel( item_map );
		/** CONSTRUCT MAP **/	
		item_map.gMap = new GMap2(item_map);
		item_map.center = new GLatLng(item_map.lat, item_map.lng);
		item_map.gMap.addControl(new GSmallMapControl());
		item_map.gMap.setCenter(item_map.center, 9);
		var marker = new GMarker(item_map.center);
		item_map.gMap.addOverlay(marker);
		/////////////////////
	}
	
	var maps = obj.getElementsByClassName('map');
	
	for (var i=0; i<maps.length; i++)
	{
		var map = maps[i];
		var coords = new Array();
		thisObj.importRel( map );
		map.coords = map.getElementsByClassName('coord');
		
		/////////////////////
		for (var i=0; i<map.coords.length; i++)
		{
			thisObj.importRel( map.coords[i] );
			if (map.coords[i].lat.length > 0)
			{
				coords[i] = new Array(map.coords[i].lat, map.coords[i].lng, map.coords[i].get, map.coords[i].total, map.coords[i].innerHTML, map.coords[i].getProperty('title') );
			}
		}
		
		/** CONSTRUCT MAP **/	
		map.gMap = new GMap2(map);
		map.center = new GLatLng(map.lat, map.lng);
		if (full)
		{
			map.gMap.addControl(new GLargeMapControl());
			map.gMap.addControl(new GMapTypeControl());
		}
		else
		{
			map.gMap.addControl(new GSmallMapControl());
		}
		map.gMap.setCenter(map.center, (full ? 10 : 9) );
		
		for (var i=0; i<coords.length; i++)
		{
			coords[i].pixel = map.gMap.fromLatLngToDivPixel(new GLatLng(coords[i][0], coords[i][1]));
			coords[i].marker = thisObj.createMarker( coords[i][0], coords[i][1], coords[i][2], coords[i][3], coords[i][4] );
			coords[i].marker.linkMap = map.gMap;
			map.gMap.addOverlay(coords[i].marker);
			coords[i].marker.tooltip = thisObj.createToolTip(map.gMap, coords[i].marker, '<h4>'+coords[i][5]+'</h4><span>' + coords[i][3] + ' annunci</span>');
		}
	}
}

browserObj.prototype.openWindow = function( response )
{
	this.openInfoWindowHtml(response);
}

browserObj.prototype.createMarker = function( lat, lng, url, total, HTML )
{
	var thisObj = this;
	
	var image = 'templates/images/icons/marker-';
	var icon = new GIcon();
	if (total > 20)
	{
		image += 'red.png';
		width = 20;
		height = 38;
	}
	else if (total > 10)
	{
		image += 'orange.png';
		width = 16;
		height = 30;
	}
	else
	{
		image += 'green.png';
		width = 10;
		height = 19;
	}
  	icon.image = image;
	icon.iconSize = new GSize(width, height);
	icon.shadow = "templates/images/icons/none.png";
	icon.shadowSize = new GSize(width, height);
	icon.iconAnchor = new GPoint(width/2, height);
	icon.infoWindowAnchor = new GPoint(width/2, height*0.3);
	icon.infoShadowAnchor = new GPoint(0, 0);
	var marker = new GMarker(new GLatLng(lat, lng), { icon: icon }
	);
	marker.width = width;
	marker.height = height;
	
	GEvent.addListener(marker, "click", function() {
		new Ajax(url, {
			method: 'get',
			evalScripts: true,
			onComplete: browserEngine.openWindow.bind(this)
		}).request();
	} );
	GEvent.addListener(marker, "mouseover", function() {
		pointPx = this.linkMap.fromLatLngToDivPixel(this.getPoint());
		this.tooltip.setStyles( { display: 'block', left:pointPx.x+(this.width/2), top:pointPx.y-this.height } )
	}.bind(marker) );
	GEvent.addListener(marker, "mouseout", function() {
		this.tooltip.setStyle('display', 'none');
	}.bind(marker) );
	return marker;
}

browserObj.prototype.createToolTip = function( map, marker, text )
{
	var tooltip = new Element('span', {'class': 'map-tooltip'} ).setStyles({position:'absolute', display:'none'}).setHTML(text);
	map.getPane(G_MAP_MARKER_PANE).appendChild(tooltip);
	return tooltip;
}

/**********  C O N T R O L S ***************/
/**
<div class="range-slider">
	<div class="knob"></div>
</div>
**/
browserObj.prototype.putRangeSlider = function( obj )
{
	var thisObj = this;
	
	// saving inputs
	obj.inputFrom = obj.getElementsByClassName('from')[0];
	obj.inputTo = obj.getElementsByClassName('to')[0];
	var fromValue = parseInt(obj.inputFrom.getProperty('value'));
	var toValue = parseInt(obj.inputTo.getProperty('value'));
	obj.slider = new Element('div', {'class': 'range-slider'} ).injectInside(obj);
	obj.knobLeft = new Element('div', {'id':'knob-left', 'class': 'range-knob'} ).injectInside(obj.slider);
	obj.knobRight = new Element('div', {'id':'knob-right', 'class': 'range-knob'} ).injectInside(obj.slider);
	obj.rangeSlider = new RangeSlider(obj.slider, obj.knobLeft, obj.knobRight, {
		onChange: function(step){
			obj.inputFrom.setProperty('value', step.from);
			obj.inputTo.setProperty('value', step.to);
			if (!obj.disabled)
			{
				obj.inputFrom.fireEvent('change', '');
				obj.inputTo.fireEvent('change', '');
			}
		},
		steps: obj.steps.toInt(),
		minValue: obj.min.toInt(),
		maxValue: obj.max.toInt()
	}).set( { from: fromValue, to: toValue } );
	// actions...
	obj.inputFrom.addEvent('change', function()
	{
		obj.rangeSlider.setFrom( parseInt(this.getProperty('value')) );
	} );
	obj.inputTo.addEvent('change', function()
	{
		obj.rangeSlider.setTo( parseInt(this.getProperty('value')) );
	} );
}

function loadJS( file )
{
	var e = document.createElement("script");
   	e.src = file;
   	e.type="text/javascript";
   	document.getElementsByTagName("head")[0].appendChild(e);
}