/*
---
description: MooTools Datepicker class

authors:
  - MonkeyPhysics.com
  - Arian Stolwijk
  - MadmanMonty (Chris Baxter)
  - marfillaster (Ken Marfilla)
  - eerne (Enrique Erne)

license:
  - Attribution-Share Alike 3.0 Unported

requires:
  core/1.2.4: '*'
  more/1.2.4.4: [Date,MooTools.lang]

provides:
  - [DatePicker]

...
*/


/**
 * datepicker.js - MooTools Datepicker class
 * @version 1.19
 * 
 * by MonkeyPhysics.com
 *
 * Source/Documentation available at:
 * http://www.monkeyphysics.com/mootools/script/2/datepicker
 * 
 * --
 * 
 * Smoothly animating, very configurable and easy to install.
 * No Ajax, pure Javascript. 4 skins available out of the box.
 * 
 * --
 *
 * Some Rights Reserved
 * http://creativecommons.org/licenses/by-sa/3.0/
 * 
 */

var DatePicker = new Class({
	
	Implements: [Options, Events],
	
	// working date, which we will keep modifying to render the calendars
	d: '',
	
	// just so that we need not request it over and over
	today: '',
	
	// current user-choice in date object format
	choice: {}, 
	
	// size of body, used to animate the sliding
	bodysize: {}, 
	
	// to check availability of next/previous buttons
	limit: {}, 
	
	// element references:
	picker: null,      // main datepicker container
	slider: null,      // slider that contains both oldContents and newContents, used to animate between 2 different views
	oldContents: null, // used in animating from-view to new-view
	newContents: null, // used in animating from-view to new-view
	input: null,       // original input element (used for input/output)
	visual: null,      // visible input (used for rendering)
	
	options: { 
		pickerClass: 'datepicker',
		dayShort: 2,
		monthShort: 3,
		startDay: 1, // Sunday (0) through Saturday (6) - be aware that this may affect your layout, since the days on the right might have a different margin
		timePicker: false,
		timePickerOnly: false,
		yearPicker: true,
		yearsPerPage: 20,
		allowEmpty: true,
		animationDuration: 400,
		useFadeInOut: !Browser.Engine.trident, // dont animate fade-in/fade-out for IE
		startView: 'month', // allowed values: {time, month, year, decades}
		positionOffset: { x: 0, y: 0 },
		minDate: null, // Date object or a string
		maxDate: null, // same as minDate
		toggleElements: null, // deprecated
		toggle: null,
		draggable: true/*,

		// i18n
		months: null,
		days: null,
		format: null,
		
		// and some event hooks:
		onShow: $empty,   // triggered when the datepicker pops up
		onClose: $empty,  // triggered after the datepicker is closed (destroyed)
		onSelect: $empty,  // triggered when a date is selected
		onNext: $empty,  // triggered when changing to next month
		onPrevious: $empty  // triggered when changing to previous month */
	},
	
	initialize: function(attachTo, options) {
		// MooTools.lang
		this.setOptions({
			days: MooTools.lang.get('Date', 'days'),
			months: MooTools.lang.get('Date', 'months'),
			format: MooTools.lang.get('Date', 'shortDate')
		});
		var oldFormat = this.options.format;
		this.setOptions(options);
		if (this.options.timePicker && this.options.format == oldFormat) {
			var timeFormat = MooTools.lang.get('Date', 'shortTime');
			this.options.format = this.options.timePickerOnly ? timeFormat : this.options.format + ' ' + timeFormat;
		}
		
		// Support for deprecated toggleElements
		if(this.options.toggleElements) this.toggle = document.getElements(this.toggleElements);
		
		this.attach(attachTo, this.options.toggle);
		
		if (this.options.timePickerOnly) {
			this.options.timePicker = true;
			this.options.startView = 'time';
		}

		if (this.options.minDate) {
			if(!(this.options.minDate instanceof Date)) this.options.minDate = Date.parse(this.options.minDate);
		}
		if (this.options.maxDate) {
			if(!(this.options.maxnDate instanceof Date)) this.options.maxDate = Date.parse(this.options.maxDate);
			this.options.maxDate.setHours(23);
			this.options.maxDate.setMinutes(59);
			this.options.maxDate.setSeconds(59);
		}

		document.addEvent('mousedown', this.close.bindWithEvent(this));
	},
	
	attach: function(attachTo, toggle) {

		//dont bother trying to attach when not set
		if (!attachTo) return;

		// toggle the datepicker through a separate element?
		if (toggle) {
			var togglers = $type(toggle) == 'array' ? toggle : [document.id(toggle)];
			document.addEvents({
				'keydown': function(e) {
					if (e.key == "tab") this.close(null, true);
				}.bind(this)
			});
		};
		
		// see what is being attached and get an array suitable for it
		var elems = $type(attachTo) == 'array' ? attachTo : [document.id(attachTo)];
		
		// attach functionality to the inputs       
		elems.each(function(item, index) {		
			// never double attach
			if (item.retrieve('datepicker')) return;			

			item.store('datepicker', true); // to prevent double attachment...
			
			// events
			if (toggle && togglers) {
				var self = this;
				var events = {
					'click': function(e){
						if (e) e.stop();
						var open = false;
						if (!this.retrieve('datepicker:open')) {
							self.show(item, togglers[index]);
							open = true;
						}
						this.store('datepicker:open',open);
					}
					
				};
				var toggler = togglers[index]
					.setStyle('cursor', 'pointer')
					.addEvents(events);
				item.store('datepicker:toggler',toggler)
					.store('datepicker:events',events);
					
			} else {
				var events = {
					'keydown': function(e){
						// prevent the user from typing in the field
						if (this.options.allowEmpty && (e.key == "delete" || e.key == "backspace")) {
							item.set('value', '');
							this.close(null, true);
						} else if (e.key == "tab") {
							this.close(null, true);
						} else {
							e.stop();
						}
					}.bind(this),
					'focus': this.show.bind(this,[item])
				};
				
				item.addEvents(events).store('datepicker:events',events);
			}
		}.bind(this));
		
		return this;
	},
	
	detach: function(detach){
		var elems = $type(detach) == 'array' ? detach : [document.id(detach)];
		
		elems.each(function(item){
			// Only when the datepicker is attached
			if (!item.retrieve('datepicker')) return;
		
			var toggler = item.retrieve('datepicker:toggler');
			var events = item.retrieve('datepicker:events');
			// Detach the Events
			(toggler ? toggler : item).removeEvents(events);			
		});
		
		return this;
	},
	
	show: function(input,toggler,timestamp) {
		input = document.id(input);
		// Cannot show the picker if its not attached
		if(!input.retrieve('datepicker')) return;
		
		// Determine the date that should be opened
		if (timestamp) {
			this.d = new Date(timestamp);
		} else {		
			this.d = input.retrieve('datepicker:value') || input.get('value');
			if(!this.d){
				this.d = new Date();
			}else if(!(this.d instanceof Date)){
				this.d = Date.parse(this.d);
			}
		}
		// Min/max date
		if (this.options.maxDate && this.d > this.options.maxDate) 
			this.d = this.options.maxDate;
		if (this.options.minDate && this.d < this.options.minDate) 
			this.d = this.options.minDate;
		
		this.input = input;
		var d = (toggler ? document.id(toggler) : input).getCoordinates();
		var position = {
			left: d.left + this.options.positionOffset.x,
			top: d.top + d.height + this.options.positionOffset.y
		};
		this.fireEvent('show');
		
		this.today = new Date();
		this.choice = this.d.toObject();
		this.mode = (this.options.startView == 'time' && !this.options.timePicker) ? 'month' : this.options.startView;
		this.render();
		this.position({x: position.left, y: position.top});
		
		if(this.options.draggable && $type(this.picker.makeDraggable) == 'function') {
			this.dragger = this.picker.makeDraggable();
			this.picker.setStyle('cursor', 'move');
		}
		
		if(Browser.Engine.trident) this.shim();
		
		return this;
	},

	close: function(e, force) {
		if (!document.id(this.picker)) return;
		if($type(e) != 'event') force = true;
		var clickOutside = e && e.target != this.picker && !this.picker.hasChild(e.target) && e.target != this.visual;
		if (force || clickOutside) {
			if (this.options.useFadeInOut) {
				this.picker.set('tween', { duration: this.options.animationDuration / 2, onComplete: this.destroy.bind(this) }).tween('opacity', 1, 0);
			} else {
				this.destroy();
			}
		}
		
		return this;
	},
	
	// Protected/Private methods

	shim: function() {
		var coords = this.picker.setStyle('zIndex', 1000).getCoordinates();
		var frame = this.frame = new Element('iframe', {
			src: 'javascript:false;document.write("");',
			styles: {
				position: 'absolute',
				zIndex: 999,
				height: coords.height, width: coords.width,
				left: coords.left, top: coords.top
			}
		}).inject(document.body);
		this.frame.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)';
    
		this.addEvent('close', function() {frame.destroy()});
		
		if(this.dragger) {
			this.dragger.addEvent('drag', function() {
				var coords = this.picker.getCoordinates();
				frame.setStyles({left: coords.left, top: coords.top});
			}.bind(this));
		}
	},

	position: function(p) {
		var w = window.getSize(),
			s = window.getScroll(),
			d = this.picker.getSize(),
			max_y = (w.y + s.y) - d.y,
			max_x = (w.x + s.x) - d.x,
			i = this.input.getCoordinates();
			
		if(p.x > max_x) p.x = i.right - this.options.positionOffset.x - d.x;
		if(p.y > max_y) p.y = i.top - this.options.positionOffset.y - d.y;
		
		this.picker.setStyles({left: p.x, top: p.y});
	},
		
	render: function(fx) {
		if (!this.picker) {
			this.constructPicker();
		} else {
			// swap contents so we can fill the newContents again and animate
			var o = this.oldContents;
			this.oldContents = this.newContents;
			this.newContents = o;
			this.newContents.empty();
		}
		
		// remember current working date
		var startDate = new Date(this.d.getTime());
		
		// intially assume both left and right are allowed
		this.limit = { right: false, left: false };
		
		// render! booty!
		if (this.mode == 'decades') {
			this.renderDecades();
		} else if (this.mode == 'year') {
			this.renderYear();
		} else if (this.mode == 'time') {
			this.renderTime();
			this.limit = { right: true, left: true }; // no left/right in timeview
		} else {
			this.renderMonth();
		}
		
		this.picker.getElement('.previous').setStyle('visibility', this.limit.left ? 'hidden' : 'visible');
		this.picker.getElement('.next').setStyle('visibility', this.limit.right ? 'hidden' : 'visible');
		this.picker.getElement('.titleText').setStyle('cursor', this.allowZoomOut() ? 'pointer' : 'default');
		
		// restore working date
		this.d = startDate;
		
		// if ever the opacity is set to '0' it was only to have us fade it in here
		// refer to the constructPicker() function, which instantiates the picker at opacity 0 when fading is desired
		if (this.picker.getStyle('opacity') == 0) {
			this.picker.tween('opacity', 0, 1);
		}
		
		// animate
		if (fx) this.fx(fx);
	},
	
	fx: function(fx) {
		if (fx == 'right') {
			this.oldContents.setStyles({ left: 0, opacity: 1 });
			this.newContents.setStyles({ left: this.bodysize.x, opacity: 1 });
			this.slider.setStyle('left', 0).tween('left', 0, -this.bodysize.x);
		} else if (fx == 'left') {
			this.oldContents.setStyles({ left: this.bodysize.x, opacity: 1 });
			this.newContents.setStyles({ left: 0, opacity: 1 });
			this.slider.setStyle('left', -this.bodysize.x).tween('left', -this.bodysize.x, 0);
		} else if (fx == 'fade') {
			this.slider.setStyle('left', 0);
			this.oldContents.setStyle('left', 0).set('tween', { duration: this.options.animationDuration / 2 }).tween('opacity', 1, 0);
			this.newContents.setStyles({ opacity: 0, left: 0}).set('tween', { duration: this.options.animationDuration }).tween('opacity', 0, 1);
		}
	},
	
	constructPicker: function() {
		this.picker = new Element('div', { 'class': this.options.pickerClass }).inject(document.body);
		if (this.options.useFadeInOut) {
			this.picker.setStyle('opacity', 0).set('tween', { duration: this.options.animationDuration });
		}
		
		var h = new Element('div', { 'class': 'header' }).inject(this.picker);
		var titlecontainer = new Element('div', { 'class': 'title' }).inject(h);
		new Element('div', { 'class': 'previous' }).addEvent('click', this.previous.bind(this)).set('text', '«').inject(h);
		new Element('div', { 'class': 'next' }).addEvent('click', this.next.bind(this)).set('text', '»').inject(h);
		new Element('div', { 'class': 'closeButton' }).addEvent('click', this.close.bindWithEvent(this, true)).set('text', 'x').inject(h);
		new Element('span', { 'class': 'titleText' }).addEvent('click', this.zoomOut.bind(this)).inject(titlecontainer);
		
		var b = new Element('div', { 'class': 'body' }).inject(this.picker);
		this.bodysize = b.getSize();
		this.slider = new Element('div', { styles: { position: 'absolute', top: 0, left: 0, width: 2 * this.bodysize.x, height: this.bodysize.y }})
					.set('tween', { duration: this.options.animationDuration, transition: Fx.Transitions.Quad.easeInOut }).inject(b);
		this.oldContents = new Element('div', { styles: { position: 'absolute', top: 0, left: this.bodysize.x, width: this.bodysize.x, height: this.bodysize.y }}).inject(this.slider);
		this.newContents = new Element('div', { styles: { position: 'absolute', top: 0, left: 0, width: this.bodysize.x, height: this.bodysize.y }}).inject(this.slider);
	},
	
	renderTime: function() {
		var container = new Element('div', { 'class': 'time' }).inject(this.newContents);
		
		if (this.options.timePickerOnly) {
			this.picker.getElement('.titleText').set('text', 'Select a time');
		} else {
			this.picker.getElement('.titleText').set('text', this.d.format('j M, Y'));
		}
		
		new Element('input', { type: 'text', 'class': 'hour' })
			.set('value', this.leadZero(this.d.getHours()))
			.addEvents({
				mousewheel: function(e) {
					var i = e.target, v = i.get('value').toInt();
					i.focus();
					if (e.wheel > 0) {
						v = (v < 23) ? v + 1 : 0;
					} else {
						v = (v > 0) ? v - 1 : 23;
					}
					i.set('value', this.leadZero(v));
					e.stop();
				}.bind(this)
			})
			.set('maxlength', 2)
			.inject(container);
			
		new Element('input', { type: 'text', 'class': 'minutes' })
			.set('value', this.leadZero(this.d.getMinutes()))
			.addEvents({
				mousewheel: function(e) {
					var i = e.target, v = i.get('value').toInt();
					i.focus();
					if (e.wheel > 0) {
						v = (v < 59) ? v + 1 : 0;
					} else {
						v = (v > 0) ? v - 1 : 59;
					}
					i.set('value', this.leadZero(v));
					e.stop();
				}.bind(this)
			})
			.set('maxlength', 2)
			.inject(container);
		
		new Element('div', { 'class': 'separator' }).set('text', ':').inject(container);
		
		new Element('input', { type: 'submit', value: 'OK', 'class': 'ok' })
			.addEvents({
				click: function(e) {
					e.stop();
					this.select($merge(this.d.toObject(), { hours: this.picker.getElement('.hour').get('value').toInt(), minutes: this.picker.getElement('.minutes').get('value').toInt() }));
				}.bind(this)
			})
			.set('maxlength', 2)
			.inject(container);
	},
	
	renderMonth: function() {
		var month = this.d.getMonth();
		
		this.picker.getElement('.titleText').set('text', this.options.months[month] + ' ' + this.d.getFullYear());
		
		this.d.setDate(1);
		while (this.d.getDay() != this.options.startDay) {
			this.d.setDate(this.d.getDate() - 1);
		}
		
		var container = new Element('div', { 'class': 'days' }).inject(this.newContents);
		var titles = new Element('div', { 'class': 'titles' }).inject(container);
		var d, i, classes, e, weekcontainer;

		for (d = this.options.startDay; d < (this.options.startDay + 7); d++) {
			new Element('div', { 'class': 'title day day' + (d % 7) }).set('text', this.options.days[(d % 7)].substring(0,this.options.dayShort)).inject(titles);
		}
		
		var available = false;
		var t = this.today.toDateString();
		var currentChoice = Date.fromObject(this.choice).toDateString();
		
		for (i = 0; i < 42; i++) {
			classes = [];
			classes.push('day');
			classes.push('day'+this.d.getDay());
			if (this.d.toDateString() == t) classes.push('today');
			if (this.d.toDateString() == currentChoice) classes.push('selected');
			if (this.d.getMonth() != month) classes.push('otherMonth');
			
			if (i % 7 == 0) {
				weekcontainer = new Element('div', { 'class': 'week week'+(Math.floor(i/7)) }).inject(container);
			}
			
			e = new Element('div', { 'class': classes.join(' ') }).set('text', this.d.getDate()).inject(weekcontainer);
			if (this.limited('date')) {
				e.addClass('unavailable');
				if (available) {
					if(month == this.d.getMonth() || this.d.getDate() == 1) {
						this.limit.right = true;
					}
				} else {
					this.limit.left = true;
				}
			} else {
				available = true;
				e.addEvent('click', function(e, d) {
					if (this.options.timePicker) {
						this.d.setDate(d.day);
						this.d.setMonth(d.month);
						this.mode = 'time';
						this.render('fade');
					} else {
						this.select(d);
					}
				}.bindWithEvent(this, { day: this.d.getDate(), month: this.d.getMonth(), year: this.d.getFullYear() }));
			}
			this.d.setDate(this.d.getDate() + 1);
		}
		if (!available) this.limit.right = true;
	},
	
	renderYear: function() {
		var month = this.today.getMonth();
		var thisyear = this.d.getFullYear() == this.today.getFullYear();
		var selectedyear = this.d.getFullYear() == this.choice.year;
		
		this.picker.getElement('.titleText').set('text', this.d.getFullYear());
		this.d.setMonth(0);
		if (this.options.minDate) {
			this.d.decrement('month',1)
			this.d.set('date',this.d.get('lastdayofmonth'));
			if (this.limited('month')) {
				this.limit.left = true;
			}
			this.d.increment('month',1)
		}
		this.d.set('date',this.d.get('lastdayofmonth'))		
		var i, e;
		var available = false;
		var container = new Element('div', { 'class': 'months' }).inject(this.newContents);
		
		for (i = 0; i <= 11; i++) {
			e = new Element('div', { 'class': 'month month'+(i+1)+(i == month && thisyear ? ' today' : '')+(i == this.choice.month && selectedyear ? ' selected' : '') })
			.set('text', this.options.monthShort ? this.options.months[i].substring(0, this.options.monthShort) : this.options.months[i]).inject(container);
			
			if (this.limited('month')) {
				e.addClass('unavailable');
				if (available) {
					this.limit.right = true;
				} else {
					this.limit.left = true;
				}
			} else {
				available = true;
				e.addEvent('click', function(e, d) {
					this.d.setDate(1);
					this.d.setMonth(d);
					this.mode = 'month';
					this.render('fade');
				}.bindWithEvent(this, i));
			}
			this.d.increment('month',1)
			this.d.set('date',this.d.get('lastdayofmonth'))
		}
		if (!available) this.limit.right = true;
	},
	
	renderDecades: function() {
		// start neatly at interval (eg. 1980 instead of 1987)
		while (this.d.getFullYear() % this.options.yearsPerPage > 0) {
			this.d.setFullYear(this.d.getFullYear() - 1);
		}

		this.picker.getElement('.titleText').set('text', this.d.getFullYear() + '-' + (this.d.getFullYear() + this.options.yearsPerPage - 1));
		
		var i, y, e;
		var available = false;
		var container = new Element('div', { 'class': 'years' }).inject(this.newContents);
		
		if (this.options.minDate && this.d.getFullYear() <= this.options.minDate.getFullYear()) {
			this.limit.left = true;
		}
		
		for (i = 0; i < this.options.yearsPerPage; i++) {
			y = this.d.getFullYear();
			e = new Element('div', { 'class': 'year year' + i + (y == this.today.getFullYear() ? ' today' : '') + (y == this.choice.year ? ' selected' : '') }).set('text', y).inject(container);
			
			if (this.limited('year')) {
				e.addClass('unavailable');
				if (available) {
					this.limit.right = true;
				} else {
					this.limit.left = true;
				}
			} else {
				available = true;
				e.addEvent('click', function(e, d) {
					this.d.setFullYear(d);
					this.mode = 'year';
					this.render('fade');
				}.bindWithEvent(this, y));
			}
			this.d.setFullYear(this.d.getFullYear() + 1);
		}
		if (!available) {
			this.limit.right = true;
		}
		if (this.options.maxDate && this.d.getFullYear() >= this.options.maxDate.getFullYear()) {
			this.limit.right = true;
		}
	},
	
	limited: function(type) {
		var cs = this.options.minDate;
		var ce = this.options.maxDate;
		if (!cs && !ce) return false;
		
		switch (type) {
			case 'year':
				return (cs && this.d.getFullYear() < this.options.minDate.getFullYear()) || (ce && this.d.getFullYear() > this.options.maxDate.getFullYear());
				
			case 'month':
				// todo: there has got to be an easier way...?
				var ms = ('' + this.d.getFullYear() + this.leadZero(this.d.getMonth())).toInt();
				return cs && ms < ('' + this.options.minDate.getFullYear() + this.leadZero(this.options.minDate.getMonth())).toInt()
					|| ce && ms > ('' + this.options.maxDate.getFullYear() + this.leadZero(this.options.maxDate.getMonth())).toInt()
				
			case 'date':
				return (cs && this.d < this.options.minDate) || (ce && this.d > this.options.maxDate);
		}
	},
	
	allowZoomOut: function() {
		if (this.mode == 'time' && this.options.timePickerOnly) return false;
		if (this.mode == 'decades') return false;
		if (this.mode == 'year' && !this.options.yearPicker) return false;
		return true;
	},
	
	zoomOut: function() {
		if (!this.allowZoomOut()) return;
		if (this.mode == 'year') {
			this.mode = 'decades';
		} else if (this.mode == 'time') {
			this.mode = 'month';
		} else {
			this.mode = 'year';
		}
		this.render('fade');
	},
	
	previous: function() {
		if (this.mode == 'decades') {
			this.d.setFullYear(this.d.getFullYear() - this.options.yearsPerPage);
		} else if (this.mode == 'year') {
			this.d.setFullYear(this.d.getFullYear() - 1);
		} else if (this.mode == 'month') {
			this.d.setDate(1);
			this.d.setMonth(this.d.getMonth() - 1);
		}
		this.render('left');
		this.fireEvent('previous');
	},
	
	next: function() {
		if (this.mode == 'decades') {
			this.d.setFullYear(this.d.getFullYear() + this.options.yearsPerPage);
		} else if (this.mode == 'year') {
			this.d.setFullYear(this.d.getFullYear() + 1);
		} else if (this.mode == 'month') {
			this.d.setDate(1);
			this.d.setMonth(this.d.getMonth() + 1);
		}
		this.render('right');
		this.fireEvent('next');
	},
		
	destroy: function() {
		this.picker.destroy();
		this.picker = null;
		this.fireEvent('close');
	},
	
	select: function(values) {
		this.choice = $merge(this.choice, values);
		var d = Date.fromObject(this.choice);
		this.input.set('value', d.format(this.options.format))
			.store('datepicker:value',d);
		this.fireEvent('select', d);
		
		this.close(null, true);
	},
	
	leadZero: function(v) {
		return v < 10 ? '0'+v : v;
	}
	
});


