// Modifiers

var $ready = Element.observe.curry(document, 'dom:loaded');

Prototype.Browser.IE9 = Prototype.Browser.IE8 = Prototype.Browser.IE7 = Prototype.Browser.IE6 = false;

if (!(/opera|webtv/i.test(navigator.userAgent)) && /msie\s(\d)/i.test(navigator.userAgent) && /trident\/5/i.test(navigator.userAgent)) Prototype.Browser.IE9 = true;
else if (!(/opera|webtv/i.test(navigator.userAgent)) && /msie\s(\d)/i.test(navigator.userAgent) && /trident\/4/i.test(navigator.userAgent)) Prototype.Browser.IE8 = true;
else if (!(/opera|webtv/i.test(navigator.userAgent)) && /msie\s(\d)/i.test(navigator.userAgent) && (parseInt(RegExp.$1) == 7)) Prototype.Browser.IE7 = true;
else if (!(/opera|webtv/i.test(navigator.userAgent)) && /msie\s(\d)/i.test(navigator.userAgent) && (parseInt(RegExp.$1) == 6)) Prototype.Browser.IE6 = true;

Element.addMethods({
	scrollTo: function(element, left, top) {
		var element = $(element), 
			pos = element.cumulativeOffset();
		if (arguments.length == 1) window.scrollTo(pos[0], pos[1]);
		else {
			element.scrollLeft = left;
			element.scrollTop  = top;
		}
		return element;
	}
});

Effect.Scroll = Class.create();

Object.extend(Object.extend(Effect.Scroll.prototype, Effect.Base.prototype), {
	initialize: function(element) {
		this.element = $(element);
		if(!this.element) throw(Effect._elementDoesNotExistError);
		this.start(Object.extend({x: 0, y: 0}, arguments[1] || {}));
	},
	setup: function() {
		var scrollOffsets = (this.element == window) ? document.viewport.getScrollOffsets() : Element._returnOffset(this.element.scrollLeft, this.element.scrollTop);
		this.originalScrollLeft = scrollOffsets.left;
		this.originalScrollTop  = scrollOffsets.top;
	},
	update: function(pos) {
		this.element.scrollTo(Math.round(this.options.x * pos + this.originalScrollLeft), Math.round(this.options.y * pos + this.originalScrollTop));
	}
});

Number.prototype.toThousands = function() {
	var n1 = Math.floor(Math.max(0, this)).toString(), n2 = Math.max(0, this).toFixed(2); 
	return n1.replace(/(?=(?:\d{3})+$)(?!^)/g, ',') + '.' + n2.split('.')[1];
}

String.prototype.trim = function() {
	return this.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
}

var ScrollFX = {

	setFXOptions: function(element, timeout, step, callback) {
		element.fxoptions = {
			timeout: timeout,
			step: step,
			callback: callback,
			timeoutHandler: {}
		}
	},

	scrolLeft: function(element) {

		var margin = parseInt(element.getStyle('marginLeft') || '0px'),
			container = element.up().getWidth(),
			width = element.getWidth(),
			step = margin - element.fxoptions.step;

		if ( margin > container - width )
			element.setStyle({ 'marginLeft': (step > container - width ? step : container - width) + 'px' });

		if ( element.fxoptions.callback != null )
			element.fxoptions.callback();
		
		element.fxoptions.timeoutHandler = setTimeout(element.scrolLeft.bind(element), element.fxoptions.timeout);

	},

	scrolRight: function(element) {

		var margin = parseInt(element.getStyle('marginLeft') || '0px'),
			step = margin + element.fxoptions.step;

		if ( margin < 0 )
			element.setStyle({ 'marginLeft': (step < 0 ? step : 0) + 'px' });

		if ( element.fxoptions.callback != null )
			element.fxoptions.callback();

		element.fxoptions.timeoutHandler = setTimeout(element.scrolRight.bind(element), element.fxoptions.timeout);

	}, 

	stopScroll: function(element) {

		clearTimeout(element.fxoptions.timeoutHandler);

	}

}

//Extend element methods with our FX functions that we use for scrolling

Element.addMethods(ScrollFX);

