var initFlipwall=function(config) {

	defaults = {
		tileclass: '.smalltile',
		hoverBackgroundColor: '#999999',
		flipspeed: 400,
		timeoutdelay: 500,
		direction: 'bt',
		outelement: 'h4',
		overelement: 'a',
		overclass: 'hover',
		revertdirection: 'tb',
		revertflipspeed: 110,
		startAnimation: {
	        use: true,
	    	tiles: 5,
	        start: 0,
	        timeoutdelay: 280
	    }
	};

	config = jQuery.extend(defaults, config);



	var idnum = 0;
	$('.smalltile').attr('id',function() {
		idnum++;
  		return "tile" + idnum;
	});

	var hover;
	var count = 0;

	$('.largetile').bind("mouseenter",function(){
		revertTileclass();
	});


	$(config.tileclass).bind("mouseenter",function(event, a){

		var elem = $(this);
		var timeoutdelay = config.timeoutdelay;
		if (a === true) {timeoutdelay = config.startAnimation.timeoutdelay;}

			if((elem.data('flipped') != 0) && (elem.data('flipped'))){
					revertAll(elem); // revert all tiles
			}
			else  {
				hover = setTimeout(function(){
					elem.flip({
					speed: config.flipspeed,
					direction: config.direction,
					color: config.bgcolor,
					onEnd: function(){

						elem.children(config.outelement).hide();
						elem.children(config.overelement).show();
						elem.addClass(config.overclass);
						count++;
						if(elem.data('flipped')!= undefined) { //undefined check for mozilla
							revertAll(elem); // revert all tiles
						}
						elem.data('flipped',count);
					}
				});
			}, timeoutdelay);
		}
	});

	$(config.tileclass).bind("mouseleave",function(){
		clearTimeout(hover);
		revertTileclass();
		if(config.revertdirection) {
			if($(this).data('flipped') == 1){
				$(this).flip({
					speed: config.revertflipspeed,
					direction: config.revertdirection,
					color: config.bgcolor
					});
			}
		}
		count = 0;
		$(config.tileclass).data('flipped',count);
	});


	var revertAll=function(elem) {
			if(elem) {
				$(config.tileclass+' '+config.outelement).not(elem.children(config.outelement)).show();
				$(config.tileclass+' '+config.overelement).not(elem.children(config.overelement)).hide();
				$(config.tileclass).not(elem).removeClass(config.overclass);
			}
		};


var playFlipwallAnimation = function(start, tiles) {

	setTimeout(function() {
		start++;
		if (start <= tiles) {
			$('#tile'+start).trigger('mouseenter', [true]);
			playFlipwallAnimation(start, tiles);
			revertAnim(start);
		}
	},100);
};

var revertAnim = function(start) {
	setTimeout(function() {
		$('#tile'+start).flip({
					speed: config.flipspeed,
					direction: config.revertdirection,
					color: config.bgcolor
					});
			revertTileclass();

	},150);
};

var revertTileclass = function() {
	$(config.tileclass+' '+config.outelement).show();
	$(config.tileclass+' '+config.overelement).hide();
	$(config.tileclass).removeClass(config.overclass);
};

	if( config.startAnimation.use != false && config.startAnimation.tiles) {
		playFlipwallAnimation(config.startAnimation.start, config.startAnimation.tiles);
	}
};