Date.implement({
	
	toObject: function() {
		return {
			year: this.getFullYear(),
			month: this.getMonth(),
			day: this.getDate(),
			hours: this.getHours(),
			minutes: this.getMinutes(),
			seconds: this.getSeconds()
		};
	}
});

Date.extend({
	
	fromObject: function(values) {
		values = values || {};
		var d = new Date();
		d.setDate(1);
		['year', 'month', 'day', 'hours', 'minutes', 'seconds'].each(function(type) {
			var v = values[type];
			if (!$chk(v)) return;
			switch (type) {
				case 'day': d.setDate(v); break;
				case 'month': d.setMonth(v); break;
				case 'year': d.setFullYear(v); break;
				case 'hours': d.setHours(v); break;
				case 'minutes': d.setMinutes(v); break;
				case 'seconds': d.setSeconds(v); break;
			}
		});
		return d;
	}

});





//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************

/*
---
script: rotater.js
description: MGFX.Rotater, the base class that provides slides and transitions. 
authors: Sean McArthur (http://mcarthurgfx.com) 
license: MIT-style license 
requires:
 core/1.2.4: '*'
 more/1.2.4.1: [Fx.Elements]
provides: [MGFX.Rotater]
...
*/

//MGFX.Rotater. Copyright (c) 2008-2010 Sean McArthur <http://mcarthurgfx.com/>, MIT Style License.

