var f = null;

window.addEvent('domready', function() {
	init();
	
	if (f)
		f.screenEnter();
});

window.addEvent('load', function() {
	if (f)
		f.screenEnter();
} );

window.addEvent('unload', function() {
	f = null;
});

function init()
{
	f = new Engine();
	if (f.checkCompatibility())
	{
		f.history = new HistoryManager();
		
		f.screenCreate();
		f.init( document );
		
		f.history.start();
	}
}

var Engine = new Class({

	checkCompatibility: function( )
	{
		if (Browser.Engine.name == 'trident' && Browser.Engine.version < 5)
		{
			// make alert
			self.location.href = 'changeie.php';
			return false;
		}
		return true;
	},
	
	init: function( obj )
	{
		// everywhere
		this.overflows( obj.getElements('.overflow') );
		this.slideMenus( obj.getElements('.slide-menu') );
		this.carousels( obj.getElements('.carousel') );
		this.reflects( obj.getElements('.reflect') );
		this.relabels( obj.getElements('.relabel') );
		this.loads( obj.getElements('.multiload') );
		this.popups( obj.getElements('.popup') );
		
		this.contacts( obj.getElements('.contact-control') );
		
		// release
		this.timelines( obj.getElements('.timeline') );
		this.tracks( obj.getElements('.tracks') );
		
		// gallery
		this.galleries( obj.getElements('.gallery') );
		
		// xperimental
		this.scrollers( obj.getElements('.scroller') );
		this.marquees( obj.getElements('.marquee') );
		this.columns( obj.getElements('.column') );
		this.fontTitles( obj.getElements('.font-title') );
		
		// services
		this.addthis( obj.getElement('.addthis') );
		
		this.reloadLinks( obj.getElements('a') );
	},
	
	slideMenus: function( objs )
	{
		objs.each( this.slideMenu.bind(this) );
	},
	
	slideMenu: function( obj )
	{
		obj.importOptions();
		if (!obj.options.fx)
			obj.options.fx = 'left';
		if (!obj.options.duration)
			obj.options.duration = 300;
		
		obj.knob = new Element('a', {'href': 'javascript:;', 'class': 'slide-menu-knob'}).setStyles({'position': 'relative'}).inject( obj, 'before' ); // 'before'
		obj.fx = new Fx.Morph( obj.knob, {duration: parseInt(obj.options.duration), link: 'cancel', transition: Fx.Transitions.Quad.easeInOut} ).set( {
			'left': 0,
		    'background-position': '0px 0px',
			'width': 0
		} );
		obj.cols = obj.getElements('li');
		obj.items = obj.getElements('li a');
		obj.defaultIndex = 0;
		for (var i=0; i<obj.items.length; i++)
		{
			obj.cols[i].addEvent('mouseenter', this.slideToMenu.pass([obj, i], this) );
			obj.items[i].addEvent('selected', this.setSlideIndex.pass([obj, i], this) );
			obj.items[i].addEvent('clicked', this.slideToMenu.pass([obj, i], this) );
			obj.items[i].addEvent('clicked', this.setSlideIndex.pass([obj, i], this) );
			
			if (obj.items[i].hasClass('slide-menu-selected'))
				obj.defaultIndex = i;
		}
		this.slideToMenu( obj, obj.defaultIndex );
		
		var el = (!obj.options.menuleave ? obj.knob : obj);
		
		//obj.addEvent('mouseleave', function(obj) { obj.outTimer = this.slideToMenu.delay( 300, this, [ obj, obj.defaultIndex ] ); }.pass([obj], this) );
		el.addEvent('mouseleave', function(obj) { this.slideToMenu( obj, obj.defaultIndex ); }.pass(obj, this) );
		obj.knob.addEvent('mouseenter', function(obj) { $clear(obj.outTimer); }.pass(obj, this) );
	},
	
	slideToMenu: function( obj, i )
	{
		var p = obj.items[i].getPosition();
		var s = obj.items[i].getSize();
		var pm = obj.getPosition();
		switch (obj.options.fx)
		{
			case 'left':
				obj.fx.start({
	    			'left': (p.x - pm.x),
		    		'background-position': -(p.x - pm.x) + 'px 0px',
					'width': s.x
				});
			break;
			case 'fade':
				obj.fx.start({'opacity': 0}).chain( function(obj) {
					obj.fx.set({
		    			'left': (p.x - pm.x),
			    		'background-position': -(p.x - pm.x) + 'px 0px',
						'width': s.x
					});
					obj.fx.start({ 'opacity': 1 });
				}.pass(obj) );
			break;
		}
		obj.knob.set('href', obj.items[i].get('href') );
		obj.knob.removeEvents( 'click' );
		obj.knob.cloneEvents( obj.items[i] );
		obj.knob.addEvent('click', this.setSlideIndex.pass([obj, i], this) );
	},
	
	setSlideIndex: function( obj, i )
	{
		obj.defaultIndex = i;
	},
	
	carousels: function( objs )
	{
		objs.each( this.carousel.bind(this) );
	},
	
	carousel: function( obj )
	{
		obj.importOptions();
		if (!obj.options.ipm)
			obj.options.ipm = 1;
		else
			obj.options.ipm = parseInt( obj.options.ipm );
		
		obj.index = 0;
		
		var sel = '.'+(obj.options.items || 'carousel-item');
		if (obj.options.loop)
		{
			var temps = obj.getElements( sel );
			
			if (temps.length <= obj.options.ipm)
			{
				var num = temps.length;
				for (var i=0; i<num; i++)
				{
					temps[temps.length+i] = temps[i].clone().inject( temps[temps.length-1], 'after' );
				}
			}
			
			var temps = obj.getElements( sel );
			var shadow = []
			for (var i=(temps.length-obj.options.ipm); i < temps.length; i++)
				if (temps[i])
					shadow[i] = temps[i].clone().inject( temps[0], 'before' );
			for (var i=obj.options.ipm-1; i >= 0; i--)
				if (temps[i])
					shadow[i] = temps[i].clone().inject( temps[temps.length-1], 'after' );
			obj.index = obj.options.ipm;
		}
		
		obj.items = obj.getElements( sel );
		obj.maxindex = ( (obj.items.length >= parseInt(obj.options.ipm)) ? obj.items.length-parseInt(obj.options.ipm) : 0);
		
		if (obj.options.triggers)
			obj.triggers = document.getElements( '.' + obj.options.triggers );
		
		obj.width = obj.items[0].getSize().x;
		obj.height = 0;
		for (var i=0; i<obj.items.length; i++)
			if (obj.items[i].getSize().y > obj.height)
				obj.height = obj.items[i].getSize().y;
		obj.container = new Element('div', {'class': 'carousel-container'}).setStyles( { 'overflow': 'hidden', 'width': obj.width * obj.options.ipm, 'height': obj.height, 'position': 'relative' } ).inject( obj, 'top' );
		obj.slider = new Element('div', {'class': 'carousel-slider'}).inject( obj.container, 'top' );
		obj.fx = new Fx.Tween( obj.slider, {property: 'margin-left', duration: (obj.options.duration || 1000), fps: 100, link: 'cancel', transition: Fx.Transitions.Quad.easeInOut} );
		obj.fx.addEvents( {
			'start': function(obj) { obj.fx.playing = true; }.pass(obj, this),
			'complete': function(obj) { obj.fx.playing = false; }.pass(obj, this)
		} )
		
		var pos = (obj.options.posfix ? parseInt(obj.options.posfix) : 0);
		var total = 0;
		for (var i=0; i<obj.items.length; i++)
		{
			obj.items[i].inject( obj.slider );
			total += obj.items[i].getSize().x;
			obj.items[i].setStyles( { 'float': 'left', 'width': obj.width } );
			obj.items[i].fx = new Fx.Tween( obj.items[i], {property: 'opacity', duration: (obj.options.duration ? (obj.options.duration/2) : 500), fps: 100, link: 'chain'} );
			if (obj.triggers && obj.triggers[i].hasClass('carousel-trigger-selected'))
				pos = i;
		}
		
		if (obj.options.prevnext)
		{
			obj.next = new Element('a', {'class': 'carousel-next', 'href': 'javascript:;'}).set('html', '<span>Avanti</span>').addEvent('click', this.carouselStep.pass([obj, 1], this) ).inject( obj, 'before' );
			obj.prev = new Element('a', {'class': 'carousel-prev', 'href': 'javascript:;'}).set('html', '<span>Indietro</span>').addEvent('click', this.carouselStep.pass([obj, -1], this) ).inject( obj, 'before' );
		}
		
		if (obj.triggers)
		for (var i=0; i<obj.triggers.length; i++)
		{
			obj.triggers[i].addEvent('click', function(obj, i) { obj.triggers[i].fireEvent('selected'); this.carouselStep( obj, i-obj.index ); }.pass([obj, i],this) );
		}
		if (obj.options.wheel)
		{
			obj.slider.addEvent('mousewheel', function(e) {
				new Event(e).stop();
				var dir = -e.wheel;
				this.carouselStep( obj, dir );
			}.bind(this) );
		}
		
		obj.slider.setStyles( { 'width': total } );
		this.carouselStep( obj, pos );
		
		if (obj.options.autoplay)
		{
			this.carouselStep.periodical( 5000, this, [obj, 1] );
		}
	},
	
	carouselStep: function( obj, dir )
	{
		if (obj.fx.playing) return;
		
		if (obj.options.loop)
			this.carouselResetLoop( obj, dir );
		
		obj.index = (obj.index + dir).limit(0, obj.maxindex);
		obj.prevIndex = (obj.index + dir);
		obj.fx.start( -(obj.index * obj.width) );
		
		for (var i=0; i<obj.items.length; i++)
			if (i == obj.index)
				obj.items[i].fireEvent('show');
			else
				obj.items[i].fireEvent('hide');
		
		obj.fireEvent('change');
		this.carouselStepHide( obj );
	},
	
	carouselResetLoop: function( obj, dir )
	{
		if ( (obj.index + dir) > (obj.maxindex) )
		{
			var steploop = true;
			obj.index = obj.options.ipm;
		}
		if ((obj.index + dir) < 0)
		{
			var steploop = true;
			obj.index = obj.items.length - (obj.options.ipm * 2);
		}
		
		if (steploop)
		{
			obj.fireEvent('steploop');
			for (var i=0; i < obj.items.length; i++)
			{
				if ( (i >= obj.index ) && (i < (obj.index + parseInt(obj.options.ipm)) ) )
					obj.items[ i ].fx.set( 1 );
				else
					obj.items[ i ].fx.set( 0 );
			}
			obj.fx.set( -(obj.index * obj.width) );
		}
	},
	
	carouselStepHide: function( obj )
	{
		for (var i=0; i < obj.items.length; i++)
		{
			if ( (i >= obj.index ) && (i < (obj.index + parseInt(obj.options.ipm)) ) )
				obj.items[ i ].fx.start.delay( (obj.options.duration ? (obj.options.duration/2) : 500), obj.items[ i ].fx, 1 );
			else
				obj.items[ i ].fx.start( 0 );
		}
		
		if (obj.options.loop) return;
		if (obj.prev)
			if (obj.index == 0)
				obj.prev.fade('out'); // hide prev arrow
			else
				obj.prev.fade('in'); // restore prev arrow
		
		if (obj.next)
			if (obj.index == (obj.maxindex))
				obj.next.fade('out'); // hide next arrow
			else
				obj.next.fade('in'); // restore v arrow
	},
	
	reflects: function( objs )
	{
		objs.each( this.reflect.bind(this) );
	},
	
	reflect: function( obj )
	{
		obj.importOptions();
		var psize = obj.getParent().getSize();
		obj.glossy = new Element('span', {'class': 'reflect-glossy'}).setStyles({'position': 'relative', 'display': 'block', 'width': psize.x, 'height': psize.y, 'margin-bottom': -psize.y}).inject( obj, 'before' );
		obj.reflect( {'height': .05, 'opacity': .7} );
	},
	
	relabels: function( objs )
	{
		objs.each( this.relabel.bind(this) );
	},
	
	relabel: function( obj )
	{
		var frm = obj.getParent('form');
		var labels = frm.getElements('label');
		for (var i=0; i<labels.length; i++)
		{
			if (labels[i].get('for') == obj.get('id'))
				obj.defaultValue = labels[i].get('html');
		}
		obj.set('value', obj.defaultValue);
		obj.addEvent('focus', function(obj) {
			if (obj.get('value') == obj.defaultValue)
				obj.set('value', '');
		}.pass(obj, this) );
		obj.addEvent('blur', function(obj) {
			if (obj.get('value') == '')
				obj.set('value', obj.defaultValue);
		}.pass(obj, this) );
	},
	
	timelines: function( objs )
	{
		objs.each( this.timeline.bind(this) );
	},
	
	timeline: function( obj )
	{
		//obj.yplotwidth = 403;   // temp
		obj.yplotwidth = 330;   // temp 800
		obj.yplotheight = 160;  // temp
		obj.ytlwidth = 180;	// temp
		obj.ytlheight = 40; // temp
		obj.steps = 100;		// temp 
		
		obj._items = obj.getElements('.timeline-item');
		obj.items = []
		obj.years = []
		obj.from = 20000;
		obj.to = 0;
		for (var i=0; i<obj._items.length; i++)
		{
			var y = parseInt( obj._items[i].get('rel') );
			if (obj.years[ y ])
				obj.years[ y ]++;
			else
				obj.years[ y ] = 1;
			if (obj.from > y)	obj.from = y;
			if (obj.to < y)		obj.to = y;
		}
		obj.totitems = 0;
		for (var i=obj.from; i <= obj.to; i++)
		{
			var found = false;
			for (var k=0; k<obj._items.length; k++)
			{
				var y = parseInt( obj._items[k].get('rel') );
				if (i == y)
				{
					obj.items[ obj.items.length ] = obj._items[k];
					found = true;
				}
			}
			if (!found)
				obj.items[ obj.items.length ] = new Element('div', {'rel': i } );
			if (!obj.years[i])
				obj.years[i] = 1;
			obj.totitems += obj.years[i];
		}
		obj.numyears = (obj.to - obj.from) + 1;
		
		// plot
		obj.plot = new Element('div', {'class': 'tl-plot'} ).setStyles( { 'clear': 'both', 'overflow': 'hidden', 'width': '100%', 'height': obj.yplotheight } ).inject( obj );
		obj.plot.size = obj.plot.getSize();
		obj.plot.years = [];
		obj.slider = new Element('div', {'class': 'tl-slider'} ).setStyles({'width': obj.totitems * obj.yplotwidth, 'height': obj.yplotheight}).inject( obj.plot );
		obj.slider.fx = new Fx.Tween( obj.slider, {link: 'cancel', duration: 2000, fps: 50, transition: Fx.Transitions.Quad.easeOut } );
		
		// timeline
		obj.timeline = new Element('div', {'class': 'tl-timeline'} ).setStyles( {'clear': 'both'} ).inject( obj );	
		obj.timeline.size = obj.timeline.getSize();
		obj.timeline.plot = new Element('div', {'class': 'tl-timeline-plot'} ).setStyles( { 'clear': 'both', 'overflow': 'hidden', 'width': '100%', 'height': obj.ytlheight } ).inject( obj.timeline );
		obj.timeline.slider = new Element('div', {'class': 'tl-timeline-slider'} ).setStyles({'width': obj.numyears * obj.ytlwidth, 'height': obj.ytlheight}).inject( obj.timeline.plot );
		obj.timeline.slider.fx = new Fx.Tween( obj.timeline.slider, {link: 'cancel', transition: Fx.Transitions.Quad.easeOut } );
		obj.timeline.years = [];
		obj.timeline.ybullets = [];
		//obj.timeline.ywidth = parseInt( obj.timeline.size.x / (obj.to - obj.from + 1) );
			
		obj.timeline.bullets = new Element('div', {'class': 'tl-timeline-bullets'}).inject( obj.timeline.slider );
		for (var i=obj.from; i <= obj.to; i++)
		{
			// timeline
			var ybox = new Element('div', {'class': 'tl-timeline-year', 'html': '<span class="tl-timeline-ylabel">'+i+'</span>'} ).setStyles( {'float': 'left', 'width': obj.ytlwidth } ).inject( obj.timeline.bullets );
			obj.timeline.years[ obj.timeline.years.length ] = ybox;
			for (var k=0; k<obj.items.length; k++)
			{
				var y = parseInt( obj.items[k].get('rel') );
				if (y == i)
				{
					// create bullet
					if (obj.items[k].getElement('a'))
					{
						var bullet = new Element('a', {'href': 'javascript:;', 'html': '<span>'+i+'</span>', 'class': 'tl-timeline-bullet'}).inject( ybox );
						bullet.cloneEvents( obj.items[k].getElement('a'), 'click' );
						obj.timeline.ybullets[ obj.timeline.ybullets.length ] = bullet;
					}
				}
			}
			// plot
			var ybox = new Element('div', {'class': 'tl-plot-year'} ).setStyles( {'float': 'left', 'width': obj.yplotwidth * obj.years[ i ] } ).inject( obj.slider );
			var yboxcontent = new Element('div', {'class': 'tl-plot-year-content', 'html': '<span class="tl-plot-ylabel">'+i+'</span>' } ).inject( ybox );
			
			obj.plot.years[ obj.plot.years.length ] = yboxcontent;
			for (var k=0; k<obj.items.length; k++)
			{
				var y = parseInt( obj.items[k].get('rel') );
				if (y == i)
				{
					obj.items[k].inject( yboxcontent );
				}
			}
		}
		
		obj.timeline.scroller = new Element('div', {'class': 'tl-timeline-scroller'} ).setStyles( {'clear': 'both'} ).inject( obj.timeline );
		obj.timeline.scrollerBox = new Element('div', {'class': 'tl-timeline-scroller-box'} ).inject( obj.timeline.scroller );
		obj.timeline.knob = new Element('div', {'class': 'tl-timeline-knob'} ).inject( obj.timeline.scrollerBox );
		
		obj.slide = new Slider(obj.timeline.scrollerBox, obj.timeline.knob, {
			steps: obj.steps,
			//range: [obj.from, obj.to],
			onChange: this.moveTimeline.pass(obj,this)
		});
		obj.slide.set( obj.steps );
		this.moveTimeline( obj );
	},
	
	moveTimeline: function( obj )
	{
		obj.slider.fx.cancel();
		
		var pos = (Math.floor( obj.totitems / obj.steps * obj.slide.step ) - 1 );
		if (pos < 0) pos = 0;
		
		var plotwidth = ( (obj.totitems * obj.yplotwidth) - obj.plot.size.x);
		var tlwidth = ( (obj.numyears * obj.ytlwidth) - obj.timeline.size.x);
		var ml_plot = -( plotwidth / obj.steps * obj.slide.step);
		var ml_tl = -( (parseInt(obj.items[pos].get('rel')) - obj.from) * (tlwidth / (obj.numyears-1)) );
		
		// plot
		if ( obj.slide.isDragging )
			obj.slider.fx.set( 'margin-left', ml_plot );
		else
			obj.slider.fx.start( 'margin-left', ml_plot );
		
		// timeline	
		if ( obj.slide.isDragging )
			obj.timeline.slider.fx.set( 'margin-left', ml_tl );
		else
			obj.timeline.slider.fx.start( 'margin-left', ml_tl );
	},
	
	tracks: function( objs )
	{
		objs.each( this.track.bind(this) );
	},
	
	track: function( obj )
	{
		obj.index = null; obj.action = null;
		obj.items = obj.getElements('.track');
		for (var i=0; i<obj.items.length; i++)
		{
			if ((i%2)==0) 	obj.items[i].addClass('odd');
			else			obj.items[i].addClass('even');
			
			obj.items[i].sample = obj.items[i].getElement('a').get('rel');
			obj.items[i].getElement('a').addEvent('click', function(e) { new Event(e).stop(); } );
			obj.items[i].getElement('a').addEvent('click', this.trackBtn.pass([obj, i, 'info'], this) );
			var num = new Element('span', {'class': 'track-number', 'html': i+1}).inject( obj.items[i], 'top' );
			var btns = new Element('span', {'class': 'track-buttons'}).inject( obj.items[i] );
			var info = new Element('a', {'class': 'track-buttons-info', 'html': '<span>info</span>', 'href': 'javascript:;'}).addEvent('click', this.trackBtn.pass([obj, i, 'info'], this) ).inject( btns );
			if (obj.items[i].sample)
				var listen = new Element('a', {'class': 'track-buttons-listen', 'html': '<span>listen</span>', 'href': 'javascript:;'}).addEvent('click', this.trackBtn.pass([obj, i, 'listen'], this) ).inject( btns );
			else
				var listen = new Element('a', {'class': 'track-buttons-listen_disabled', 'html': '<span>listen</span>', 'href': 'javascript:;'}).inject( btns );
			if (obj.items[i].hasClass('track-can-buy'))
				var buy = new Element('a', {'class': 'track-buttons-buy', 'html': '<span>buy</span>', 'href': 'javascript:;'}).addEvent('click', function() { new Fx.Scroll(window).toElement('release-buy'); }.pass([obj, i, 'buy'], this) ).inject( btns );
			else
				var buy = new Element('a', {'class': 'track-buttons-buy_disabled', 'html': '<span>buy</span>', 'href': 'javascript:;'}).inject( btns );
			obj.items[i].btns = btns; obj.items[i].info = info; obj.items[i].listen = listen; //obj.items[i].buy = buy;
			
			var cont = new Element('div').setStyles({'clear': 'both'}).inject( obj.items[i], 'bottom' );
			obj.items[i].panel = new Element('div', {'class': 'track-button-panel'} ).setStyles( { 'display': 'none' } ).inject( cont );
		}
	},
	
	trackBtn: function( obj, index, action )
	{
		for (var i=0; i<obj.items.length; i++)
		{
			obj.items[i].btns.getElements('a').removeClass('track-buttons-selected');
		}
		
		if (obj.index != index)
		{
			for (var i=0; i<obj.items.length; i++)
			{
				obj.items[i].panel.slide('out');
			}
		}
		else
		{
			obj.items[index].panel.slide('toggle');
			if (obj.action == 'listen')
			{
				obj.items[index].panel.set('html', obj.last_html);
			}
		}
		
		if (obj.last_player)
		{
			obj.last_player.set('html', '');
		}
		
		if ( (obj.index != index) || (obj.action != action) )
		{
			eval( "var btn = obj.items[index]." + action );
			btn.addClass('track-buttons-selected');
			obj.items[index].xhr = new Request( { url: obj.items[index].getElement('a').get('href') + '&ajax=true&action=' + action } ).send();
			obj.items[index].xhr.addEvent('onComplete', function(obj, index) {
				obj.items[index].panel.setStyle('display', 'block');
				obj.items[index].panel.set('html', obj.items[index].xhr.response.text );
				obj.items[index].panel.slide('in');
				var mp3 = obj.items[index].panel.getElement('.mp3');
				if (mp3)
				{
					var so = new SWFObject(root + "/templates/swf/audioplayer.swf", mp3.get('id'), "598", "33", "8", "#000000");
					so.addParam("wmode", "transparent");
					so.addParam("flashvars", 'mp3=' + mp3.get('html') );
					so.write( mp3.get('id') );
					obj.last_player = mp3;
					obj.last_html = obj.items[index].panel.get('html');
					setTimeout("window.scrollBy(0,1);",1000);
					setTimeout("window.scrollBy(0,-1);",1000);
				}
			}.pass([obj,index], this) );
		}
		
		obj.index = index;
		obj.action = action;
	},
	
	scrollers: function( objs )
	{
		objs.each( this.scroller.bind(this) );
	},
	
	scroller: function( obj )
	{
		obj.records = []
		obj.items = obj.getElements('.scroller-item');
		for (var i=0; i<obj.items.length; i++)
		{
			obj.records[i] = { txt: obj.items[i].get('html'), url:  obj.items[i].get('href') }
		}
		obj.items.dispose();
		obj.panel = new Element('a').inject( obj );
		this.scrollerStart( obj, 0 );
	},
	
	scrollerStart: function( obj, index )
	{
		obj.panel.set('html', '');
		obj.panel.set('href', obj.records[index].url );
		
		obj.index = index;
		obj.chars = []
		obj.timers = []
		obj.fix = []
		for (var k=0; k<obj.records[index].txt.length; k++)
		{
			obj.chars[k] = new Element('span').inject( obj.panel ); // , { 'html': obj.records[index].txt.charAt(k) }
			this.scrollerStartCharRotate( obj, index, k );
			this.scrollerStartCharFix.delay( k*100, this, [obj, index, k] );
		}
		// next
		var next = obj.index + 1;
		if (next >= obj.records.length)
			next = 0;
		this.scrollerStart.delay( (k*100) + 3000, this, [obj, next] );
	},
	
	scrollerStartCharRotate: function( obj, index, pos )
	{
		obj.timers[pos] = this.scrollerStartCharSet.periodical( 30, this, [obj, index, pos] );
	},
	
	scrollerStartCharSet: function( obj, index, pos )
	{
		if (!obj.fix[pos])
		{
			var code = parseInt( Math.random( ) * (122 - 48) ) + 48;
			//document.title = code + ' => ' + String.fromCharCode(code);
			obj.chars[pos].set( 'html', String.fromCharCode( code ) );
		}
	},
	
	scrollerStartCharFix: function( obj, index, pos )
	{
		// cancel
		obj.fix[pos] = true;
		$clear(obj.timers[pos]);
		
		// update
		var chr = obj.records[index].txt.charAt(pos);
		if (chr == ' ') chr = '&nbsp;';
		obj.chars[pos].addClass('scroller-char-active').set( 'html',  chr );
	},
	
	marquees: function( objs )
	{
		objs.each( this.marquee.bind(this) );
	},
	
	marquee: function( obj )
	{
		obj._width = 0;
		obj._screen = obj.getSize().x;
		obj.items = obj.getElements('.scroller-item');
		for (var i=0; i<obj.items.length; i++)
		{
			obj.items[i].setStyle('float', 'left');
			obj._width += obj.items[i].getSize().x;
		}
		obj.wrapper = new Element('div').setStyles( {'overflow': 'hidden'} ).inject( obj, 'before' );
		obj.setStyles( { 'width': obj._width + obj._screen } ).inject( obj.wrapper );
		
		obj._left = -obj._screen;
		
		this.marqueePlay( obj );
		
		obj.wrapper.addEvent('mouseenter', this.marqueePause.pass(obj, this) );
		obj.wrapper.addEvent('mouseleave', this.marqueePlay.pass(obj, this) );
	},
	
	marqueeStep: function( obj )
	{
		obj.setStyle('margin-left', -obj._left);
		obj._left += 2;
		if (obj._left > obj._width)
			obj._left = -obj._screen;
	},
	
	marqueePause: function( obj )
	{
		$clear( obj.timer );
	},
	
	marqueePlay: function( obj )
	{
		obj.timer = this.marqueeStep.periodical( 20, this, obj );
	},
	
	columns: function( objs )
	{
		objs.each( this.column.bind(this) );
	},
	
	column: function( obj )
	{
		obj.importOptions();
		
		var text = obj.get('html');
		var lines = text.split('\n');
		var columns = parseInt(obj.options.columns);
		var coltext = []
		if (lines.length > obj.options.lines)
		{
			obj.empty();
			var lpc = Math.ceil( lines.length / columns );
			for (var i=0; i < columns; i++)
			{
				coltext[i] = []
				for (var k=(i*lpc); k < ((i+1)*lpc); k++)
				{
					coltext[i][k] = lines[k];
				}
				//alert(coltext[i]);
				
				var col = new Element('div', {'class': 'column-col'}).setStyles( { 'float': 'left', 'width': (Math.floor(100/columns)-1) + '%' } ).inject( obj );
				var colbox = new Element('div', {'class': 'column-col-box'}).inject( col );
				colbox.set('html', coltext[i].join('\n') );
			}
			new Element('div', {'class': 'clear-px'}).set('html', '&nbsp;').inject( obj );
		}
	},
	
	fontTitles: function( objs )
	{
		objs.each( this.fontTitle.bind(this) );
	},
	
	fontTitle: function( obj )
	{
		var title = obj.get('html');
		var chars = title.length;
		var size = 14;
		var spacing = 0;
		
		if ((chars >= 1) && (chars < 14)) {
			size = 18;
			spacing = 0;
		}
		else if ((chars >= 14) && (chars < 20)) {
			size = 18;
			spacing = -2;
		}
		else if ((chars >= 20) && (chars < 30)) {
			size = 16;
			spacing = -1;
		}
		else if ((chars >= 30) && (chars < 40)) {
			size = 14;
			spacing = 0;
		}
		obj.setStyle("font-size", size + "pt");
		obj.setStyle("letter-spacing", spacing + "pt");
	},
	
	overflows: function( objs )
	{
		objs.each( this.overflow.bind(this) );
	},
	
	overflow: function( obj )
	{
		obj.importOptions();
		
		obj.imgs_loaded = 0;
		var imgs = obj.getElements('img');
		if (imgs.length == 0)
		{
			this.overflowConstr( obj );
			return;
		}
		for (var i=0; i<imgs.length; i++)
		{
			imgs[i].addEvent('load', function(obj, tot) {
				obj.imgs_loaded++;
				if ((obj.imgs_loaded == tot) && !obj.overflowed)
					this.overflowConstr( obj );
			}.pass([obj, imgs.length], this) );
		}
	},
	
	overflowConstr: function( obj )
	{
		obj.overflowed = true;
		
		var size = obj.getSize();
		var scroll = obj.getScrollSize();
		if (obj.hasClass('overflow-x'))
		{
			if (scroll.x > size.x)
			{
				obj.plot = new Element('div').inject( obj, 'after' );
				obj.inject( obj.plot );
				obj.setStyles( { 'overflow': 'hidden', 'width': (size.x - 10) } );
				
				// create scrollbar
				obj.scrollbar = new ScrollBar( obj.plot, obj ); // , {'hScroll': false}
				
				obj.setStyles( { 'overflow': 'hidden', 'width': (size.x - 28) } );
			}
		}
		else
		{
			if (scroll.y > size.y)
			{
				if (obj.options.parent)
				{
					obj.parent = obj.getParent('.' + obj.options.parent);
					obj.parent.addClass('overflow-parent');
					// refresh sizes
					var size = obj.getSize();
					var scroll = obj.getScrollSize();
				}
				
				obj.plot = new Element('div', { 'class': 'overflow-plot' } ).inject( obj, 'after' );
				obj.inject( obj.plot );
				obj.setStyles( { 'float': 'left', 'overflow': 'hidden', 'width': (size.x - 10) } );
				
				// create scrollbar
				obj.scrollbar = new ScrollBar( obj.plot, obj, { wheel: 10 } ); // , {'hScroll': false}
				
				obj.setStyles( { 'float': 'left', 'overflow': 'hidden', 'width': (size.x - 28) } );
			}
		}
	},
	
	loads: function( objs )
	{
		objs.each( this.load.bind(this) );
	},
	
	load: function( obj ) // , key
	{
		obj.importOptions();
		obj.items = obj.getElements( (obj.options.css ? '.' + obj.options.css : 'a') );
		obj.tgt = []
		obj.xhr = []
		
		for (var i=0; i<obj.items.length; i++)
		{
			obj.items[i].addEvent('click', function(e) { new Event(e).stop(); } );
			obj.items[i].addEvent('click', this.loadStart.pass([obj,i], this) );
			obj.items[i].urls = obj.items[i].getAjaxUrl().split('|');
			obj.items[i].key = ( obj.items[i].get('name') ? encodeURIComponent(obj.items[i].get('name').toLowerCase()) : i);
		}
		var tgts = obj.options.targetEl.split(',');
		for (var k=0; k<tgts.length; k++)
		{
			obj.tgt[k] = $(tgts[k]);
			obj.xhr[k] = new Request( { evalScripts: true } );
			obj.xhr[k].addEvent('onComplete', function( obj, k ) {
				obj.tgt[k].set( 'html', obj.xhr[k].response.text );
				this.init( obj.tgt[k] );
				this.objUnloading( obj.tgt[k] );
				obj.current = obj.items[ obj.index ].key;
			}.pass([obj, k], this) );
		}
		
		obj.hkey = obj.options.fragment;
		obj.history = this.history.register(
			obj.hkey,
			[null],
			function(args) {
				if (args[0] == null) return;
				if (obj.current != args[0])
				{
					// console.log( 'current: ' + obj.current + ', to load: '+args[0] );
					for (var k=0; k<obj.items.length; k++)
						if (obj.items[k].key == args[0]) args[0] = k;
					this.loadStart( obj, args[0] );
				}
			}.bind(this),
			function(args) { return obj.hkey + ':' + args[0]; }.bind(this),
			obj.hkey + ':([\\w_-]*)' //  + ':(\w+)'
		);
	},
	
	loadStart: function( obj, i )
	{
		for (var k=0; k<obj.tgt.length; k++)
		{
			this.objLoading( obj.tgt[k] );
			obj.index = i;
			obj.xhr[k].send( {'url': obj.items[i].urls[k], evalScripts: true } );
		}
		
		if (obj.history)
			obj.history.setValue( 0, obj.items[i].key );
		
		for (var j=0; j<obj.items.length; j++)
			obj.items[j].removeClass('load-selected');
		obj.items[i].addClass('load-selected');
		
		obj.items[i].fireEvent('clicked');
	},
	
	popups: function( objs )
	{
		if (objs.length > 0) {
			this._popup = new Element('div', { id: 'popup-window' } ).setStyles( { left: '50%', top: '50%' } ).inject( $$('body')[0], 'top' );
			this._popup.temp = new Element('div').setStyles( { 'position': 'absolute', 'z-index': -1 } ).inject( $$('body')[0], 'top' );
			this._popup.overlay = new Element('div', { id: 'popup-overlay' } ).setStyles( {  } ).inject( this._popup, 'before' );
			this._popup.close = new Element('a', { id: 'popup-close', href: 'javascript:;', html: '<span>Close</span>' } ).addEvent('click', this.popupClose.bind(this) ).inject( this._popup, 'top' );
			this._popup.content = new Element('div').inject( this._popup );
			this._popup.fx = new Fx.Morph( this._popup, { fps: 50, link: 'cancel' } ).set( { opacity: 0 } );
			this._popup.overlay.fx = new Fx.Tween( this._popup.overlay, { property: 'opacity', fps: 50, link: 'cancel' } ).set(0);
			this._popup.overlay.addEvent('click', this.popupClose.bind(this) );
			document.addEvent('resize', function() {
				this._popup.overlay.setStyles( { height: document.getScrollSize().y } );
			}.bind(this) );
		}
		objs.each( this.popup.bind(this) );
	},
	
	popup: function( obj )
	{
		obj.xhr = new Request( );
		obj.xhr.addEvent('onComplete', function( obj ) {
			this._popup.temp.setStyle('display', 'block');
			this._popup.temp.set('html', obj.xhr.response.text );
			var size = this._popup.temp.getSize();
			this._popup.temp.setStyle('display', 'none');
			
			this._popup.removeClass('popup-loading');
			this._popup.fx.start( { opacity: 1, width: size.x, height: size.y, 'margin-left': -(size.x/2), 'margin-top': -(size.y/2) } ).chain( function(obj) {
				this._popup.content.set( 'html', obj.xhr.response.text );
			}.pass(obj, this) );
			
		}.pass(obj, this) );
		
		obj.addEvent('click', function( obj ) {
			this._popup.content.set( 'html', '' );
			obj.xhr.send( {'url': obj.getAjaxUrl() } );
			this._popup.overlay.fx.start( .8 );
			this._popup.fx.set( { opacity: 0, width: 0, height: 0 } ).start( { opacity: 1, width: 200, height: 200, 'margin-left': -100, 'margin-top': -100 } );
			this._popup.addClass('popup-loading');
		}.pass(obj, this) );
		obj.addEvent('click', function(e) {
			new Event(e).stop();
		} );
	},
	
	popupClose: function( obj )
	{
		this._popup.content.set( 'html', '' );
		this._popup.overlay.fx.start( 0 );
		this._popup.fx.start( { opacity: 0, width: 0, height: 0, 'margin-left': 0, 'margin-top': 0 } );
	},
	
	contacts: function( objs )
	{
		objs.each( this.contact.bind(this) );
	},
	
	contact: function( obj )
	{
		obj.addEvent('submit', function(obj) {
			obj.inputs = obj.getElements('input');
			for (var i=0; i<obj.inputs.length; i++)
			{
				var n = obj.inputs[i].get('name');
				if ( (n == 'name') || (n == 'email') || (n == 'country') || (n == 'message') )
					if (obj.inputs[i].get('value').length < 4)
					{
						alert( obj.getElement('.msg-error').get('value') );
						return false;
					}
			}
			return true;
		}.pass(obj, this) );
		//obj.addEvent('submit', function(e) { new Event(e).stop(); return false;} );
	},
	
	galleries: function( objs )
	{
		objs.each( this.gallery.bind(this) );
	},
	
	gallery: function( obj )
	{
		obj.importOptions();
		
		obj.defaultHTML = obj.get('html');
		obj.defaultSize = obj.getSize();
		obj.windowSize = document.getSize();
		obj.windowScroll = document.getScrollSize();
		
		obj.overlay = new Element('div', {'class': 'gallery-overlay'} ).setStyles( { 'position': 'absolute', 'z-index': 9000, 'width': '100%', 'height': (obj.windowSize.y + obj.windowScroll.y) } ).inject( $$('body')[0], 'top' );
		obj.overlay.fx = new Fx.Tween( obj.overlay, { 'property': 'opacity'} ).set(0);
		
		obj.items = obj.getElements('.gallery-item');
		for (var i=0; i<obj.items.length; i++)
		{
			this.galleryAttach( obj, i );
		}
		
		obj.cols = parseInt( obj.options.cols );
		obj.rows = Math.ceil( obj.items.length / obj.cols );
		
		for (var i=0; i<obj.items.length; i++)
			obj.items[i].img.initfx.start.delay( (i+1)*100, obj.items[i].img.fx, {
				'opacity': 1, 'margin-left': 0
			} );
		document.addEvent('keydown', function(e, obj) {
			var k = new Event(e).key;
			var i = obj.index;
			switch (k)
			{
				case 'left': 	this.galleryPrev( obj ); break;
				case 'right':	this.galleryNext( obj ); break;
			}
		}.bindWithEvent(this, obj) );
	},
	
	galleryAttach: function( obj, i )
	{
		obj.items[i].big = obj.items[i].get('rel');
		obj.items[i].dl = obj.items[i].getElement('a').get('href');
		obj.items[i].fn = obj.items[i].getElement('a').get('rel');
		
		obj.items[i].img = obj.items[i].getElement('img');
		obj.items[i].size = obj.items[i].img.getCoordinates();
		obj.items[i].img.initfx = new Fx.Morph( obj.items[i].img, { link: 'chain', duration: 200 } ).set( {
			'opacity': 0, 'margin-left': -10
		} );
		obj.items[i].img.fx = new Fx.Morph( obj.items[i].img, { link: 'chain', duration: 1200, fps: 50, transition: Fx.Transitions.Pow.easeOut } );
				
		obj.items[i].img.addEvent('click', this.galleryChoose.pass([obj, i], this) );
		obj.items[i].img.addEvent('click', function(e) { new Event(e).stop(); } );
		
		obj.items[i].zoom = new Element('a', {'href': 'javascript:;', 'class': 'gallery-zoom'} ).inject( obj.items[i], 'top' );
		obj.items[i].zoom.cloneEvents( obj.items[i].img )
	},
	
	galleryChoose: function( obj, i )
	{
		obj.items[i].bigimage = new Element('img', {'src': obj.items[i].big} ).setStyles( { 'position': 'absolute', 'z-index': 10000 } );
		obj.items[i].bigimage.addEvent('load', this.galleryAppear.pass([obj,i], this) );
		
		obj.setStyles( { 'height': obj.defaultSize.y } );
		
		for (var k=0; k<obj.items.length; k++)
		{
			var scroll = document.getScroll();
			var posx = k % obj.cols;
			var posy = Math.floor( k / obj.cols );
		
			obj.items[k].zoom.setStyle('display', 'none');
			obj.items[k].img.inject( $$('body')[0], 'top' );
			obj.items[k].img.setStyles( { 'position': 'absolute', 'z-index': 1000, 'left': obj.items[k].size.left, 'top': obj.items[k].size.top } );
			
			var tox = ( obj.windowSize.x / obj.cols * posx ) + scroll.x;
			var toy = ( obj.windowSize.y / obj.rows * posy ) + scroll.y;
			obj.items[k].img.fx.start.delay( 200 * k, obj.items[k].img.fx, {
				'left': tox,
				'top': toy,
				'opacity': 0
			} )
		}
	}, 
	
	galleryAppear: function( obj, i )
	{
		obj.overlay.fx.start( .7 );
		
		var scroll = document.getScroll();
		var size = { x: obj.items[i].bigimage.width, y: obj.items[i].bigimage.height };
		
		if (size.x > obj.windowSize.x)
		{
			size.y = (obj.windowSize.x - 70) * size.y / size.x;
			size.x = (obj.windowSize.x - 70);
		}
		if (size.y > obj.windowSize.y)
		{
			size.x = (obj.windowSize.y - 70) * size.x / size.y;
			size.y = (obj.windowSize.y - 70);
		}
		
		obj.items[i].bigfx = new Fx.Morph( obj.items[i].bigimage, { duration: 2000, fps: 50, transition: Fx.Transitions.Pow.easeOut } ).set( { 'opacity': 0, 'width': 0, 'height': 0, 'left': obj.windowSize.x / 2, 'top': obj.windowSize.y / 2 } );
		obj.items[i].bigimage.inject( $$('body')[0], 'top' );
		obj.items[i].icons = new Element('div', {'class': 'gallery-icons'} ).setStyles({'position': 'absolute', 'display': 'none', 'z-index': 9999}).inject( $$('body')[0], 'top' );
		obj.items[i].icons.close = new Element('a', {'class': 'gallery-icon-close', 'href': 'javascript:;', 'html': '<span>Chiudi</span>'} ).addEvent('click', this.galleryClose.pass([obj, i], this) ).inject( obj.items[i].icons );
		obj.items[i].icons.download = new Element('a', {'class': 'gallery-icon-download', 'href': obj.items[i].dl, 'html': '<span>Download</span>'} ).inject( obj.items[i].icons );
		obj.items[i].iconsfx = new Fx.Tween( obj.items[i].icons, { duration: 300, fps: 50, transition: Fx.Transitions.Pow.easeOut, 'property': 'left'} );
		
		obj.items[i].nav = new Element('div', {'class': 'gallery-nav'} ).setStyles({'position': 'absolute', 'display': 'none', 'z-index': 10001, 'width': size.x, 'height': size.y}).inject( $$('body')[0], 'top' );
		obj.items[i].nav.prev = new Element('a', {'class': 'gallery-nav-prev', 'href': 'javascript:;', 'html': '<span>Precedente</span>'} ).setStyles({'height': size.y}).addEvent('click', this.galleryPrev.pass(obj, this) ).inject( obj.items[i].nav );
		obj.items[i].nav.next = new Element('a', {'class': 'gallery-nav-next', 'href': 'javascript:;', 'html': '<span>Successivo</span>'} ).setStyles({'height': size.y}).addEvent('click', this.galleryNext.pass(obj, this) ).inject( obj.items[i].nav );
		
		var tox = (obj.windowSize.x / 2) - (size.x / 2) + scroll.x;
		var toy = (obj.windowSize.y / 2) - (size.y / 2) + scroll.y;
		
		obj.items[i].nav.setStyles( { 'display': 'block', 'left': tox, 'top': toy } );
		
		obj.items[i].bigfx.start( {
			'left': tox,
			'top': toy,
			'width': size.x,
			'height': size.y,
			'opacity': 1
		} ).chain( function() {
			obj.items[i].icons.setStyles( {
				'display': 'block',
				'left': tox + size.x - 70,
				'top': toy
			} )
			obj.items[i].iconsfx.start( tox + size.x - 1 );
		} );
		
		obj.index = i;
	},
	
	galleryDisappear: function( obj, i, reinit )
	{
		obj.items[i].iconsfx.start( obj.items[i].icons.getStyle('left').toInt() - 70 );
		
		obj.items[i].iconsfx.addEvent('onComplete', function(obj) {
			var scroll = document.getScroll();
			obj.items[i].bigfx.start( {
				'left': obj.windowSize.x / 2 + scroll.x,
				'top': obj.windowSize.y / 2 + scroll.y,
				'width': 0,
				'height': 0,
				'opacity': 0
			} );
			
			obj.items[i].icons.dispose();
			obj.items[i].nav.dispose();
			
			if (reinit)
			{
				obj.overlay.fx.start( 0 );
				obj.empty();
				obj.set('html', obj.defaultHTML);
				this.gallery( obj );
			}
		}.pass(obj, this) );
	},
	
	galleryPrev: function( obj )
	{
		this.galleryDisappear( obj, obj.index, false );
		if (obj.index == 0)
			obj.index = obj.items.length;
		this.galleryChoose( obj, obj.index - 1 );
	},
	
	galleryNext: function( obj )
	{
		this.galleryDisappear( obj, obj.index, false );
		if (obj.index >= obj.items.length-1)
			obj.index = -1;
		this.galleryChoose( obj, obj.index + 1 );
	},
	
	
	galleryClose: function( obj, i )
	{
		this.galleryDisappear( obj, i, true );
	},
	
	addthis: function( obj )
	{
		if (obj)
		{
			if (window.addthis) {
				window.addthis.ost = 0;
        		window.addthis.ready();
			}
		}
	},
	
	reloadLinks: function( objs )
	{
		objs.each( this.reloadLink.bind(this) );
	},
	
	reloadLink: function( obj )
	{
		var _events = obj.retrieve('events');
		
		if (_events && !_events['click'])
		{
			obj.addEvent('click', function() {
				this.screenExit( function () { self.location.href = obj.get('href'); } );
			}.bind(this) );
			obj.addEvent('click', function(e) { new Event(e).stop(); } );
		}
	},
	
	/// common fx ///
	screenCreate: function( )
	{
		var s = document.getSize();
		
		this.changePageDuration = 500;
		
		this.changePageTop = new Element('div', {'class': 'exit-overlay-top'} ).inject( $$('body')[0], 'top' );
		this.changePageBottom = new Element('div', {'class': 'exit-overlay-bottom'} ).inject( $$('body')[0], 'top' );
		
		this.changePageFxEnter = { 'duration': this.changePageDuration, 'fps': 50, 'link': 'cancel', 'transition': Fx.Transitions.Expo.easeOut }
		this.changePageFxExit = { 'duration': this.changePageDuration, 'fps': 50, 'link': 'cancel', 'transition': Fx.Transitions.Expo.easeOut }
		
		this.changePageTop.setStyles( { 'height': (s.y / 2) } );
		this.changePageBottom.setStyles( { 'height': (s.y / 2) } );
	},
	
	screenEnter: function( )
	{
		var s = document.getSize();
		if (this.changePageTop)
		{
			this.changePageTop.set('tween', this.changePageFxEnter );
			this.changePageTop.tween( 'height', 0 );
			this.changePageBottom.set('tween', this.changePageFxEnter );
			this.changePageBottom.tween( 'height', 0 );
		}
	},
	
	screenExit: function( fn )
	{
		var s = document.getSize();
		if (this.changePageTop)
		{
			this.changePageTop.set('tween', this.changePageFxExit );
			this.changePageTop.tween( 'height', Math.ceil(s.y/2) );
			this.changePageBottom.set('tween', this.changePageFxExit );
			this.changePageBottom.tween( 'height', Math.ceil(s.y/2) );
			fn.delay( this.changePageDuration, this );
		}
	},
	
	objLoading: function( obj )
	{
		if (!this.loadingBox)
		{
			this.loadingBox = new Element('div', {'class': 'loading-overlay'} ).inject( $$('body')[0] );
			this.loadingIcon = new Element('div', {'class': 'loading-icon'} ).inject( this.loadingBox );
			this.loadingFx = new Fx.Tween( this.loadingBox, {'property': 'opacity', 'link': 'chain'} ).set(0);
		}
		var p = obj.getPosition();
		var s = obj.getSize();
		this.loadingBox.setStyles( { 'width': s.x, 'height': s.y, 'left': p.x, 'top': p.y } );
		this.loadingIcon.setStyles( { 'width': s.x, 'height': s.y } );
		this.loadingFx.start(1);
	},
	
	objUnloading: function( obj )
	{
		this.loadingFx.start(0);
	},
	
	//// IE Hacks ////
	fix: function( obj )
	{
	}
} );


