function Flash(flash) {
	
	this.flash = flash;

	this.EFFECT_DEFAULT = "default";
	this.EFFECT_FADE = "fade";
	this.EFFECT_SLIDE = "slide";

	this.imgs = new Array();
	this.texts = new Array();
	this.buttons = new Array();
	this.index = 0;
	this.itv = new Object();

	this.interval = 5000;
	this.effect = this.EFFECT_DEFAULT;

	
	var _this = this;

	this.start = function() {
		_this.itv = window.setInterval(_this.showNext,_this.interval);
	};

	this.stop = function() {
		window.clearInterval(_this.itv);
	}; 

	this.addImg = function(img) {
		_this.imgs[_this.imgs.length] = img;
	};

	this.addText = function(text) {
		_this.texts[_this.texts.length] = text;
	};

	this.addButton = function(button) {
		_this.buttons[_this.buttons.length] = button;
	};

	this.show = function(i) {
		$(_this.buttons[_this.index]).removeClass("selected");
		$(_this.texts[_this.index]).hide();
		$(_this.buttons[i]).addClass("selected");
		$(_this.texts[i]).show();
		_this.showEffect($(_this.imgs[_this.index]), $(_this.imgs[i]));
		if (_this.index != i && i < _this.imgs.length) {
			_this.index = i;
		}
	};

	this.showEffect = function(toHide, toShow) {
		switch(_this.effect) {
			case _this.EFFECT_DEFAULT:
				toHide.hide();
				toShow.show();
				break;
			case _this.EFFECT_FADE:
				toHide.css({"z-index":"9"});
				toShow.css({"opacity":"0","z-index":"10","display":"block"});
				toShow.animate({opacity:"1"},{duration:300,complete:function(){toHide.hide();}});
				break;
			case _this.EFFECT_SLIDE:
				toHide.css({"z-index":"9"});
				toShow.css({"left":flash.width()+"px","display":"block","z-index":"10"});
				toShow.animate({left:0},{duration:300,complete:function(){toHide.hide();}});
				break;
			default:
				toHide.hide();
				toShow.show();
		}
	};

	this.showNext = function() {
		var i = _this.index + 1;
		if (i >= _this.imgs.length) {
			i = 0;
		}
		_this.show(i);
	};


	this.switchTo = function(e) {
		_this.stop();
		_this.show(e.data.index);
	};

	this.init = function() {
		// setting the width & height of images to fit the flash width & height.
		flash.find(".flashimg li img").each(function(j,e){
			$(e).width(flash.width());
			$(e).height(flash.height());
		});

		// load interval from flash attribute, default 5 seconds if not found.
		var interval = flash.attr("interval");
		if (interval) {
			_this.interval = interval;
		}

		// load the effect of the flash, no effect default.
		var effect = flash.attr("effect");
		if (effect) {
			_this.effect = effect;
		}

		// add the elements to 
		flash.find(".flashimg li").each(function(i,img){
			_this.addImg(img);
		});
		flash.find(".flashtext li").each(function(i,text){
			_this.addText(text);
		});
		flash.find(".flashbutton li").each(function(i,button){
			_this.addButton(button);
		});

		// set the behavior to images and buttons.
		for (var i=0; i<_this.imgs.length; i++) {
			$(_this.imgs[i]).bind("mouseover",{index:i},_this.stop);
			$(_this.imgs[i]).bind("mouseout",_this.start);
		}
		for (var i=0; i<_this.buttons.length; i++) {
			$(_this.buttons[i]).bind("mouseover",{index:i},_this.switchTo);
			$(_this.buttons[i]).bind("mouseout",_this.start);
		}

		switch(effect) {
			case _this.EFFECT_FADE:
				flash.find(".flashimg li").css("position","absolute");
				break;
			case _this.EFFECT_SLIDE:
				flash.find(".flashimg").width(flash.width() * 2);
				flash.find(".flashimg li").css("position","absolute");
				break;
		}

		// start
		_this.start();
	};
}

$(document).ready(function(){
	$(".flash").each(function(i,o){
		new Flash($(o)).init();
	});
});
