/*
 * image fader
 *
 */
(function ($) {
	$.extend($, {
		faderController: {
			faderList: new Array(),
			setNextIndex: null,
			createFader: function(elementId, interval) {
				if(!$.faderController.getFader(elementId)) {
					$.faderController.faderList.push({
						'elementId': elementId,
						'index': 0,
						'list': $('#'+elementId+' img').get().reverse(),
						'interval': interval,
						'timerReference': null,
						'setNextIndex': null,
						'fading': false,
						'immediateFade': false
					});
				}

				imgs = $('#'+elementId+' img')
				imgs.css('visibility', 'hidden');

				$(imgs.get(imgs.length - 1)).css('visibility', 'visible');
			},
			getFader: function(elementId) {
				for(var x = 0; x < $.faderController.faderList.length; ++x) {
					if($.faderController.faderList[x].elementId == elementId) {
						return $.faderController.faderList[x];
					}
				}

				return false;
			},
			beginFader: function(elementId) {
				var faderRef = $.faderController.getFader(elementId);
				if(faderRef && faderRef.timerReference == null) {
					faderRef.timerReference = window.setTimeout(function(){$.faderController.fade(elementId)}, faderRef.interval);
				}
			},
			stopFader: function(elementId) {
				var faderRef = $.faderController.getFader(elementId);
				if(faderRef && faderRef.timerReference != null) {
					window.clearTimeout(faderRef.timerReference);
					faderRef.timerReference = null;
				}
			},
			cycleFader: function(elementId) {
				var faderRef = $.faderController.getFader(elementId);
				if(faderRef) {
					faderRef.timerReference = window.setTimeout(function(){$.faderController.fade(elementId)}, faderRef.interval);
				}
			},
			skipToIndex: function(elementId, toIndex) {
				var faderRef = $.faderController.getFader(elementId);
				if(faderRef) {
					if(toIndex > (faderRef.list.length - 1))toIndex = (faderRef.list.length - 1);
					faderRef.setNextIndex = toIndex;
					if(faderRef.timerReference == null) {
						$.faderController.fade(elementId);
					} else {
						if(faderRef.fading == false) {
							$.faderController.stopFader(elementId);
							$.faderController.fade(elementId);
						} else {
							faderRef.immediateFade = true;
						}
					}
				}
			},
			fade: function(elementId) {
				var faderRef = $.faderController.getFader(elementId);

				if(faderRef) {
					$(faderRef.list[faderRef.index]).css({'opacity': 1, 'z-index': '10', 'visibility': 'visible'});
					$(faderRef.list).each(function(i){
						if(i != faderRef.index) {
							$(faderRef.list[i]).css({'opacity': 0, 'z-index': '5', 'visibility': 'visible'});
						}
					});

					if(faderRef.setNextIndex != null) {
						if(faderRef.setNextIndex > (faderRef.list.length - 1))faderRef.setNextIndex = (faderRef.list.length - 1);
						faderRef.index = faderRef.setNextIndex;
						faderRef.setNextIndex = null;
					} else {
						++faderRef.index;
					}

					if(!(faderRef.index < faderRef.list.length)) {
						faderRef.index = 0;
					}

					$(faderRef.list[faderRef.index]).css({'z-index': '10', 'visibility': 'visible'});
					$(faderRef.list).each(function(i){
						if(i != faderRef.index) {
							$(faderRef.list[i]).css({'z-index': '5', 'visibility': 'visible'});
						}
					});

					faderRef.fading = true;
					$(faderRef.list[faderRef.index]).animate({'opacity': 1}, 1500, 'swing', function(){
						$.faderController.endFade(elementId);
					});

					$.faderController.cycleFader(elementId);
				}
			},
			endFade: function(elementId) {
				var faderRef = $.faderController.getFader(elementId);
				if(faderRef) {
					faderRef.fading = false;

					if(faderRef.immediateFade == true) {
						faderRef.immediateFade = false;
						$.faderController.stopFader(elementId);
						$.faderController.fade(elementId);
					}
				}
			}

		}
	});

	$.extend($.fn, {
		createFader: function (interval) {
			this.each(function (i) {
				var eid = $(this).attr('id');
				if(eid) {
					$.faderController.createFader(eid, interval);
					$.faderController.beginFader(eid);
				}
			});
		}
	});
})(jQuery);