var History = new Class({

	Implements: [Events, Options],
	
	options: {
	},
	
	initialize: function(options){
		this.setOptions(options);
		
		// alert(this.getHash());
	},
	
	getHash: function() {
		var href = top.location.href;
		var pos = href.indexOf('#') + 1;
		return (pos) ? href.substr(pos) : '';
	}
} );

/**** NATIVE IMPLEMENTATIONs ***/

Element.implement( {
	importOptions: function()
	{
		this.saveOptions( this, this );
	},
	
	copyOptions: function( obj )
	{
		this.saveOptions( obj, this );
	},
	
	saveOptions: function( source, target )
	{
		var trigger = "logics@";
		if (!target.options)
			target.options = {}
		if (source.className.indexOf(trigger) !== -1)
		{
			// import rel settings
			var logics = source.className.substring( source.className.indexOf(trigger) + trigger.length );
			var parts = logics.split('|');
			for (var j=0; j<parts.length; j++)
			{
				kv = parts[j].split(':');
				if (kv.length == 2)
				{
					eval("target.options."+kv[0]+" = '"+kv[1]+"'");
				}
			}
		}
	},
	
	getAjaxUrl: function( )
	{
		if (this.get('rel'))
			return this.get('rel');
		var href = this.href;
		if (href.indexOf('?') !== -1)
			href += '&';
		else
			href += '?';
		href += 'ajax=true';
		return href;
	}
} );
