if (typeof Effect == 'undefined') alert("ff_effects.js requires script.aculo.us' effects.js library!");

Effect.imgSwap = function(element, url) {
	var element = $(element);
	var options = Object.extend({
	}, options || {});

	if(element.nodeName=="IMG"){
		if(element.visible()==true){
			element.hide();
		}
		element.src = url;
		element.alt = options.alt;
		element.title = options.title;
		element.show();
	}
}

Effect.imgSmoothSwap = function(element, url, options){
	var element = $(element);
	var options = Object.extend({
		duration: 2,
		from: 0.2,
		to: 1.0
	}, options || {});
	if (element.src != url) {
		var fade = (options.duration/2);
		var queue = Effect.Queues.get(element.id);
		
		if(queue.toArray().length<1){
			if(element.nodeName=="IMG"){
				if(element.visible()==true){
					Effect.BlindUp(element, {
						duration: fade,
						queue: {position: 'first', scope: element.id, limit: 2}
					});
				}
				//element.src = url;
				//element.alt = options.alt;
				//element.title = options.title;
				Effect.imgSwap(element, url, {alt: options.alt, title: options.title});
			
				Effect.BlindDown(element, {
					duration: fade,
					queue: {position: 'end', scope: element.id, limit:2}
				});
			}
		}
	}
}

Effect.swapLightboxLink = function(element, thumbnailUrl, imageUrl, options) {
	element = $(element);	
	//var children = element.childNodes;
	var nodeList = element.childNodes;
	for(i=0;i<nodeList.length;i++){
		if(nodeList.item(i).nodeName=="IMG"){
			//Effect.imgSmoothSwap(nodeList.item(i), thumbnailUrl, options);
			Effect.imgSwap(nodeList.item(i), thumbnailUrl, options);
		}
	}
	element.href = imageUrl;
	element.title = options.title;
	//element.writeAttribute(element, {href: imageUrl});
}

Effect.toggleHandled = new Class.create(
	Effect.Base, 
	{
		initialize: function(element) {
		    this.element = $(element);
		    if (!this.element) throw(Effect._elementDoesNotExistError);

			this.options = Object.extend({
				hanlde			: null,
				event			: 'click',
				effect			: 'blind',
				duration		: 0.3,
				visible			: true,
				classVisible	: 'expanded',
				classHidden		: 'collapsed'
			}, arguments[1] || { });

			if (!this.options.handle) {
				this.options.handle = Element.identify(this.element)+'-handle';
			}
			this.handle = $(this.options.handle);
		    if (!this.handle) throw(Effect._elementDoesNotExistError);
			
			if (this.options.visible == true) {
				if (Element.visible(this.element) == false) {
					this.element.show();
				}
				this.handle.addClassName(this.options.classVisible);
			} else {
				if (Element.visible(this.element) == true) {
					this.element.hide();
				}
				this.handle.addClassName(this.options.classHidden);
			}
			
			this.handle.observe(
				this.options.event, 
				function(event){
					// Event.stop(event);
					if (this.options.event == 'click') {
						this.handle.onclick = function() {return false;};
					}
					this.toggle();
				}.bind(this)
			);
			return this;
		},
		
		toggle : function() {
			if (Element.visible(this.element) == true) {
				this.handle.removeClassName(this.options.classVisible);
				this.handle.addClassName(this.options.classHidden);
			} else {
				this.handle.removeClassName(this.options.classHidden);
				this.handle.addClassName(this.options.classVisible);
			}
			if (this.options.duration < 0.01) {
				this.element.toggle();
			} else {
				Effect.toggle(this.element, this.options.effect, {duration: this.options.duration});
			}
		}
	}
);

