
	/**
	 * @author Dallas Clark <dallas@dallasjclark.com>
	 * @description Creates banners using iframes with a controller
	 */
	
	var Banner = new Class({
		Implements: [Options, Events],
		
		options: {
			iframe_banners: '',
			banner_controller: '',
			banner_controller_buttons: [],
			banners: [],
			iframe_count: 0,
			iframe_width: 953,
			iframe_height: 314,
			iframe_banners_width: 0,
			automatic_rotator: '',
			automatic_rotator_delay: 5,
			automatic_rotator_current_banner: 0,
			automatic_rotator_current_position: 0
		},
		
		/**
		 *
		 */
		initialize: function(options){
			this.setOptions(options);
			this.setupIFrames();
			
			// Rotate Banners
			if(this.options.banners.length > 1) {
				this.options.automatic_rotator_current_banner = 1;
				this.options.automatic_rotator_current_position = this.options.iframe_width;
				var rotate_banner = function() {
					this.rotateBanner();
				}.bind(this)
				this.options.automatic_rotator = rotate_banner.periodical(this.options.automatic_rotator_delay * 1000);
			}
			
			this.options.iframe_banners.addEvents({
				'mouseenter': function() {
					$clear(this.options.automatic_rotator);
				}.bind(this),
				'mouseleave': function() {
					this.options.automatic_rotator = rotate_banner.periodical(this.options.automatic_rotator_delay * 1000);
				}.bind(this),
				'click': function() {
						alert(1);
					$clear(this.options.automatic_rotator);
					this.rotateBanner();
				}.bind(this)
			});
		},
		
		/**
		 *
		 */
		setupIFrames: function() {
			this.options.iframe_count = 0;
			this.options.iframe_banners_width = 0;
			this.options.banners.each(function(banner) {
				//iframe
				var button_number = this.options.iframe_count;
				var current_iframe_banners_width = this.options.iframe_banners_width;
				this.options.iframe_banners_width += parseInt(this.options.iframe_width);
				this.options.iframe_banners.setStyle('width', this.options.iframe_banners_width + "px");
				
				var iframe = new Element('iframe', {
					'src': banner,
					'width': this.options.iframe_width,
					'height': this.options.iframe_height,
					'frameborder': '0',
					'scrolling': 'no'
				});
				this.options.iframe_banners.adopt(iframe);
				
				//navigation
				var button_li = new Element('li');
				var button_a = new Element('a', {
					'href': '',
					'html': 'Next Gen',
					'events': {
						'click': function(event) {
							event.stop();
							$clear(this.options.automatic_rotator);
							this.showBanner(button_a, button_number, current_iframe_banners_width);
						}.bind(this)
					}
				});
				// Make the first button selected
				if(!this.options.iframe_count) {
					button_a.addClass('selected');
				}
				button_li.adopt(button_a);
				this.options.banner_controller.adopt(button_li);
				this.options.banner_controller_buttons[this.options.banner_controller_buttons.length] = button_a;
				
				this.options.iframe_count++;
			}.bind(this));
		},
		
		/**
		 *
		 */
		showBanner: function(button, button_number, margin) {
			this.options.automatic_rotator_current_banner = button_number + 1;
			this.options.automatic_rotator_current_position = margin + parseInt(this.options.iframe_width);
			
			this.options.banner_controller.getElements('a').each(function(anchor) {
				anchor.removeClass('selected');
			});
			button.addClass('selected');
			
			this.options.iframe_banners.set('tween', {
				transition: Fx.Transitions.Cubic.easeOut
			});
			this.options.iframe_banners.tween('margin-left', "-" + margin);
		},
		
		/**
		 *
		 */
		rotateBanner: function() {
			this.showBanner(this.options.banner_controller_buttons[this.options.automatic_rotator_current_banner], this.options.automatic_rotator_current_banner, this.options.automatic_rotator_current_position);
			if(this.options.automatic_rotator_current_banner >= this.options.banner_controller_buttons.length) {
				this.options.automatic_rotator_current_banner = 0;
				this.options.automatic_rotator_current_position = 0;
			}
		}
	});

/* rotating testimonials - temporary variant */

var startTestimonials = function() {
	fadeOpacity.addRule('showrule', 0, 1, 100);
	fadeOpacity.addRule('hiderule', 1, 0, 50);

	return setInterval(function(){rotateTestimonials();}, 7000);
}

var rotateTestimonials = function() {
	var active = testimonials.pop();
	fadeOpacity(active, 'showrule');
	
	for (var i = 0; i < testimonials.length; i++) {
		fadeOpacity(testimonials[i], 'hiderule');
	}
	
	testimonials.unshift(active);
}