var MGFX = MGFX || {};

MGFX.Rotater = new Class({
	
	Implements: [Options, Events],
	
	options: {
		slideInterval: 5000,
		transitionDuration: 1000,
		startIndex: 0,
		autoplay: true,
		hover:true,
		hash: true,
		onAutoPlay: $empty,
		onRotate: $empty,
		onShowSlide: $empty,
		onStop: $empty,
		onPause: $empty,
		onResume: $empty
	},
	
	initialize: function(slides,options){
		this.setOptions(options);
		this.slides = $$(slides);
		this.createFx();
		this.showSlide(this.options.startIndex);
		if(this.slides.length < 2) this.options.autoplay = false;
		if(this.options.autoplay) this.autoplay();
		return this;
	},
	
	createFx: function(){
		if (!this.slideFx) this.slideFx = new Fx.Elements(this.slides, {duration: this.options.transitionDuration, link: 'cancel'});
		this.slides.each(function(slide){
			slide.setStyles({
			    'opacity': 0,
			    'display': 'block'
            });
		});
	}.protect(),
	
	setupHover: function() {
		var _timeLastRotate = new Date(),
			_timeLastPause,
			_timeTillRotate = this.options.slideInterval,
			_resumeDelay;
			
		var onRotate = this._onRotate = function() {
			if(this.slideshowInt) {
				_timeLastRotate = new Date();
				_timeTillRotate = this.options.slideInterval;
			}
		};
		var onMouseEnter = this._onMouseEnter = function() {
			this.stop();
			_timeLastPause = new Date();
			$clear(_resumeDelay);
			this.fireEvent('onPause');
		}.bind(this);
		
		var onMouseLeave = this._onMouseLeave = function() {
			var timePassed = (_timeLastPause - _timeLastRotate);
			_timeLastRotate = new Date() - timePassed;
			_resumeDelay = (function() {
				this.autoplay();
				this.rotate();
				this.fireEvent('onResume');
			}).delay(_timeTillRotate - timePassed, this);			
		}.bind(this);
		
		this.addEvent('onRotate', onRotate);
		this.slides.addEvents({
			'mouseenter': onMouseEnter,
			'mouseleave': onMouseLeave
		});
	}.protect(),
	
	removeHover: function() {
		this.removeEvent('onRotate', this._onRotate);
		this.slides.removeEvents({
			'mouseenter': this._onMouseEnter,
			'mouseleave': this._onMouseLeave
		});
	},
	
	showSlide: function(slideIndex){
		if(slideIndex == this.currentSlide) return this;
		var action = {};
		this.slides.each(function(slide, index){
			if(index == slideIndex && index != this.currentSlide){ //show
				action[index.toString()] = {
					opacity: 1
				};
			} else {
				action[index.toString()] = {
					opacity:0
				};
			}
		}, this);
		this.fireEvent('onShowSlide', slideIndex);
		this.currentSlide = slideIndex;
		this.slideFx.start(action);
		return this;
	},
	
	autoplay: function(){
		if(this.options.hover) this.setupHover();
		this.slideshowInt = this.rotate.periodical(this.options.slideInterval, this);
		this.fireEvent('onAutoPlay');
		return this;
	},
	
	stop: function(not_pause){
		$clear(this.slideshowInt);
		this.fireEvent('onStop');
		if(not_pause && this.options.hover) this.removeHover();
		return this;
	},
	
	rotate: function(){
		var current = this.currentSlide;
		var next = (current+1 >= this.slides.length) ? 0 : current+1;
		this.showSlide(next);
		this.fireEvent('onRotate', next);
		return this;
	}

});

