

/**************************************************************

	Script		: Swiff
	Version		: 1.0
	Authors		: Samuel Birch
	Desc		: Adds version checking to the Swiff class

**************************************************************/

Swiff = new Class({

	Extends: Swiff,

	options: {
		version: 8
	},

	initialize: function(path, options){
		this.setOptions(options);
		if (Browser.Plugins.Flash.version >= this.options.version) {
			$(this.options.container).getChildren().destroy();
			this.parent(path, options);
		}else{
			return false;
		}
	}

});

Swiff.CallBacks = {};

Swiff.remote = function(obj, fn){
	var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
	return eval(rs);
};

/*************************************************************/


/*
Script: Fx.Elements.js
	Effect to change any number of CSS properties of any number of Elements.

License:
	MIT-style license.
*/

Fx.Elements = new Class({

	Extends: Fx.CSS,

	initialize: function(elements, options){
		this.elements = this.subject = $$(elements);
		this.parent(options);
	},

	compute: function(from, to, delta){
		var now = {};
		for (var i in from){
			var iFrom = from[i], iTo = to[i], iNow = now[i] = {};
			for (var p in iFrom) iNow[p] = this.parent(iFrom[p], iTo[p], delta);
		}
		return now;
	},

	set: function(now){
		for (var i in now){
			var iNow = now[i];
			for (var p in iNow) this.render(this.elements[i], p, iNow[p], this.options.unit);
		}
		return this;
	},

	start: function(obj){
		if (!this.check(arguments.callee, obj)) return this;
		var from = {}, to = {};
		for (var i in obj){
			var iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {};
			for (var p in iProps){
				var parsed = this.prepare(this.elements[i], p, iProps[p]);
				iFrom[p] = parsed.from;
				iTo[p] = parsed.to;
			}
		}
		return this.parent(from, to);
	}

});


/*************************************************************
	Class:		imageMenu
	Version:	3.0
	Author:		Samuel Birch
*************************************************************/
var imageMenu = new Class({
	
	Implements: [Options,Events],
	
	getOptions: function(){
		return {
			openWidth: null,
			transition: 'quad:out',
			duration: 400,
			open: null,
			tag: 'li',
			spacer: 'margin-left'
			//onOpen: $empty,
			//onClose: $empty,
			//onClick: $empty
		};
	},
	
	initialize: function(container, options){
		if(options){
			if(options.onClick){
				this.stopDefaultClick = true;
			}
		}
		this.setOptions(this.getOptions(), options);
		this.elements = $$(container+' '+this.options.tag);
		this.container = $$(container)[0];
		this.defaultWidths = [];
		this.resetWidths = [];
		this.firstTime = true;
		
		this.fx = new Fx.Elements(this.elements, {wait: false, duration: this.options.duration, transition: this.options.transition});
		
		this.elements.each(function(el, i){
			this.defaultWidths.push(el.getSize().x);
			this.resetWidths.push(el.getSize().x);
			el.addEvents({
				'mouseenter': function(e){
					this.open(el, i);
					this.fireEvent('onOpen', [el, i]);
					
				}.bind(this),
				'mouseleave': function(e){
					this.close(el, i);
					this.fireEvent('onClose', [el, i]);
					
				}.bind(this),
				'click': function(e){
					e = new Event(e);
					if(this.stopDefaultClick){
						e.stop();
						var type = '';
						el.toggleClass('open');
						
						if(el.hasClass('open')){
							type = 'open';
							var obj = this.getWidths(el, i);
							this.elements.each(function(item, j){
								this.defaultWidths[j] = obj[j].width;
								item.removeClass('open');
							}, this);
							el.addClass('open');
						}else{
							type = 'close';
							this.elements.each(function(item, j){
								this.defaultWidths[j] = this.resetWidths[j];
							}, this);
						}
					}
					this.fireEvent('onClick', [el, i, type]);
				}.bind(this)
			});
		}, this);
		
		var type = $type(this.options.open);
		if(type){
			this.elements.each(function(el,i){
				if(type == 'string'){
					if(this.options.open == el.get('id')){
						this.open(el, i);
						this.fireEvent('onOpen', [el, i]);
						this.fireEvent('onClick', [el, i, 'open']);
					}
				}
				if(type == 'number'){
					if(this.options.open == i){
						this.open(el, i);
						this.fireEvent('onOpen', [el, i]);
						this.fireEvent('onClick', [el, i, 'open']);
					}
				}
			}, this);
		}
	},
	
	getWidths: function(el, id){
		var width = this.options.openWidth || el.getFirst().getSize().x;
		var cont = this.container.getSize();
		var others = (cont.x-width)/(this.elements.length-1);
		
		if(this.elements.length > 0){
			others -= this.elements[1].getStyle(this.options.spacer).toInt();
		}
		
		var obj = {};
		
		if(this.firstTime){
			this.firstTime = false;
			for(var i=0; i<this.elements.length; i++){
				if(i == id){
					obj[i] = {'width': [this.defaultWidths[i], width]};
				}else if(i == this.elements.length-1){
					obj[i] = {'width': [this.defaultWidths[i], others+5]};
				}else{
					obj[i] = {'width': [this.defaultWidths[i], others]};
				}
			}	
		}else{
			for(var i=0; i<this.elements.length; i++){
				if(i == id){
					obj[i] = {'width': width};
				}else if(i == this.elements.length-1){
					obj[i] = {'width': others+5};
				}else{
					obj[i] = {'width': others};
				}
			}	
		}
		
		return obj;
	},
	
	open: function(el, id){
		
		this.fx.start(this.getWidths(el, id));
	},
	
	close: function(el, i){
		var obj = {};
		for(var i=0; i<this.elements.length; i++){
			obj[i] = {'width': this.defaultWidths[i]};
		}
		
		this.fx.start(obj);
	}
});