/*
	Background Stretcher jQuery Plugin
	© 2011 ajaxBlender.com
	For any questions please visit www.ajaxblender.com 
	or email us at support@ajaxblender.com
	
	Version: 2.0
*/

(function ($) {

	/*  Variables  */
	var container = null;
	var allLIs = '', containerStr = '';

	var element = this;
	var _bgStretcherPause = false;
	var _bgStretcherAction = false;
	var _bgStretcherTm = null;
	var random_line = new Array();
	var random_temp = new Array();
	var r_image = 0;
	var swf_mode = false;
	var img_options = new Array();

	$.fn.bgStretcher = function (settings) {

		if ($('.bgstretcher-page').length || $('.bgstretcher-area').length) {
			if (typeof (console) !== 'undefined' && console != null) console.log('More than one bgStretcher');
			return false;
		}
		settings = $.extend({}, $.fn.bgStretcher.defaults, settings);
		$.fn.bgStretcher.settings = settings;

		function _build(body_content) {
			if (!settings.images.length) { return; }

			_genHtml(body_content);

			containerStr = '#' + settings.imageContainer;
			container = $(containerStr);
			allLIs = '#' + settings.imageContainer + ' LI';
			$(allLIs).hide().css({ 'z-index': 1, overflow: 'hidden' });

			if (!container.length) { return; }
			$(window).resize(function () {
				_resize(body_content)
			});

			_resize(body_content);

			var stratElement = 0;
			/*  Rebuild images for simpleSlide  */
			if (settings.transitionEffect == 'simpleSlide') {
				if (settings.sequenceMode == 'random') {
					if (typeof (console) !== 'undefined' && console != null) {
						console.log('Effect \'simpleSlide\' don\'t be to use with mode random.');
						console.log('Mode was automaticly set in normal.');
					}
				}
				$(allLIs).css({ 'float': 'left', position: 'static' });
				$(allLIs).show();
				if ($.fn.bgStretcher.settings.slideDirection == 'NW' || $.fn.bgStretcher.settings.slideDirection == 'NE') {
					$.fn.bgStretcher.settings.slideDirection = 'N';
				}
				if ($.fn.bgStretcher.settings.slideDirection == 'SW' || $.fn.bgStretcher.settings.slideDirection == 'SE') {
					$.fn.bgStretcher.settings.slideDirection = 'S';
				}
				if ($.fn.bgStretcher.settings.slideDirection == 'S' || $.fn.bgStretcher.settings.slideDirection == 'E') {
					settings.sequenceMode = 'back';
					$(allLIs).removeClass('bgs-current');
					$(allLIs).eq($(allLIs).length - $.fn.bgStretcher.settings.startElementIndex - 1).addClass('bgs-current');
					if ($.fn.bgStretcher.settings.slideDirection == 'E') {
						l = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).width() * (-1);
						t = 0;
					} else { // S
						t = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).height() * (-1);
						l = 0;
					}
					$(containerStr + ' UL').css({ left: l + 'px', top: t + 'px' });
				} else {
					settings.sequenceMode = 'normal';
					if ($.fn.bgStretcher.settings.startElementIndex != 0) {
						if ($.fn.bgStretcher.settings.slideDirection == 'N') {
							t = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).height() * (-1);
							l = 0;
						} else { // W
							l = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).width() * (-1);
							t = 0;
							console.log(l);
						}
						$(containerStr + ' UL').css({ left: l + 'px', top: t + 'px' });
					}
				}
			}

			if ($(settings.buttonNext).length || $(settings.buttonPrev).length || $(settings.pagination).length) {
				if (settings.sequenceMode == 'random') {
					if (typeof (console) !== 'undefined' && console != null) {
						console.log('Don\'t use random mode width prev-button, next-button and pagination.');
					}
				} else {
					/*  Prev and Next Buttons init  */
					if ($(settings.buttonPrev).length) {
						$(settings.buttonPrev).addClass('bgStretcherNav bgStretcherNavPrev');
						$(settings.buttonPrev).click(function () {
							$.fn.bgStretcher.buttonSlide('prev');
						});
					}
					if ($(settings.buttonNext).length) {
						$(settings.buttonNext).addClass('bgStretcherNav bgStretcherNavNext');
						$(settings.buttonNext).click(function () {
							$.fn.bgStretcher.buttonSlide('next');
						});
					}
					/*  Pagination  */
					if ($(settings.pagination).length) {
						$.fn.bgStretcher.pagination();
					}
				}
			}

			/*  Random mode init  */
			if (settings.sequenceMode == 'random') {
				var i = Math.floor(Math.random() * $(allLIs).length);
				$.fn.bgStretcher.buildRandom(i);
				if (settings.transitionEffect != 'simpleSlide') {
					$.fn.bgStretcher.settings.startElementIndex = i;
				}
				stratElement = i;
			} else {
				if ($.fn.bgStretcher.settings.startElementIndex > ($(allLIs).length - 1)) $.fn.bgStretcher.settings.startElementIndex = 0;
				stratElement = $.fn.bgStretcher.settings.startElementIndex;
				if (settings.transitionEffect == 'simpleSlide') {
					if ($.fn.bgStretcher.settings.slideDirection == 'S' || $.fn.bgStretcher.settings.slideDirection == 'E') {
						stratElement = $(allLIs).length - 1 - $.fn.bgStretcher.settings.startElementIndex;
					}
				}
			}

			$(allLIs).eq(stratElement).show().addClass('bgs-current');
			$.fn.bgStretcher.loadImg($(allLIs).eq(stratElement));

			/*  Go slideshow  */
			if (settings.slideShow && $(allLIs).length > 1) {
				_bgStretcherTm = setTimeout('$.fn.bgStretcher.slideShow(\'' + $.fn.bgStretcher.settings.sequenceMode + '\', -1)', settings.nextSlideDelay);
			}

		};

		function _resize(body_content) {
			var winW = 0;
			var winH = 0;
			var contH = 0;
			var contW = 0;

			if ($('BODY').hasClass('bgStretcher-container')) {
				winW = $(window).width();
				winH = $(window).height();
				if (($.browser.msie) && (parseInt(jQuery.browser.version) == 6)) {
					$(window).scroll(function () {
						$('#' + settings.imageContainer).css('top', $(window).scrollTop());
					});
				}
			} else {
				$('.bgstretcher').css('position', 'absolute').css('top', '0px');
				winW = body_content.width();
				winH = body_content.height();
			}

			var imgW = 0, imgH = 0;
			var leftSpace = 0;

			//	Max image size
			if (settings.maxWidth != 'auto') {
				if (winW > settings.maxWidth) {
					leftSpace = (winW - settings.maxWidth) / 2;
					contW = settings.maxWidth;
				} else contW = winW;
			} else contW = winW;
			if (settings.maxHeight != 'auto') {
				if (winH > settings.maxHeight) {
					contH = settings.maxHeight;
				} else contH = winH;
			} else contH = winH;

			//	Update container's size
			container.width(contW);
			container.height(contH);

			//	Non-proportional resize
			if (!settings.resizeProportionally) {
				imgW = contH;
				imgH = contH;
			} else {
				var initW = settings.imageWidth, initH = settings.imageHeight;
				var ratio = initH / initW;

				imgW = contW;
				imgH = Math.round(contW * ratio);

				if (imgH < contH) {
					imgH = contH;
					imgW = Math.round(imgH / ratio);
				}
			}

			// Anchoring
			var mar_left = 0;
			var mar_top = 0;
			var anchor_arr;
			if ($.fn.bgStretcher.settings.anchoring != 'left top') {
				anchor_arr = ($.fn.bgStretcher.settings.anchoring).split(' ');
				if (anchor_arr[0] == 'right') {
					mar_left = (winW - contW);
				} else {
					if (anchor_arr[0] == 'center') mar_left = Math.round((winW - contW) / 2);
				}
				if (anchor_arr[1] == 'bottom') {
					mar_top = (winH - contH);
				} else {
					if (anchor_arr[1] == 'center') {
						mar_top = Math.round((winH - contH) / 2);
					}
				}
				container.css('marginLeft', mar_left + 'px').css('marginTop', mar_top + 'px');
			}
			mar_left = 0;
			mar_top = 0;
			if ($.fn.bgStretcher.settings.anchoringImg != 'left top') {
				anchor_arr = ($.fn.bgStretcher.settings.anchoringImg).split(' ');
				if (anchor_arr[0] == 'right') {
					mar_left = (contW - imgW);
				} else {
					if (anchor_arr[0] == 'center') mar_left = Math.round((contW - imgW) / 2);
				}
				if (anchor_arr[1] == 'bottom') {
					mar_top = (contH - imgH);
				} else {
					if (anchor_arr[1] == 'center') {
						mar_top = Math.round((contH - imgH) / 2);
					}
				}
			}
			img_options['mar_left'] = mar_left;
			img_options['mar_top'] = mar_top;

			//	Apply new size for images
			if (container.find('LI:first').hasClass('swf-mode')) {

				var path_swf = container.find('LI:first').html();
				container.find('LI:first').html('<div id="bgstretcher-flash">&nbsp;</div>');

				var header = new SWFObject('flash/stars.swf', 'flash-obj', contW, contH, '9');
				header.addParam('wmode', 'transparent');
				header.write('bgstretcher-flash');

			};
			img_options['imgW'] = imgW;
			img_options['imgH'] = imgH;

			if (!settings.resizeAnimate) {
				container.children('UL').children('LI.img-loaded').find('IMG').css({ 'marginLeft': img_options["mar_left"] + 'px', 'marginTop': img_options["mar_top"] + 'px' });
				container.children('UL').children('LI.img-loaded').find('IMG').css({ 'width': img_options["imgW"] + 'px', 'height': img_options["imgH"] + 'px' });
			} else {
				container.children('UL').children('LI.img-loaded').find('IMG').animate({ 'marginLeft': img_options["mar_left"] + 'px', 'marginTop': img_options["mar_top"] + 'px' }, 'normal');
				container.children('UL').children('LI.img-loaded').find('IMG').animate({ 'width': img_options["imgW"] + 'px', 'height': img_options["imgH"] + 'px' }, 'normal');
			}

			$(allLIs).width(container.width()).height(container.height());

			if ($.fn.bgStretcher.settings.transitionEffect == 'simpleSlide') {
				if ($.fn.bgStretcher.settings.slideDirection == 'W' || $.fn.bgStretcher.settings.slideDirection == 'E') {
					container.children('UL').width(container.width() * $(allLIs).length).height(container.height());
					if ($(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) != -1) {
						l = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * container.width() * (-1);
						container.children('UL').css({ left: l + 'px' });
					}
				} else {
					container.children('UL').height(container.height() * $(allLIs).length).width(container.width());
					if ($(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) != -1) {
						t = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).height() * (-1);
						container.children('UL').css({ top: t + 'px' });
					}
				}
			}

		};

		function _genHtml(body_content) {
			var code = '';
			var cur_bgstretcher;

			body_content.each(function () {
				$(this).wrapInner('<div class="bgstretcher-page" />').wrapInner('<div class="bgstretcher-area" />');
				code = '<div id="' + settings.imageContainer + '" class="bgstretcher"><ul>';
				// if swf
				if (settings.images.length) {
					var ext = settings.images[0].split('.');
					ext = ext[ext.length - 1];

					if (ext != 'swf') {
						var ind = 0;
						for (i = 0; i < settings.images.length; i++) {
							if (settings.transitionEffect == 'simpleSlide' && settings.sequenceMode == 'back')
								ind = settings.images.length - 1 - i;
							else ind = i;
							if ($.fn.bgStretcher.settings.preloadImg) {
								code += '<li><span class="image-path">' + settings.images[ind] + '</span></li>';
							} else {
								code += '<li class="img-loaded"><img src="' + settings.images[ind] + '" alt="" /></li>';
							}
						}
					} else {
						code += '<li class="swf-mode">' + settings.images[0] + '</li>';
					}
				}

				code += '</ul></div>';
				cur_bgstretcher = $(this).children('.bgstretcher-area');
				$(code).prependTo(cur_bgstretcher);
				cur_bgstretcher.css({ position: 'relative' });
				cur_bgstretcher.children('.bgstretcher-page').css({ 'position': 'relative', 'z-index': 3 });
			});

		};

		/*  Start bgStretcher  */
		this.addClass('bgStretcher-container');
		_build(this);
	};

	$.fn.bgStretcher.loadImg = function (obj) {
		if (obj.hasClass('img-loaded')) return true;
		obj.find('SPAN.image-path').each(function () {
			var imgsrc = $(this).html();
			var imgalt = '';
			var parent = $(this).parent();
			var img = new Image();

			$(img).load(function () {
				$(this).hide();
				parent.prepend(this);
				$(this).fadeIn('100');
			}).error(function () {
			}).attr('src', imgsrc).attr('alt', imgalt);

			$(img).css({ 'marginLeft': img_options["mar_left"] + 'px', 'marginTop': img_options["mar_top"] + 'px' });
			$(img).css({ 'width': img_options["imgW"] + 'px', 'height': img_options["imgH"] + 'px' });
		});
		obj.addClass('img-loaded');
		return true;
	}

	$.fn.bgStretcher.play = function () {
		_bgStretcherPause = false;
		$.fn.bgStretcher._clearTimeout();
		$.fn.bgStretcher.slideShow($.fn.bgStretcher.settings.sequenceMode, -1);

	};

	$.fn.bgStretcher._clearTimeout = function () {
		if (_bgStretcherTm != null) {
			clearTimeout(_bgStretcherTm);
			_bgStretcherTm = null;
		}
	}

	$.fn.bgStretcher.pause = function () {
		_bgStretcherPause = true;
		$.fn.bgStretcher._clearTimeout();
	};

	$.fn.bgStretcher.sliderDestroy = function () {
		var cont = $('.bgstretcher-page').html();
		$('.bgStretcher-container').html('').html(cont).removeClass('bgStretcher-container');
		$.fn.bgStretcher._clearTimeout();
		_bgStretcherPause = false;
	}

	/*  Slideshow  */
	$.fn.bgStretcher.slideShow = function (sequence_mode, index_next) {
		_bgStretcherAction = true;
		if ($(allLIs).length < 2) return true;
		var current = $(containerStr + ' LI.bgs-current');
		var next;

		if (index_next == -1) {
			switch (sequence_mode) {
				case 'back':
					next = current.prev();
					if (!next.length) { next = $(containerStr + ' LI:last'); }
					break;
				case 'random':
					if (r_image == $(containerStr + ' LI').length) {
						$.fn.bgStretcher.buildRandom(random_line[$(containerStr + ' LI').length - 1]);
						r_image = 0;
					}
					next = $(containerStr + ' LI').eq(random_line[r_image]);
					r_image++;
					break;
				default:
					next = current.next();
					if (!next.length) { next = $(containerStr + ' LI:first'); }
			}
		} else {
			next = $(containerStr + ' LI').eq(index_next);
		}

		$(containerStr + ' LI').removeClass('bgs-current');
		$.fn.bgStretcher.loadImg(next);
		next.addClass('bgs-current');

		switch ($.fn.bgStretcher.settings.transitionEffect) {
			case 'fade':
				$.fn.bgStretcher.effectFade(current, next);
				break;
			case 'simpleSlide':
				$.fn.bgStretcher.simpleSlide();
				break;
			case 'superSlide':
				$.fn.bgStretcher.superSlide(current, next, sequence_mode);
				break;
			default:
				$.fn.bgStretcher.effectNone(current, next);

		}
		if ($($.fn.bgStretcher.settings.pagination).find('LI').length) {
			$($.fn.bgStretcher.settings.pagination).find('LI.showPage').removeClass('showPage');
			$($.fn.bgStretcher.settings.pagination).find('LI').eq($(containerStr + ' LI').index($(containerStr + ' LI.bgs-current'))).addClass('showPage');
		}

		// callback
		if ($.fn.bgStretcher.settings.callbackfunction) {
			if (typeof $.fn.bgStretcher.settings.callbackfunction == 'function')
				$.fn.bgStretcher.settings.callbackfunction.call();
		}

		if (!_bgStretcherPause) {
			_bgStretcherTm = setTimeout('$.fn.bgStretcher.slideShow(\'' + $.fn.bgStretcher.settings.sequenceMode + '\', -1)', $.fn.bgStretcher.settings.nextSlideDelay);
		}
	};

	/*  Others effects  */
	$.fn.bgStretcher.effectNone = function (current, next) {
		next.show();
		current.hide();
		_bgStretcherAction = false;
	};
	$.fn.bgStretcher.effectFade = function (current, next) {
		next.fadeIn($.fn.bgStretcher.settings.slideShowSpeed);
		current.fadeOut($.fn.bgStretcher.settings.slideShowSpeed, function () {
			_bgStretcherAction = false;
		});
	};

	$.fn.bgStretcher.simpleSlide = function () {
		var t, l;
		switch ($.fn.bgStretcher.settings.slideDirection) {
			case 'N':
			case 'S':
				t = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).height() * (-1);
				l = 0;
				break;
			default:
				l = $(containerStr + ' LI').index($(containerStr + ' LI.bgs-current')) * $(containerStr).width() * (-1);
				t = 0;
		}
		$(containerStr + ' UL').animate({ left: l + 'px', top: t + 'px' }, $.fn.bgStretcher.settings.slideShowSpeed, function () {
			_bgStretcherAction = false;
		});

	};

	$.fn.bgStretcher.superSlide = function (current, next, sequence_mode) {
		var t, l;
		switch ($.fn.bgStretcher.settings.slideDirection) {
			case 'S':
				t = $(containerStr).height();
				l = 0;
				break;
			case 'E':
				t = 0;
				l = $(containerStr).width();
				break;
			case 'W':
				t = 0;
				l = $(containerStr).width() * (-1);
				break;
			case 'NW':
				t = $(containerStr).height() * (-1);
				l = $(containerStr).width() * (-1);
				break;
			case 'NE':
				t = $(containerStr).height() * (-1);
				l = $(containerStr).width();
				break;
			case 'SW':
				t = $(containerStr).height();
				l = $(containerStr).width() * (-1);
				break;
			case 'SE':
				t = $(containerStr).height();
				l = $(containerStr).width();
				break;
			default:
				t = $(containerStr).height() * (-1);
				l = 0;

		}

		if (sequence_mode == 'back') {
			next.css({ 'z-index': 2, top: t + 'px', left: l + 'px' });
			next.show();
			next.animate({ left: '0px', top: '0px' }, $.fn.bgStretcher.settings.slideShowSpeed, function () {
				current.hide();
				$(this).css({ 'z-index': 1 });
				_bgStretcherAction = false;
			});
		} else {
			current.css('z-index', 2);
			next.show();
			current.animate({ left: l + 'px', top: t + 'px' }, $.fn.bgStretcher.settings.slideShowSpeed, function () {
				$(this).hide().css({ 'z-index': 1, top: '0px', left: '0px' });
				_bgStretcherAction = false;
			});
		}
	};

	/*  Build line random images  */
	$.fn.bgStretcher.buildRandom = function (el_not) {
		var l = $(allLIs).length;
		var i, j, rt;
		for (i = 0; i < l; i++) {
			random_line[i] = i;
			random_temp[i] = Math.random() * l;
		}
		for (i = 0; i < l; i++) {
			for (j = 0; j < (l - i - 1); j++) {
				if (random_temp[j] > random_temp[j + 1]) {
					rt = random_temp[j];
					random_temp[j] = random_temp[j + 1];
					random_temp[j + 1] = rt;
					rt = random_line[j];
					random_line[j] = random_line[j + 1];
					random_line[j + 1] = rt;
				}
			}
		}

		if (random_line[0] == el_not) {
			rt = random_line[0];
			random_line[0] = random_line[l - 1];
			random_line[l - 1] = rt;
		}
	};

	/*  Prev and Next buttons */
	$.fn.bgStretcher.buttonSlide = function (button_point) {
		if (_bgStretcherAction || ($(allLIs).length < 2)) return false;
		var mode = '';
		if (button_point == 'prev') {
			mode = 'back';
			if ($.fn.bgStretcher.settings.sequenceMode == 'back') mode = 'normal';
		} else {
			mode = $.fn.bgStretcher.settings.sequenceMode;
		}
		$(allLIs).stop(true, true);
		$.fn.bgStretcher._clearTimeout();
		$.fn.bgStretcher.slideShow(mode, -1);
		return false;
	};

	/*  Pagination  */
	$.fn.bgStretcher.pagination = function () {
		var l = $(allLIs).length;
		var output = ''; var i = 0;
		if (l > 0) {
			output += '<ul>';
			for (i = 0; i < l; i++) {
				output += '<li><a href="javascript:;">' + (i + 1) + '</a></li>';
			}
			output += '</ul>';
			$($.fn.bgStretcher.settings.pagination).html(output);
			$($.fn.bgStretcher.settings.pagination).find('LI:first').addClass('showPage');

			$($.fn.bgStretcher.settings.pagination).find('A').click(function () {
				if ($(this).parent().hasClass('showPage')) return false;
				$(allLIs).stop(true, true);
				$.fn.bgStretcher._clearTimeout();
				$.fn.bgStretcher.slideShow($.fn.bgStretcher.settings.sequenceMode, $($.fn.bgStretcher.settings.pagination).find('A').index($(this)));
				return false;
			});

		}
		return false;
	}

	/*  Default Settings  */
	$.fn.bgStretcher.defaults = {
		imageContainer: 'bgstretcher',
		resizeProportionally: true,
		resizeAnimate: false,
		images: [],
		imageWidth: 1024,
		imageHeight: 768,
		maxWidth: 'auto',
		maxHeight: 'auto',
		nextSlideDelay: 3000,
		slideShowSpeed: 'normal',
		slideShow: true,
		transitionEffect: 'fade', // none, fade, simpleSlide, superSlide
		slideDirection: 'N', // N, S, W, E, (if superSlide - NW, NE, SW, SE)
		sequenceMode: 'normal', // back, random
		buttonPrev: '',
		buttonNext: '',
		pagination: '',
		anchoring: 'left top', // right bottom center
		anchoringImg: 'left top', // right bottom center
		preloadImg: false,
		startElementIndex: 0,
		callbackfunction: null
	};
	$.fn.bgStretcher.settings = {};
})(jQuery);