/*
wwww.tigir.com - 06.07.2006

Source: http://www.tigir.com/js/opacity.js

Библиотека opacity.js к статье "CSS прозрачность (css opacity, javascript opacity)" - http://www.tigir.com/opacity.htm

setElementOpacity - установка прозрачности
getOpacityProperty - проверка, есть ли возможность менять прозрачность
fadeOpacity - плавное изменение прозрачности
*/

/* Функция кроссбраузерной установки прозрачности

Пример: setElementOpacity(document.body, 0.5); //сделать документ прозрачным на половину
*/
function setElementOpacity(oElem, nOpacity)
{
	var p = getOpacityProperty();
	(setElementOpacity = p=="filter"?new Function('oElem', 'nOpacity', 'nOpacity *= 100;	var oAlpha = oElem.filters["DXImageTransform.Microsoft.alpha"] || oElem.filters.alpha;	if (oAlpha) oAlpha.opacity = nOpacity; else oElem.style.filter += "progid:DXImageTransform.Microsoft.Alpha(opacity="+nOpacity+")";'):p?new Function('oElem', 'nOpacity', 'oElem.style.'+p+' = nOpacity;'):new Function)(oElem, nOpacity);
}

// Функция getOpacityProperty() возвращает свойство которое используется для смены прозрачности или undefined, и может использоваться для проверки возможности изменения прозрачности
function getOpacityProperty()
{
	var p;
	if (typeof document.body.style.opacity == 'string') p = 'opacity';
	else if (typeof document.body.style.MozOpacity == 'string') p =  'MozOpacity';
	else if (typeof document.body.style.KhtmlOpacity == 'string') p =  'KhtmlOpacity';
	else if (document.body.filters && navigator.appVersion.match(/MSIE ([\d.]+);/)[1]>=5.5) p =  'filter';
	
	return (getOpacityProperty = new Function("return '"+p+"';"))();
}

/* Функции для плавного изменения прозрачности:

1) fadeOpacity.addRule('opacityRule1', 1, 0.5, 30); //вначале создаем правило, задаем имя правила, начальную прозрачность и конечную, необязательный параметр задержки, влийяющий на скорость смены прозрачности
2) fadeOpacity('elemID', 'opacityRule1'); // выполнить плавную смену прозрачности элемента с id равным elemID, по правилу opacityRule1
3) fadeOpacity.back('elemID'); //вернуться в исходное сотояние прозрачности
*/
function fadeOpacity(sElemId, sRuleName, bBackward)
{
	var elem = document.getElementById(sElemId);
	if (!elem || !getOpacityProperty() || !fadeOpacity.aRules[sRuleName]) return;
	
	var rule = fadeOpacity.aRules[sRuleName];
	var nOpacity = rule.nStartOpacity;
	
	if (fadeOpacity.aProc[sElemId]) {clearInterval(fadeOpacity.aProc[sElemId].tId); nOpacity = fadeOpacity.aProc[sElemId].nOpacity;}
	if ((nOpacity==rule.nStartOpacity && bBackward) || (nOpacity==rule.nFinishOpacity && !bBackward)) return;

	fadeOpacity.aProc[sElemId] = {'nOpacity':nOpacity, 'tId':setInterval('fadeOpacity.run("'+sElemId+'")', fadeOpacity.aRules[sRuleName].nDalay), 'sRuleName':sRuleName, 'bBackward':Boolean(bBackward)};
}

fadeOpacity.addRule = function(sRuleName, nStartOpacity, nFinishOpacity, nDalay){fadeOpacity.aRules[sRuleName]={'nStartOpacity':nStartOpacity, 'nFinishOpacity':nFinishOpacity, 'nDalay':(nDalay || 30),'nDSign':(nFinishOpacity-nStartOpacity > 0?1:-1)};};

fadeOpacity.back = function(sElemId){fadeOpacity(sElemId,fadeOpacity.aProc[sElemId].sRuleName,true);};

fadeOpacity.run = function(sElemId)
{
	var proc = fadeOpacity.aProc[sElemId];
	var rule = fadeOpacity.aRules[proc.sRuleName];
	
	proc.nOpacity = Math.round(( proc.nOpacity + .1*rule.nDSign*(proc.bBackward?-1:1) )*10)/10;
	setElementOpacity(document.getElementById(sElemId), proc.nOpacity);
	
	if (proc.nOpacity==rule.nStartOpacity || proc.nOpacity==rule.nFinishOpacity) clearInterval(fadeOpacity.aProc[sElemId].tId);
}
fadeOpacity.aProc = {};
fadeOpacity.aRules = {};

