Scroller = new Class({
	initialize: function(scroller,buttons,do_pngs) {
		var self = this;
		this.scroller = $(scroller);
		this.move_prev = $(buttons.prev);
		this.move_next = $(buttons.next);
		this.pp = $(buttons.pp);
		this.locked = false;
		this.ajax = null;
		var width = 0;
		var x, i = 0;
		var greatest_height = 0;
		if(x = this.scroller.getFirst()) {
			do {
				if (window.ie && do_pngs) {
					var img = x.getElement('img');
					if (img.getProperty('src').match(/png$/)) {
						img.setStyle('visibility','hidden');
						img.addEvent('load',function(ev){
							var node = new Event(ev).target;
							node.setStyles({
								'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + node.getProperty('src') + "', sizingMethod='crop')",
								'width': node.width,
								'height': node.height,
								'cursor': 'pointer',
								'visibility': 'visible'
							});
							node.removeEvents('load');
							node.src = '/images/layout/1x1.png';
						});
					}
				}
				
				x.setProperty('rel',i);
				if (x.getElement('img').getSize().y > 0) {
				  var img = x.getElement('img');
				  var old_height = img.get('height');
				  img.erase('height');
				  if (img.getSize().y >= old_height) {
				    img.set('height',old_height);
				  }
				  greatest_height = Math.max(greatest_height,old_height);
				  x.setProperty('base-width',x.getStyle('width').toInt() + x.getStyle('padding-left').toInt() + x.getStyle('padding-right').toInt());
				}
				if (!(Browser.Engine.trident && Browser.Engine.version == 4)) {
				new Asset.image(x.getElement('img').getProperty('src'), {rel: i, onload: function(ev){
					var x = self.scroller.getElement('*[rel=' + ev.getProperty('rel') + ']');
				  x.setStyle('height',self.scroller.getSize().y + 'px');
					var img = x.getElement('img');
				  var old_height = ev.get('height');
				  if (x.getSize().y - (img.getStyle('padding-top').toInt() + img.getStyle('padding-bottom').toInt()) < old_height) {
				    img.set('height',x.getSize().y - (img.getStyle('padding-top').toInt() + img.getStyle('padding-bottom').toInt()));
				  } 
					x.setProperty('base-width',x.getStyle('width').toInt() + x.getStyle('padding-left').toInt() + x.getStyle('padding-right').toInt());
				  if (ev.getProperty('rel') == self.scroller.getElements('img').length - 1) {
				    var dur = Math.floor(Math.random()*self.scroller.getElements('img').length);
      			for (var idx = 0; idx < dur; idx++) {
      			  self.movePrevious.delay(idx*75,self,[true,true,true]);
      			}
      			(function(){
      			  self.handleRequest.bind(self.scroller.getElement('a'),[null,self])();
      			}).delay((idx+5)*75);
				  }
				}});
			  }
				i++;
				
				width += x.getStyle('width').toInt() + x.getStyle('padding-left').toInt() + x.getStyle('padding-right').toInt();
			} while (x = x.getNext());
		}
	  greatest_height += this.scroller.getFirst().getFirst().getStyle('padding-top').toInt() + this.scroller.getFirst().getFirst().getStyle('padding-bottom').toInt();
		this.scroller.setStyles({
			'width': (this.scroller.getParent().getSize().x * 2) + 'px',
			'height': (this.scroller.getFirst() ? greatest_height : ''),
			'position': 'relative'
		});
		this.scroller.getParent().setStyle('height',this.scroller.getStyle('height'));
		this.move_next.addEvent('click', function(ev) {
			new Event(ev).preventDefault().target.blur();
			self.moveNext();
		});
		this.move_prev.addEvent('click', function(ev) {
			new Event(ev).preventDefault().target.blur();
			self.movePrevious();
		});
		if (this.pp) {
  		this.pp.addEvent('click', function(ev) {
  			new Event(ev).preventDefault().target.blur();
  			self.play();
  		});
    }
    
    this.scroller.getElements('a').each(function(n){
      n.addEvent('click',self.handleRequest.bindWithEvent(n,self));
    });
		
		var props = self.scroller.getProperty('rel');
		if (props) {
			var properties = new Hash();
			props.split(':').each(function(x){
				properties.set(x,null);
			});
			properties.each(function(val,key){
				var args = key.split('=');
				var name = args[0] || x;
				if (args[1]) {
					properties.set(name,args[1]);
					properties.remove(key);
				}
				switch (name) {
					case 'playing':
						self.play();
						break;
					case 'update':
						var x = self.scroller.getFirst();
						do {
							self.movePrevious(true,true);
						} while (('start' != x.getProperty('rel')) && (x = x.getNext()));
						break;
					default:
						break;
				}
			});
			if ( properties.get('update') ) {
				if (!$('scroller_hidden_box')) {
					var hidden_box = new Element('div').setStyles({
						display: 'none',
						height: 0,
						width: 0
					}).setProperty('id','scroller_hidden_box').injectInside($E('body'));
				}
				self.ajax = new Ajax(properties.get('update'),{
					method: 'get',
					onComplete: function(text) {
						$('news').setStyle('position','relative');
						var hidden = $('scroller_hidden_box');
						hidden.setHTML(text);
						hidden.getFirst().setProperty('id','');
						var i = 1;
						$('news').setStyle('overflow','hidden');
							var el = hidden.getFirst().getFirst();
							el.injectInside($('news'));
							el.setStyles({
								position: 'absolute',
								left: $('news').getSize().size.x,
								top: 0,
								width: $('news').getSize().size.x
							});
							(function(){
							el.setStyles({
								position: '',
								left: '',
								top: '',
								width: ''
							})
							while ($('news').getLast().getPrevious()) {
								$('news').getLast().getPrevious().remove();
							}
							
							$('news').setStyle('position','static')
							}).delay(500);
					} 
				});
				self.ajax.old_request = self.ajax.request;
				self.ajax.request = function(url) {
					this.old_url = this.url;
					this.url = this.url + '/' + url;
					this.old_request();
					this.url = this.old_url;
				}
			}
		}

	},
	handleRequest: function(ev,self) {
    if (ev) {
  	  try {
  	    event = new Event(ev);
  	    event.preventDefault();
  	  } catch (e) {
  	      ev.preventDefault();
  	  }
  	}
	  if (this.getProperty('href')) {
	    new Request.HTML({
	     update: $('update_content'),
	     evalScripts: true
	    }).get(this.getProperty('href'));
	  }
	  self.scroller.getElements('.active').removeClass('active');
	  this.addClass('active');
	},	
	movePrevious: function(no_stop,no_transition,force) {
		var self = this;
		if (self.locked && !force) { return false; }
		if (!no_stop) { self.stop(); }
		self.locked = true;
		if (self.ajax) {
			self.ajax.request(self.scroller.getFirst().getProperty('rel'));
		}
		new Fx.Tween(self.scroller.getFirst(), {
		  property: 'margin-left',
			duration: (no_transition ? 0 : 500),
			onComplete: function(el) {
				el.injectInside(self.scroller);
				el.setStyle('margin-left','');
				self.locked = false;
			}
		}).start(0,-(this.scroller.getFirst().getProperty('base-width')));
	},
	moveNext: function(no_stop,no_transition,force) {
		var self = this;
		if (self.locked && !force) { return false; }
		if (!no_stop) { self.stop(); }
		self.locked = true;
		self.scroller.getLast().setStyle('margin-left',-(self.scroller.getFirst().getProperty('base-width')));
		self.scroller.getLast().injectTop(self.scroller);
		if (self.ajax) {
			self.ajax.request(self.scroller.getLast().getProperty('rel'));
		}
		new Fx.Tween(self.scroller.getFirst(),{
		  property: 'margin-left',
			duration: (no_transition ? 0 : 500),
			onComplete: function(el) {
				el.setStyle('margin-left','');
				self.locked = false;
			}
		}).start(-(self.scroller.getFirst().getProperty('base-width')),0);		
	},
	play: function() {
		if (this.playing) {
			this.stop();
		} else {
			this.scroller.getParent().getParent().addClass('playing');
			this.playing = this.moveNext.periodical(3000,this,true);
		}
	},
	stop: function() {
		$clear(this.playing);
		this.scroller.getParent().getParent().removeClass('playing');
		this.playing = false;
	}
});

var scrollers = new Array();
window.addEvent('domready', function(){
	$$(".scroller").each(function(node){
		new Element('div').addClass('scroll_buttons').
			set('html','<a class="scroll_prev" href="#">Previous</a><!-- <a class="scroll_pp" href="#">Play/Pause</a> --><a class="scroll_next" href="#">Next</a>').
			injectInside(node);
		var do_pngs = node.hasClass('do_pngs');
	new Scroller(node.getElement('.scrollable'), {
//			pp: node.getElement('.scroll_pp')
			prev: node.getElement('.scroll_prev'),
			next: node.getElement('.scroll_next')
		},do_pngs);
	});
});