accordions = Class.create();
accordions.prototype = {
	accordions : [],

	initialize: function(container, options) {
		this.options = Object.extend({
			byClass:	'accordion'
		}, options || {});

		//Event.observe(window, 'load', function() {
		if (!container) {
			var accordions = $$(this.options.byClass);
		} else {
			var accordions = $$('#'+Element.identify(container)+' .'+this.options.byClass);
		}
		accordions.each(
			function(accordion) {
				this.accordions.push(new Effect.accordion(accordion, this.options));
			}.bind(this)
		);
		//}
	}
}
/*
Effect.accordion = Class.create();
Object.extend(
	Object.extend(Effect.accordion.prototype, Effect.Base.prototype), 
	{
*/
Effect.accordion = new Class.create(
	Effect.Base, 
	{
		accordion	: null,
		animating	: false,
		active		: null,
		deactivate	: null,
		items		: [],
		effects		: [],
		
		initialize	: function(accordion, options) {
			this.options = Object.extend({
				duration		: 0.3,
				transition		: Effect.Transitions.linear, 
				event			: 'click',
				active			: 'first',
				classHandle		: 'accordion_handle',
				classContent	: 'accordion_content',
				classVisible	: 'expanded',
				classHidden		: 'collapsed',
				effectAppear	: 'blind',
				effectDisappear	: null
			}, options || {});

			this.accordion = $(accordion);
			accordion = Element.identify(this.accordion);
			
			// get handles
			var handles = $$('#'+accordion+' .'+this.options.classHandle);

			// get contents
			var contents = $$('#'+accordion+' .'+this.options.classContent);

			// check if amount of contents is same as handles
			if ((handles.length != contents.length) || handles.length == 0 || contents.length == 0) {
				return false;
			}

			this.items = [];
			for(i=0; i < handles.length; i++) {
				this.items[i] = $H({handle : Element.identify(handles[i]), content : Element.identify(contents[i])});
				//alert(accordion+' '+i+': '+Object.toJSON(this.items[i]));
			}
			
			this.accordion.observe(
				this.options.event, 
				function(event) {
					var el = Element.identify(Event.element(event));
					for(i=0; i < this.items.length; i++) {
						if (this.items[i].get('handle') == el) {
							if (this.options.event == 'click') {
								accordion.onclick = function() {return false;};
								Event.stop(event);
							}
							this.toggle(i);
						}
					}
				}.bind(this)
			);
			// hide all contents first
			for(i=0; i < this.items.length; i++) {
				$(this.items[i].get('handle')).addClassName(this.options.classHidden);
				$(this.items[i].get('content')).hide();
			}
			// show one
			if (this.options.active != null) {
				var _effect = null;
				if (this.options.effectAppear) {
					_effect = this.options.effectAppear;
					this.options.effectAppear = null;
				}
				this.toggle(this.options.active);
				if (_effect) this.options.effectAppear = _effect;

			}
		},

		toggle	: function(toggle) {
			if (toggle == 'first') toggle = 0;
			if (toggle == 'last') toggle = this.items.length-1;

			this.effects = [];

			this.activate = $(this.items[toggle].get('content'));

			if (this.active) {
				if (this.active == this.activate) {
					this.activate = null;				
				}
				this.deactivate = this.active;
				this.hide(this.deactivate);
			}
			
			if (this.activate && this.activate.visible() == false) {
				this.show(this.activate);
			}

			this.active = this.activate;

			if (this.effects.length > 0) {
				new Effect.Parallel(
					this.effects, 
					$H({
						duration: this.options.duration,
						sync: true,
						queue: {
							position: 'end', 
							scope: 'accordionAnimation'
						},
						beforeStart: function() {
							this.animating = true;
						}.bind(this),
						afterFinish: function(effect) {
							//Element.hide(effect.effects[0].this.parentNode);
							if (this.deactivate) {
								//Element.hide(this.deactivate);
								this.deactivate = null;
							}
							this.animating = false;
						}.bind(this)
					})
				);
			}

			for(i=0; i < this.items.length; i++) {
				var _content = $(this.items[i].get('content'));
				var _handle = $(this.items[i].get('handle'));
				if (this.active == _content) {
					_handle.removeClassName(this.options.classHidden);
					_handle.addClassName(this.options.classVisible);
				} else {
					_handle.removeClassName(this.options.classVisible);
					_handle.addClassName(this.options.classHidden);
				} 
			}

		},

		show	: function (content) {
			if (this.animating) return false;

			// switch/case option.effectAppear
			var effect = null;
			if (this.options.duration < 0.01) {
				this.options.effectAppear = null;
			}
			switch(this.options.effectAppear) {
				case 'blind':
				case 'Blind':
				case 'BlindDown':
					effect = new Effect.BlindDown(content, this.options);
					break;    
				case 'appear':
				case 'Appear':
					effect = new Effect.Appear(content, this.options);
					break;
				case 'slide':
				case 'Slide':
				case 'SlideDown':
					effect = new Effect.SlideDown(content, this.options);
					break;    
				default:
					$(content).show();
					break;
			}
			if (effect) {
				this.effects.push(effect);
			}
			return true;
		},
		
		hide : function (content) {
			if (this.animating) return false;

			var effect = null;
			// switch/case option.effect.appear
			if (!this.options.effectDisappear) {
				this.options.effectDisappear = this.options.effectAppear;
			}
			if (this.options.duration < 0.01) {
				this.options.effectDisappear = null;
			}
			switch(this.options.effectDisappear) {
				case 'blind':
				case 'Blind':
				case 'BlindDown':
					effect = new Effect.BlindUp(content, this.options);
					break;    
				case 'appear':
				case 'Appear':
				case 'fade':
				case 'Fade':
					effect = new Effect.Fade(content, this.options);
					break;
				case 'slide':
				case 'Slide':
				case 'SlideDown':
					effect = new Effect.SlideUp(content, this.options);
					break;    
				default:
					$(content).hide();
					break;
			}
			if (effect) {
				this.effects.push(effect);
			}
			return true;
		}
	}
);

i18nFormAccordion = function(element, options) {
    this.element = $(element);
    if (!this.element) throw(Effect._elementDoesNotExistError);

	this.options = Object.extend({
		classAccordion	: 'i18n_accordion',
		classHandle		: 'i18n_accordion_handle',
		classContent	: 'i18n_accordion_content',
		duration		: 0
	}, options || {});

	Element.addClassName(this.element, this.options.classAccordion);
	
	this.element.descendants().each(
		function(descendant) {
			if (descendant.nodeName == "LABEL") {
				Element.addClassName(descendant, this.options.classHandle+' toggle');
			}
			if (descendant.nodeName == "TEXTAREA" || descendant.nodeName == "INPUT" ) {
				Element.addClassName(descendant, this.options.classContent);
			}
		}.bind(this)
	);
	return new Effect.accordion(element, this.options);
}

Effect.divSwap = function(element, container){
    var div = document.getElementById(container);
    var nodeList = div.childNodes;
    var queue = Effect.Queues.get('menuScope');

    if(queue.toArray().length<1){
        if(Element.visible(element)==false){
            for(i=0;i<nodeList.length;i++){
                if(nodeList.item(i).nodeName=="DIV" && nodeList.item(i).id!=element){
                    if(Element.visible(nodeList.item(i))==true){
                        Effect.SlideUp(nodeList.item(i),{queue:{position:'end',scope:'menuScope',limit:2}})
                    }
                }
            }
            Effect.SlideDown(element,{queue:{position:'end',scope:'menuScope',limit:2}})
       }
   }
}

Effect.Transitions.exponential = function(pos) {
  return 1-Math.pow(1-pos,2);
}