//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************


/*
---
script: tabs.js
description: MGFX.Tabs, extension of base class that adds tabs to control the rotater. 
authors: Sean McArthur (http://mcarthurgfx.com) 
license: MIT-style license 
requires:
 core/1.2.4: '*'
 more/1.2.4.1: [Fx.Elements]
provides: [MGFX.Tabs]
...
*/

//MGFX.Tabs. Copyright (c) 2008-2010 Sean McArthur <http://mcarthurgfx.com/>, MIT Style License.

var MGFX = MGFX || {};

MGFX.Tabs = new Class({
	
	Extends: MGFX.Rotater,
	
	options: {
		autoplay: false,
		onShowSlide: function(slideIndex) {
			this.tabs.removeClass('active');
			this.tabs[slideIndex].addClass('active');
		},
		tabIsLink: false
	},
	
	initialize: function(tabs, slides, options){
		this.setOptions(options);
		this.tabs = $$(tabs);
		this.createTabs(options.tabIsLink);
		if(this.options.hash && window.location.hash) {
			var hash = window.location.hash.substring(1);
			this.tabs.each(function(el, index) {
				if(el.get('id') == hash) {
					options.startIndex = index;
				}
			});
		}
		return this.parent(slides,options);
	},
	
	createTabs: function (isLink) {
	    if (!isLink)
		{
		    this.tabs.each(function(tab,index){
		        tab.addEvent('click', function(event){ 
			        event.preventDefault();
			        this.showSlide(index);
			        this.stop(true);
		        }.bind(this));
		    }.bind(this));
		}
	}.protect()
	
});


//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************

/* 
 * flowplayer.js 3.1.4. The Flowplayer API
 * 
 * Copyright 2009 Flowplayer Oy
 * 
 * This file is part of Flowplayer.
 * 
 * Flowplayer is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Flowplayer is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with Flowplayer.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * Date: 2009-02-25 21:24:29 +0000 (Wed, 25 Feb 2009)
 * Revision: 166 
 */
