//if ((typeof setCookie == 'undefined') || (typeof getCookie == 'undefined'))
//	throw("cookies.js requires including");

if(!Control) var Control = {};
Control.Scaler = Class.create();

Control.Scaler.prototype = {
	initialize: function(handle, track, options) {
		var scaler = this;

		this.handle = $(handle);
		this.track   = $(track);

		this.options = options || {};

		this.increment = this.options.increment || 1;
		this.step = parseInt(this.options.step || '1');
		this.range = this.options.range || $R(0,1);

		this.scalerValue = this.options.scalerValue || 0;

		this.alignX = parseInt(this.options.alignX || '0');

		this.trackLength = this.maximumOffset() - this.alignX;
		this.handleLength = this.options.handlewidth || (this.handle.offsetWidth != 0 ? this.handle.offsetWidth : this.handle.style.width.replace(/px$/,""));

		this.active   = false;
		this.dragging = false;
		this.disabled = false;

		if (this.options.disabled) this.setDisabled();

		this.eventMouseDown = this.startDrag.bindAsEventListener(this);
		this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
		this.eventMouseMove = this.update.bindAsEventListener(this);
		this.eventMouseMove = this.update.bindAsEventListener(this);

		var tmpval = (typeof getCookie == 'undefined') ? 0 : getCookie('scaler');
		this.setValue(parseFloat(tmpval || this.options.scalerValue || this.range.start));
		Element.makePositioned(this.handle); // fix IE
		Event.observe(this.handle, "mousedown", scaler.eventMouseDown);

		Event.observe(this.track, "mousedown", this.eventMouseDown);
		Event.observe(document, "mouseup", this.eventMouseUp);
		Event.observe(document, "mousemove", this.eventMouseMove);

		Event.observe(window, "load", this.onLoadBody.bindAsEventListener(this));

		// ---
		this._origWidth = new Array();
		this._imgElem = new Array();
		this._tblElem = this.options.container ? findTags($(this.options.container), 'table') : new Array();
		this.tableWidth = (this._tblElem.length > 0) ? this._tblElem[0].width || this._tblElem[0].style.width.replace(/px$/,"") : 0;
		this.tableHeight = (this._tblElem.length > 0) ? this._tblElem[0].height || this._tblElem[0].style.height.replace(/px$/,"") : 0;
		for (var i = 0; i < this._tblElem.length; i++) {
			var img = findTags(this._tblElem[i], 'img')[0];
			var imgid = this._imgElem.length;
			img.id = 'i_' + i;
			this._imgElem.push(img);

//			if (img.complete) this.onLoadImg(i)
//			else Event.observe(img, "load", this.onLoadImg.bindAsEventListener(this));
			Event.observe(img, "load", this.onLoadImg.bindAsEventListener(this));
		}

		this.onChange = this.options.onChange || function(value) { this.scaleIt(value) };
		this.onSlide = this.options.onSlide || function(value) { this.scaleIt(value) };

		this.initialized = true;
	},

	onLoadBody: function(e) {
		for (var i = 0; i < this._imgElem.length; i++) {
			if (!(this._imgElem[i].style.width)) {
				this._origWidth[i] = this._imgElem[i].width;
				this._imgElem[i].style.width = parseInt(this.scalerValue * this._origWidth[i])+'px';
			}
		}
	},

	onLoadImg: function(e) {
		var i = e;
		if ((e instanceof Object) || (typeof e == 'object')) {
			var target = e.currentTarget || e.srcElement;
			i = target.id.replace(/^i_/, "");
		}
		if (this._imgElem[i]) this._origWidth[i] = this._imgElem[i].width;
		if (this._origWidth[i]) this._imgElem[i].style.width = parseInt(this.scalerValue * this._origWidth[i])+'px';
	},

	scaleIt: function(v) {
		for (var i = 0; i < this._imgElem.length; i++) {
			if (this._origWidth[i]) this._imgElem[i].style.width = parseInt(v * this._origWidth[i])+'px';
			Element.setStyle(this._tblElem[i], {width: parseInt(v * this.tableWidth)+'px', height: parseInt(v * this.tableHeight)+'px'} );
		}
		if (typeof setCookie != 'undefined') setCookie('scaler', v, '', '/');
	},

	setDisabled: function() {
		this.disabled = true;
	},

	setEnabled: function() {
		this.disabled = false;
	},

	getNearestValue: function(value) {
		if (value > this.range.end) return this.range.end;
		if (value < this.range.start) return this.range.start;
		return value;
	},

	setValue: function(scalerValue) {
		if (!this.initialized) scalerValue = this.scalerValue;
		this.scalerValue = this.getNearestValue(scalerValue);

		this.handle.style['left'] = this.translateToPx(this.scalerValue);

		if (!this.dragging || !this.event) this.updateFinished();
	},

	translateToPx: function(value) {
		return Math.round(((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * (value - this.range.start)) + "px";
	},

	translateToValue: function(offset) {
		return ((offset/(this.trackLength-this.handleLength) * (this.range.end-this.range.start)) + this.range.start);
	},

	maximumOffset: function() {
		return this.options.scalerwidth || (this.track.offsetWidth != 0 ? this.track.offsetWidth : this.track.style.width.replace(/px$/,""));
	},

	startDrag: function(event) {
		if (Event.isLeftClick(event)) {
			if (!this.disabled) {
				this.active = true;

				var handle = Event.element(event);
				var pointer  = [Event.pointerX(event), Event.pointerY(event)];
				var track = handle;
				if (track == this.track) {
					var offsets  = Position.cumulativeOffset(this.track);
					this.event = event;
					this.setValue(this.translateToValue((pointer[0]-offsets[0])-(this.handleLength/2)));
					var offsets  = Position.cumulativeOffset(this.handle);
					this.offsetX = (pointer[0] - offsets[0]);
					this.offsetY = (pointer[1] - offsets[1]);
				} else {
					// find the handle (prevents issues with Safari)
					while (handle.parentNode) handle = handle.parentNode;

					var offsets  = Position.cumulativeOffset(this.handle);
					this.offsetX = (pointer[0] - offsets[0]);
					this.offsetY = (pointer[1] - offsets[1]);
				}
			}
			Event.stop(event);
		}
	},

	update: function(event) {
		if (this.active) {
			if (!this.dragging) this.dragging = true;
			this.draw(event);
			// fix AppleWebKit rendering
			if (navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
			Event.stop(event);
		}
	},

	draw: function(event) {
		var pointer = [Event.pointerX(event), Event.pointerY(event)];
		var offsets = Position.cumulativeOffset(this.track);
		pointer[0] -= this.offsetX + offsets[0];
		pointer[1] -= this.offsetY + offsets[1];
		this.event = event;
		this.setValue(this.translateToValue( pointer[0] ));
		if (this.initialized) this.onSlide(this.scalerValue, this);
	},

	endDrag: function(event) {
		if (this.active && this.dragging) {
			this.finishDrag(event, true);
			Event.stop(event);
		}
		this.active = false;
		this.dragging = false;
	},

	finishDrag: function(event, success) {
		this.active = false;
		this.dragging = false;
		this.updateFinished();
	},

	updateFinished: function() {
		if (this.initialized) this.onChange(this.scalerValue, this);
		this.event = null;
	}
}