(function(){function g(o){console.log("$f.fireEvent",[].slice.call(o))}function k(q){if(!q||typeof q!="object"){return q}var o=new q.constructor();for(var p in q){if(q.hasOwnProperty(p)){o[p]=k(q[p])}}return o}function m(t,q){if(!t){return}var o,p=0,r=t.length;if(r===undefined){for(o in t){if(q.call(t[o],o,t[o])===false){break}}}else{for(var s=t[0];p<r&&q.call(s,p,s)!==false;s=t[++p]){}}return t}function c(o){return document.getElementById(o)}function i(q,p,o){if(typeof p!="object"){return q}if(q&&p){m(p,function(r,s){if(!o||typeof s!="function"){q[r]=s}})}return q}function n(s){var q=s.indexOf(".");if(q!=-1){var p=s.substring(0,q)||"*";var o=s.substring(q+1,s.length);var r=[];m(document.getElementsByTagName(p),function(){if(this.className&&this.className.indexOf(o)!=-1){r.push(this)}});return r}}function f(o){o=o||window.event;if(o.preventDefault){o.stopPropagation();o.preventDefault()}else{o.returnValue=false;o.cancelBubble=true}return false}function j(q,o,p){q[o]=q[o]||[];q[o].push(p)}function e(){return"_"+(""+Math.random()).substring(2,10)}var h=function(t,r,s){var q=this;var p={};var u={};q.index=r;if(typeof t=="string"){t={url:t}}i(this,t,true);m(("Begin*,Start,Pause*,Resume*,Seek*,Stop*,Finish*,LastSecond,Update,BufferFull,BufferEmpty,BufferStop").split(","),function(){var v="on"+this;if(v.indexOf("*")!=-1){v=v.substring(0,v.length-1);var w="onBefore"+v.substring(2);q[w]=function(x){j(u,w,x);return q}}q[v]=function(x){j(u,v,x);return q};if(r==-1){if(q[w]){s[w]=q[w]}if(q[v]){s[v]=q[v]}}});i(this,{onCuepoint:function(x,w){if(arguments.length==1){p.embedded=[null,x];return q}if(typeof x=="number"){x=[x]}var v=e();p[v]=[x,w];if(s.isLoaded()){s._api().fp_addCuepoints(x,r,v)}return q},update:function(w){i(q,w);if(s.isLoaded()){s._api().fp_updateClip(w,r)}var v=s.getConfig();var x=(r==-1)?v.clip:v.playlist[r];i(x,w,true)},_fireEvent:function(v,y,w,A){if(v=="onLoad"){m(p,function(B,C){if(C[0]){s._api().fp_addCuepoints(C[0],r,B)}});return false}A=A||q;if(v=="onCuepoint"){var z=p[y];if(z){return z[1].call(s,A,w)}}if(y&&"onBeforeBegin,onMetaData,onStart,onUpdate,onResume".indexOf(v)!=-1){i(A,y);if(y.metaData){if(!A.duration){A.duration=y.metaData.duration}else{A.fullDuration=y.metaData.duration}}}var x=true;m(u[v],function(){x=this.call(s,A,y,w)});return x}});if(t.onCuepoint){var o=t.onCuepoint;q.onCuepoint.apply(q,typeof o=="function"?[o]:o);delete t.onCuepoint}m(t,function(v,w){if(typeof w=="function"){j(u,v,w);delete t[v]}});if(r==-1){s.onCuepoint=this.onCuepoint}};var l=function(p,r,q,t){var s={};var o=this;var u=false;if(t){i(s,t)}m(r,function(v,w){if(typeof w=="function"){s[v]=w;delete r[v]}});i(this,{animate:function(y,z,x){if(!y){return o}if(typeof z=="function"){x=z;z=500}if(typeof y=="string"){var w=y;y={};y[w]=z;z=500}if(x){var v=e();s[v]=x}if(z===undefined){z=500}r=q._api().fp_animate(p,y,z,v);return o},css:function(w,x){if(x!==undefined){var v={};v[w]=x;w=v}r=q._api().fp_css(p,w);i(o,r);return o},show:function(){this.display="block";q._api().fp_showPlugin(p);return o},hide:function(){this.display="none";q._api().fp_hidePlugin(p);return o},toggle:function(){this.display=q._api().fp_togglePlugin(p);return o},fadeTo:function(y,x,w){if(typeof x=="function"){w=x;x=500}if(w){var v=e();s[v]=w}this.display=q._api().fp_fadeTo(p,y,x,v);this.opacity=y;return o},fadeIn:function(w,v){return o.fadeTo(1,w,v)},fadeOut:function(w,v){return o.fadeTo(0,w,v)},getName:function(){return p},getPlayer:function(){return q},_fireEvent:function(w,v,x){if(w=="onUpdate"){var y=q._api().fp_getPlugin(p);if(!y){return}i(o,y);delete o.methods;if(!u){m(y.methods,function(){var A=""+this;o[A]=function(){var B=[].slice.call(arguments);var C=q._api().fp_invoke(p,A,B);return C==="undefined"||C===undefined?o:C}});u=true}}var z=s[w];if(z){z.apply(o,v);if(w.substring(0,1)=="_"){delete s[w]}}}})};function b(o,t,z){var E=this,y=null,x,u,p=[],s={},B={},r,v,w,D,A,q;i(E,{id:function(){return r},isLoaded:function(){return(y!==null)},getParent:function(){return o},hide:function(F){if(F){o.style.height="0px"}if(y){y.style.height="0px"}return E},show:function(){o.style.height=q+"px";if(y){y.style.height=A+"px"}return E},isHidden:function(){return y&&parseInt(y.style.height,10)===0},load:function(F){if(!y&&E._fireEvent("onBeforeLoad")!==false){m(a,function(){this.unload()});x=o.innerHTML;if(x&&!flashembed.isSupported(t.version)){o.innerHTML=""}flashembed(o,t,{config:z});if(F){F.cached=true;j(B,"onLoad",F)}}return E},unload:function(){if(x.replace(/\s/g,"")!==""){if(E._fireEvent("onBeforeUnload")===false){return E}try{if(y){y.fp_close();E._fireEvent("onUnload")}}catch(F){}y=null;o.innerHTML=x}return E},getClip:function(F){if(F===undefined){F=D}return p[F]},getCommonClip:function(){return u},getPlaylist:function(){return p},getPlugin:function(F){var H=s[F];if(!H&&E.isLoaded()){var G=E._api().fp_getPlugin(F);if(G){H=new l(F,G,E);s[F]=H}}return H},getScreen:function(){return E.getPlugin("screen")},getControls:function(){return E.getPlugin("controls")},getConfig:function(F){return F?k(z):z},getFlashParams:function(){return t},loadPlugin:function(I,H,K,J){if(typeof K=="function"){J=K;K={}}var G=J?e():"_";E._api().fp_loadPlugin(I,H,K,G);var F={};F[G]=J;var L=new l(I,null,E,F);s[I]=L;return L},getState:function(){return y?y.fp_getState():-1},play:function(G,F){function H(){if(G!==undefined){E._api().fp_play(G,F)}else{E._api().fp_play()}}if(y){H()}else{E.load(function(){H()})}return E},getVersion:function(){var G="flowplayer.js 3.1.4";if(y){var F=y.fp_getVersion();F.push(G);return F}return G},_api:function(){if(!y){throw"Flowplayer "+E.id()+" not loaded when calling an API method"}return y},setClip:function(F){E.setPlaylist([F]);return E},getIndex:function(){return w}});m(("Click*,Load*,Unload*,Keypress*,Volume*,Mute*,Unmute*,PlaylistReplace,ClipAdd,Fullscreen*,FullscreenExit,Error,MouseOver,MouseOut").split(","),function(){var F="on"+this;if(F.indexOf("*")!=-1){F=F.substring(0,F.length-1);var G="onBefore"+F.substring(2);E[G]=function(H){j(B,G,H);return E}}E[F]=function(H){j(B,F,H);return E}});m(("pause,resume,mute,unmute,stop,toggle,seek,getStatus,getVolume,setVolume,getTime,isPaused,isPlaying,startBuffering,stopBuffering,isFullscreen,toggleFullscreen,reset,close,setPlaylist,addClip,playFeed").split(","),function(){var F=this;E[F]=function(H,G){if(!y){return E}var I=null;if(H!==undefined&&G!==undefined){I=y["fp_"+F](H,G)}else{I=(H===undefined)?y["fp_"+F]():y["fp_"+F](H)}return I==="undefined"||I===undefined?E:I}});E._fireEvent=function(O){if(typeof O=="string"){O=[O]}var P=O[0],M=O[1],K=O[2],J=O[3],I=0;if(z.debug){g(O)}if(!y&&P=="onLoad"&&M=="player"){y=y||c(v);A=y.clientHeight;m(p,function(){this._fireEvent("onLoad")});m(s,function(Q,R){R._fireEvent("onUpdate")});u._fireEvent("onLoad")}if(P=="onLoad"&&M!="player"){return}if(P=="onError"){if(typeof M=="string"||(typeof M=="number"&&typeof K=="number")){M=K;K=J}}if(P=="onContextMenu"){m(z.contextMenu[M],function(Q,R){R.call(E)});return}if(P=="onPluginEvent"){var F=M.name||M;var G=s[F];if(G){G._fireEvent("onUpdate",M);G._fireEvent(K,O.slice(3))}return}if(P=="onPlaylistReplace"){p=[];var L=0;m(M,function(){p.push(new h(this,L++,E))})}if(P=="onClipAdd"){if(M.isInStream){return}M=new h(M,K,E);p.splice(K,0,M);for(I=K+1;I<p.length;I++){p[I].index++}}var N=true;if(typeof M=="number"&&M<p.length){D=M;var H=p[M];if(H){N=H._fireEvent(P,K,J)}if(!H||N!==false){N=u._fireEvent(P,K,J,H)}}m(B[P],function(){N=this.call(E,M,K);if(this.cached){B[P].splice(I,1)}if(N===false){return false}I++});return N};function C(){if($f(o)){$f(o).getParent().innerHTML="";w=$f(o).getIndex();a[w]=E}else{a.push(E);w=a.length-1}q=parseInt(o.style.height,10)||o.clientHeight;if(typeof t=="string"){t={src:t}}r=o.id||"fp"+e();v=t.id||r+"_api";t.id=v;z.playerId=r;if(typeof z=="string"){z={clip:{url:z}}}if(typeof z.clip=="string"){z.clip={url:z.clip}}z.clip=z.clip||{};if(o.getAttribute("href",2)&&!z.clip.url){z.clip.url=o.getAttribute("href",2)}u=new h(z.clip,-1,E);z.playlist=z.playlist||[z.clip];var F=0;m(z.playlist,function(){var H=this;if(typeof H=="object"&&H.length){H={url:""+H}}m(z.clip,function(I,J){if(J!==undefined&&H[I]===undefined&&typeof J!="function"){H[I]=J}});z.playlist[F]=H;H=new h(H,F,E);p.push(H);F++});m(z,function(H,I){if(typeof I=="function"){if(u[H]){u[H](I)}else{j(B,H,I)}delete z[H]}});m(z.plugins,function(H,I){if(I){s[H]=new l(H,I,E)}});if(!z.plugins||z.plugins.controls===undefined){s.controls=new l("controls",null,E)}s.canvas=new l("canvas",null,E);t.bgcolor=t.bgcolor||"#000000";t.version=t.version||[9,0];t.expressInstall="http://www.flowplayer.org/swf/expressinstall.swf";function G(H){if(!E.isLoaded()&&E._fireEvent("onBeforeClick")!==false){E.load()}return f(H)}x=o.innerHTML;if(x.replace(/\s/g,"")!==""){if(o.addEventListener){o.addEventListener("click",G,false)}else{if(o.attachEvent){o.attachEvent("onclick",G)}}}else{if(o.addEventListener){o.addEventListener("click",f,false)}E.load()}}if(typeof o=="string"){flashembed.domReady(function(){var F=c(o);if(!F){throw"Flowplayer cannot access element: "+o}else{o=F;C()}})}else{C()}}var a=[];function d(o){this.length=o.length;this.each=function(p){m(o,p)};this.size=function(){return o.length}}window.flowplayer=window.$f=function(){var p=null;var o=arguments[0];if(!arguments.length){m(a,function(){if(this.isLoaded()){p=this;return false}});return p||a[0]}if(arguments.length==1){if(typeof o=="number"){return a[o]}else{if(o=="*"){return new d(a)}m(a,function(){if(this.id()==o.id||this.id()==o||this.getParent()==o){p=this;return false}});return p}}if(arguments.length>1){var r=arguments[1];var q=(arguments.length==3)?arguments[2]:{};if(typeof o=="string"){if(o.indexOf(".")!=-1){var t=[];m(n(o),function(){t.push(new b(this,k(r),k(q)))});return new d(t)}else{var s=c(o);return new b(s!==null?s:o,r,q)}}else{if(o){return new b(o,r,q)}}}return null};i(window.$f,{fireEvent:function(){var o=[].slice.call(arguments);var q=$f(o[0]);return q?q._fireEvent(o.slice(1)):null},addPlugin:function(o,p){b.prototype[o]=p;return $f},each:m,extend:i});if(typeof jQuery=="function"){jQuery.prototype.flowplayer=function(q,p){if(!arguments.length||typeof arguments[0]=="number"){var o=[];this.each(function(){var r=$f(this);if(r){o.push(r)}});return arguments.length?o[arguments[0]]:new d(o)}return this.each(function(){$f(this,k(q),p?k(p):{})})}}})();(function(){var e=typeof jQuery=="function";var i={width:"100%",height:"100%",allowfullscreen:true,allowscriptaccess:"always",quality:"high",version:null,onFail:null,expressInstall:null,w3c:false,cachebusting:false};if(e){jQuery.tools=jQuery.tools||{};jQuery.tools.flashembed={version:"1.0.4",conf:i}}function j(){if(c.done){return false}var l=document;if(l&&l.getElementsByTagName&&l.getElementById&&l.body){clearInterval(c.timer);c.timer=null;for(var k=0;k<c.ready.length;k++){c.ready[k].call()}c.ready=null;c.done=true}}var c=e?jQuery:function(k){if(c.done){return k()}if(c.timer){c.ready.push(k)}else{c.ready=[k];c.timer=setInterval(j,13)}};function f(l,k){if(k){for(key in k){if(k.hasOwnProperty(key)){l[key]=k[key]}}}return l}function g(k){switch(h(k)){case"string":k=k.replace(new RegExp('(["\\\\])',"g"),"\\$1");k=k.replace(/^\s?(\d+)%/,"$1pct");return'"'+k+'"';case"array":return"["+b(k,function(n){return g(n)}).join(",")+"]";case"function":return'"function()"';case"object":var l=[];for(var m in k){if(k.hasOwnProperty(m)){l.push('"'+m+'":'+g(k[m]))}}return"{"+l.join(",")+"}"}return String(k).replace(/\s/g," ").replace(/\'/g,'"')}function h(l){if(l===null||l===undefined){return false}var k=typeof l;return(k=="object"&&l.push)?"array":k}if(window.attachEvent){window.attachEvent("onbeforeunload",function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){}})}function b(k,n){var m=[];for(var l in k){if(k.hasOwnProperty(l)){m[l]=n(k[l])}}return m}function a(r,t){var q=f({},r);var s=document.all;var n='<object width="'+q.width+'" height="'+q.height+'"';if(s&&!q.id){q.id="_"+(""+Math.random()).substring(9)}if(q.id){n+=' id="'+q.id+'"'}if(q.cachebusting){q.src+=((q.src.indexOf("?")!=-1?"&":"?")+Math.random())}if(q.w3c||!s){n+=' data="'+q.src+'" type="application/x-shockwave-flash"'}else{n+=' classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'}n+=">";if(q.w3c||s){n+='<param name="movie" value="'+q.src+'" />'}q.width=q.height=q.id=q.w3c=q.src=null;for(var l in q){if(q[l]!==null){n+='<param name="'+l+'" value="'+q[l]+'" />'}}var o="";if(t){for(var m in t){if(t[m]!==null){o+=m+"="+(typeof t[m]=="object"?g(t[m]):t[m])+"&"}}o=o.substring(0,o.length-1);n+='<param name="flashvars" value=\''+o+"' />"}n+="</object>";return n}function d(m,p,l){var k=flashembed.getVersion();f(this,{getContainer:function(){return m},getConf:function(){return p},getVersion:function(){return k},getFlashvars:function(){return l},getApi:function(){return m.firstChild},getHTML:function(){return a(p,l)}});var q=p.version;var r=p.expressInstall;var o=!q||flashembed.isSupported(q);if(o){p.onFail=p.version=p.expressInstall=null;m.innerHTML=a(p,l)}else{if(q&&r&&flashembed.isSupported([6,65])){f(p,{src:r});l={MMredirectURL:location.href,MMplayerType:"PlugIn",MMdoctitle:document.title};m.innerHTML=a(p,l)}else{if(m.innerHTML.replace(/\s/g,"")!==""){}else{m.innerHTML="<h2>Flash version "+q+" or greater is required</h2><h3>"+(k[0]>0?"Your version is "+k:"You have no flash plugin installed")+"</h3>"+(m.tagName=="A"?"<p>Click here to download latest version</p>":"<p>Download latest version from <a href='http://www.adobe.com/go/getflashplayer'>here</a></p>");if(m.tagName=="A"){m.onclick=function(){location.href="http://www.adobe.com/go/getflashplayer"}}}}}if(!o&&p.onFail){var n=p.onFail.call(this);if(typeof n=="string"){m.innerHTML=n}}if(document.all){window[p.id]=document.getElementById(p.id)}}window.flashembed=function(l,m,k){if(typeof l=="string"){var n=document.getElementById(l);if(n){l=n}else{c(function(){flashembed(l,m,k)});return}}if(!l){return}if(typeof m=="string"){m={src:m}}var o=f({},i);f(o,m);return new d(l,o,k)};f(window.flashembed,{getVersion:function(){var m=[0,0];if(navigator.plugins&&typeof navigator.plugins["Shockwave Flash"]=="object"){var l=navigator.plugins["Shockwave Flash"].description;if(typeof l!="undefined"){l=l.replace(/^.*\s+(\S+\s+\S+$)/,"$1");var n=parseInt(l.replace(/^(.*)\..*$/,"$1"),10);var r=/r/.test(l)?parseInt(l.replace(/^.*r(.*)$/,"$1"),10):0;m=[n,r]}}else{if(window.ActiveXObject){try{var p=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7")}catch(q){try{p=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");m=[6,0];p.AllowScriptAccess="always"}catch(k){if(m[0]==6){return m}}try{p=new ActiveXObject("ShockwaveFlash.ShockwaveFlash")}catch(o){}}if(typeof p=="object"){l=p.GetVariable("$version");if(typeof l!="undefined"){l=l.replace(/^\S+\s+(.*)$/,"$1").split(",");m=[parseInt(l[0],10),parseInt(l[2],10)]}}}}return m},isSupported:function(k){var m=flashembed.getVersion();var l=(m[0]>k[0])||(m[0]==k[0]&&m[1]>=k[1]);return l},domReady:c,asString:g,getHTML:a});if(e){jQuery.fn.flashembed=function(l,k){var m=null;this.each(function(){m=flashembed(this,l,k)});return l.api===false?this:m}}})();


//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************

moopupGallery = new Class({
	Implements: [Options, Events, Chain],
	options: {
		index               : 0,
		arr_mini_src        : [],
		arr_full_src        : [],
		arr_alt_txt         : [],
        autoplay            : false,
		autoplay_time       : 5, // in seconds
        autoplay_timer      : null,
        current_img         : null,
        settings            : {
            nav_opacity_max : 1,
		    nav_opacity_min : 0.7,
		    back_opacity    : 0.85,
		    gallery_offset  : 140,
		    nav_offset      : 20,
		    arrow_offset_min: 0,
		    arrow_offset_max: -5000,
		    mini_border_up  : '#8A8986',
		    mini_border_over: '#FFFFFF'
        },
        src                 : {
            play            : '/img/popup_play.gif',
		    stop            : '/img/popup_stop.gif',
            arrow_left      : '/img/popup_arrow_left.gif',
		    arrow_right     : '/img/popup_arrow_right.gif',
            close           : '/img/popup_close.gif'
        },
        lang                : { 
	 	    left            : 'Влево',
            right           : 'Вправо',
            play            : 'Слайд-шоу',
            close           : 'Закрыть',
            of              : 'из',
            show_original   : 'открыть оригинал'
		},
        html                : {
	       popup_back       : null,
		   popup_nav        : null,
		   popup_img        : null, 
		   output_counter   : null,
		   left_btn         : null,
		   right_btn        : null,
		   mini_nav         : null,
		   play_btn         : null,
           close_btn        : null,
		   mini_gllr_cont   : null,
		   mini_gllr        : null
        }
        /*
		onInit              : $empty,   // fire when 
        onStart             : $empty,   // fire when 
		onChangeStart       : $empty,   // fire when 
        onChangeComplete    : $empty,   // fire when 
        onClose             : $empty    // fire after the moopupGallery is closed (destroyed)
        
        arr_mini_img        : [],       // внутренний массив для мини-изображений
        ready               : true,     // флаг готовности к смене изображения
        this_class          : null,     // внутренний доступ к текущему классу
        abroad              : false     // флаг выхода изображения за границы видимой области
        */
	},
	initialize: function(options){
		this.setOptions(options); // присвоим index, arr_mini_src, arr_full_src, arr_alt_txt
		this.fireEvent('onInit'); // присвоим событие onInit если задано
		
        var _tc = this.options.this_class = this; // для глобального доступа
        var _tc_o = _tc.options;

        if (_tc_o.arr_full_src.clean().length == 0 || _tc_o.arr_full_src.clean().length == 0)
		{
			alert('Один из массивов изображений пустой');
			return false;
		}
        
        _tc.prepareHtml();
		_tc_o.ready = true;
        _tc.initShow();
        _tc.initEvents();
        _tc.changeImage();
			
		if (_tc_o.autoplay == true) _tc.autoplayStart(); // запустим слайд-шоу
	},
    prepareHtml: function()
	{
        var _tc = this.options.this_class;
        var _tc_o = _tc.options;
        var _tc_html = _tc.options.html;
        var _tc_s = _tc.options.settings;
        
        //    <div id="popup_back"></div>
        //    <div id="popup_img"></div>
        //    <div id="popup_nav">
        //        <img alt="Left" class="l" src="/img/popup_arrow_left.gif"/>
        //        <p class="counter"></p>
        //        <img alt="Right" class="r" src="/img/popup_arrow_right.gif"/>
        //        <p class="cb"></p>
        //        <div class="mini_gallery_container">
        //            <div class="mini_gallery">
        //            </div>
        //        </div>
        //        <p class="mini_nav">
        //            <img class="play" alt="SlideShow" src=""/>
        //            <img class="close" alt="Close" src="/img/popup_close.gif"/>
        //        </p>
        //    </div>

        _tc_html.popup_back = new Element('div', {'class':'popup_back'}).setStyle('opacity', _tc_s.back_opacity).inject(document.body);
		_tc_html.popup_img = new Element('div', {'class':'popup_img'}).inject(document.body);
        _tc_html.popup_nav = new Element('div', {'class':'popup_nav'}).inject(document.body);
        
		_tc_html.left_btn = new Element('img', {'class':'l',alt:_tc_o.lang.left,src:_tc_o.src.arrow_left}).inject(_tc_html.popup_nav);
        _tc_html.output_counter = new Element('p', {'class':'counter'}).inject(_tc_html.popup_nav);
		_tc_html.right_btn = new Element('img', {'class':'r',alt:_tc_o.lang.right,src:_tc_o.src.arrow_right}).inject(_tc_html.popup_nav);
        new Element('p', {'class':'cb'}).inject(_tc_html.popup_nav);
        _tc_html.mini_gllr_cont = new Element('div', {'class':'mini_gallery_container'}).inject(_tc_html.popup_nav);
		_tc_html.mini_gllr = new Element('div', {'class':'mini_gallery'}).inject(_tc_html.mini_gllr_cont);
		_tc_html.mini_nav = new Element('div', {'class':'mini_nav'}).inject(_tc_html.popup_nav).setStyles({'visibility': 'hidden', 'opacity': 0});
		_tc_html.play_btn = new Element('img', {'class':'play','alt':_tc_o.lang.play,'src':_tc_o.src.play}).inject(_tc_html.mini_nav);
		_tc_html.close_btn = new Element('img', {'class':'close','alt':_tc_o.lang.close,'src':_tc_o.src.close}).inject(_tc_html.mini_nav);

        _tc_o.arr_mini_src.each(function(mini_src, i){
			new Element('p').setStyles({
				'background': _tc_s.mini_border_up + ' url(' + mini_src + ') no-repeat 50% 50%',
				'border': '1px solid ' + _tc_s.mini_border_up
			}).inject(_tc_html.mini_gllr);
		});
		_tc_o.arr_mini_img = _tc_html.mini_gllr.getChildren('p');
    }.protect(),
	initShow: function()
	{
		this.fireEvent('onStart'); // присвоим событие onStart если задано

		var _tc = this.options.this_class;
        var _tc_o = _tc.options;
        var _tc_html = _tc.options.html;
        var _tc_s = _tc.options.settings;

		// покажем галерею
		$$(_tc_html.popup_back, _tc_html.popup_nav, _tc_html.popup_img).setStyle('display', 'block');
		
        // расстянем фон на весь экран
		if (_tc_html.popup_back.getHeight().toInt() < window.getScrollSize().y)
			_tc_html.popup_back.setStyle('height', window.getScrollSize().y);
			
		// зададим координаты
		_tc_html.popup_nav.setStyles({
			'top': _tc_s.nav_offset + window.getScroll().y,
			'left': window.getSize().x/2 - _tc_html.popup_nav.getWidth().toInt()/2 + window.getScroll().x
		});
		_tc_html.popup_img.setStyles({
			'top': _tc_s.gallery_offset + window.getScroll().y,
			'left': 
                $chk(_tc_o.current_img) ? 
                window.getSize().x/2 - _tc_o.current_img.width/2 + window.getScroll().x : 
                window.getSize().x/2 - _tc_html.popup_img.getStyle('width').toInt()/2 + window.getScroll().x
		});
			
		// зададим ширину минигалереи и начальные координаты
		_tc_html.mini_gllr.setStyles({
			'width': _tc_o.arr_mini_img.length * 
					(_tc_o.arr_mini_img[0].getWidth() + 
					_tc_o.arr_mini_img[0].getStyle('margin-left').toInt() +
					_tc_o.arr_mini_img[0].getStyle('margin-right').toInt() + 2), // +2 для ие6, да-да ие гавно
			'left': _tc_html.mini_gllr_cont.getWidth()/2 -
					_tc_o.arr_mini_img[_tc_o.index].offsetLeft - 
					_tc_o.arr_mini_img[_tc_o.index].getWidth()/2
		});
	}.protect(),
    initEvents: function()
	{
        var _tc = this.options.this_class;
        var _tc_o = _tc.options;
        var _tc_html = _tc.options.html;
        var _tc_s = _tc.options.settings;

        // присвоим события для мини-изображений
        _tc_o.arr_mini_img.each(function(p, i){
			p.addEvents({
				'click': function(){
					if (!_tc_o.ready || _tc_o.autoplay) return false;
					else if (_tc_o.index != i)
					{
						if (!_tc_o.ready) return false;
						_tc_o.index = i;
						_tc.changeImage();
					}
				},
				'mouseenter': function(){
					if (_tc_o.autoplay) return false;
					this.set('tween', {transition: 'cubic:out', duration: 300}).tween('border-color', _tc_s.mini_border_over);
				},
				'mouseleave': function(){
					if (_tc_o.index != i)
						this.set('tween', {transition: 'cubic:out', duration: 300}).tween('border-color', _tc_s.mini_border_up);
				}
			});
		});
        
        // присвоим функции кнопкам навигации
		_tc_html.left_btn.addEvent('click', function(){
			if (!_tc_o.ready) return false;
			_tc_o.index--;
			_tc.changeImage();
		});
		_tc_html.right_btn.addEvent('click', function(){
			if (!_tc_o.ready) return false;
			_tc_o.index++;
			_tc.changeImage();
		});
		_tc_html.close_btn.addEvent('click', function(){
			_tc.close();
		});
		_tc_html.play_btn.addEvent('click', function(){
			if (this.getProperty('src') == _tc_o.src.stop) _tc.autoplayStop(); //остановим слайд-шоу
			else _tc.autoplayStart(); // запустим слайд-шоу
		});
			
		// спрячем кнопки мини_навигации
		_tc_html.popup_nav.addEvent('mouseenter', function(){
			_tc_html.mini_nav.fade('in');
		});
		_tc_html.popup_nav.addEvent('mouseleave', function(){
			_tc_html.mini_nav.fade('out');
		});
			
		// зададим эффект при наведении на кнопки навигации
		$$(_tc_html.popup_nav.getChildren('img'), _tc_html.play_btn, _tc_html.close_btn)
            .setStyle('opacity', _tc_s.nav_opacity_min)
            .addEvents({
			    'mouseenter': function(){
				    this.set('tween', {transition: 'cubic:out', duration: 300}).tween('opacity', _tc_s.nav_opacity_max);
			    },
			    'mouseleave': function(){
				    this.set('tween', {transition: 'cubic:out', duration: 300}).tween('opacity', _tc_s.nav_opacity_min);
			    }
		    }
        );
    }.protect(),
	changeImage: function()
	{
		this.fireEvent('onChangeStart'); // присвоим событие onChangeStart если задано

		var _tc = this.options.this_class;
        var _tc_o = _tc.options;
        var _tc_html = _tc.options.html;
        var _tc_s = _tc.options.settings;
			
		_tc_o.ready = false; // не реагировать на действия пользователя, пока не загрузится изображение
			
		if (_tc_o.index < 0)
		{
			_tc_o.index = 0;
			return false;
		}
		else if (_tc_o.index >= _tc_o.arr_full_src.length)
		{
			_tc_o.index = _tc_o.arr_full_src.length-1;
			return false;
		}
			
		if (_tc_o.autoplay == false)
		{
			if (_tc_o.index == 0) _tc_html.left_btn.setStyle('top', _tc_s.arrow_offset_max);
			else if (_tc_o.index > 0) _tc_html.left_btn.setStyle('top', _tc_s.arrow_offset_min);
			if (_tc_o.index < _tc_o.arr_full_src.length-1) _tc_html.right_btn.setStyle('top', _tc_s.arrow_offset_min);
			else if (_tc_o.index == _tc_o.arr_full_src.length-1) _tc_html.right_btn.setStyle('top', _tc_s.arrow_offset_max);
		}
			
		// выделим текущее изображение в минигалерее
		_tc_o.arr_mini_img.set('tween', {transition: 'cubic:out', duration: 300}).tween('border-color', _tc_s.mini_border_up);
		_tc_o.arr_mini_img[_tc_o.index].set('tween', {transition: 'cubic:out', duration: 300}).tween('border-color', _tc_s.mini_border_over);
			
		// прокрутим минигалерею на текущее изображение
		_tc_html.mini_gllr.set('tween', {duration: 500}).tween('left', 
			_tc_html.mini_gllr_cont.getWidth()/2 -
			_tc_o.arr_mini_img[_tc_o.index].offsetLeft - _tc_o.arr_mini_img[_tc_o.index].getWidth()/2
		);
			
		_tc_html.popup_img.empty(); // почистим от всех дочерних элементов
		_tc_html.output_counter.set('html', (_tc_o.index+1) + ' ' + _tc_o.lang.of + ' ' + _tc_o.arr_full_src.length); // напишем текущий номер
			
        _tc_o.abroad = false;

		// покажем изображение
		_tc_o.current_img = new Asset.image(_tc_o.arr_full_src[_tc_o.index], {
			alt: $chk(_tc_o.arr_alt_txt[_tc_o.index]) ? _tc_o.arr_alt_txt[_tc_o.index] : '',
			onload: function(){
				_tc_html.popup_nav.setStyles({
					'top': _tc_s.nav_offset + window.getScroll().y,
					'left': window.getSize().x/2 - _tc_html.popup_nav.getWidth()/2 + window.getScroll().x
				});

                // посчитаем доступную зону просмотра
                var available_width = window.getSize().x - 100;
                var available_height = window.getSize().y - 100 - _tc_s.gallery_offset;

                // если изображение вылазит за границы доступной зоны, то меняем размеры
                if (_tc_o.current_img.width > available_width || _tc_o.current_img.height > available_height)
                {
                    _tc_o.abroad = true;

                    var new_width, new_height;

                    var new_ratio = available_width / available_height;
                    var original_ratio = _tc_o.current_img.width / _tc_o.current_img.height;

                    if (new_ratio > original_ratio)
                    {
                        new_height = available_height;
                        new_width = Math.floor(original_ratio * available_height);
                    }
                    else
                    {
                        new_height = Math.floor(available_width / original_ratio);
                        new_width = available_width;
                    }

                    _tc_o.current_img.width = new_width > available_width ? available_width : new_width;
                    _tc_o.current_img.height = new_height > available_height ? available_height : new_height;
                }

				_tc_html.popup_img.set('morph', {
					transition:'cubic:out',
					duration: 250,
					onComplete: function(){
						_tc_html.popup_img.empty(); // почистим от всех дочерних элементов

						_tc_o.current_img.inject(_tc_html.popup_img).setStyle('opacity', 0).set('tween', {
							duration: 500,
							onComplete: function(){
                                _tc.fireEvent('onChangeComplete'); // присвоим событие onChangeComplete если задано
                                _tc_o.ready = true;
                                
                                // создадим подпись, если она есть или 
                                // ссылку на оригинал, если изображение вышло за границу
								if ($chk(_tc_o.arr_alt_txt[_tc_o.index]) || _tc_o.abroad)
								{
                                    var p_height = new Element('p').set('html',
                                        (_tc_o.abroad ? '» <a target="_blank" style="font-size:12px; font-weight:bold;" href="' + _tc_o.current_img.getProperty('src') + '">' + 
                                            _tc_o.lang.show_original + '</a> «<br/>' : '') + 
                                        ($chk(_tc_o.arr_alt_txt[_tc_o.index]) ? _tc_o.arr_alt_txt[_tc_o.index] : '')
                                    ).inject(_tc_html.popup_img).getHeight();

                                    // растянем белое окно
									_tc_html.popup_img.set('tween', {
										transition:'cubic:out', 
										duration: 250
									}).tween('height', _tc_o.current_img.height + p_height);
								}
							}
						}).tween('opacity', 1);
					}
				}).morph({
					'top': _tc_s.gallery_offset + window.getScroll().y,
					'left': window.getSize().x/2 - _tc_o.current_img.width/2 + window.getScroll().x,
					'width': _tc_o.current_img.width,
					'height': _tc_o.current_img.height
				});
			}
		}).addEvent('click', function(){ _tc.close() });

        return _tc;
	},
	autoplayStart: function()
	{
        var _tc = this.options.this_class;
        var _tc_o = _tc.options;
        var _tc_html = _tc.options.html;
        var _tc_s = _tc.options.settings;

		_tc_o.autoplay = true;
			
		_tc_html.play_btn.setProperty('src', _tc_o.src.stop);
		_tc_html.left_btn.setStyle('top', _tc_s.arrow_offset_max);
		_tc_html.right_btn.setStyle('top', _tc_s.arrow_offset_max);
			
		_tc_html.mini_gllr.setStyle('opacity', _tc_s.nav_opacity_min == 0 ? 0 : _tc_s.nav_opacity_min/2);
		_tc_html.output_counter.setStyle('opacity', _tc_s.nav_opacity_min == 0 ? 0 : _tc_s.nav_opacity_min/2);
			
		_tc_o.arr_mini_img.setStyle('cursor', 'default');
			
		_tc_o.autoplay_timer = function (){
			if (_tc_o.ready == true)
			{
				_tc_o.index++;
				if (_tc_o.index > _tc_o.arr_full_src.length-1) _tc_o.index = 0;
				_tc.changeImage();
			}
		}.periodical(_tc_o.autoplay_time*1000);

        return _tc;
	},
	autoplayStop: function()
	{
        var _tc = this.options.this_class;
        var _tc_o = _tc.options;
        var _tc_html = _tc.options.html;
        var _tc_s = _tc.options.settings;

		_tc_o.autoplay = false;
		
		_tc_html.play_btn.setProperty('src', _tc_o.src.play);
		if (_tc_o.index != 0) _tc_html.left_btn.setStyle('top', _tc_s.arrow_offset_min);
		if (_tc_o.index != _tc_o.arr_full_src.length-1) _tc_html.right_btn.setStyle('top', _tc_s.arrow_offset_min);
			
		_tc_html.mini_gllr.setStyle('opacity', 1);
		_tc_html.output_counter.setStyle('opacity', 1);
			
		_tc_o.arr_mini_img.setStyle('cursor', 'pointer');
			
		$clear(_tc_o.autoplay_timer);

        return _tc;
	},
    removeHtml: function ()
    {
        var _tc_html = this.options.html;

        _tc_html.popup_back.destroy();
		_tc_html.popup_img.destroy();
        _tc_html.popup_nav.destroy();
    }.protect(),
	close: function()
	{
        var _tc = this.options.this_class;
        var _tc_o = _tc.options;

		_tc_o.arr_mini_src.empty();
		_tc_o.arr_full_src.empty();
		_tc_o.arr_alt_txt.empty();
        _tc_o.arr_mini_img.empty();
			
		$clear(_tc_o.autoplay_timer);

        _tc.removeHtml();
			
		_tc.fireEvent('onClose'); // присвоим событие onComplete если задано

        return _tc;
	}
});

//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************
//*************************************************************************************************************

new Asset.javascript('http://www.google.com/jsapi');
new Asset.javascript('/ckeditor/ckeditor.js');
new Asset.javascript('/scripts/default.js');