// jQuery Functions
(function($) {
	jQuery.fn.kBanner = function(options) {
		var defaults = {
			width: 400,
			height: 180,
			delay: 5000,
			transition: 'fade',
			navPosition: 'bottom', // top or bottom
			txtPosition: 'inside', // inside or outside
			start: 'random', // 0 or random
			loop: false,
			callback: function() {}
		};
		var options = $.extend(defaults, options);
		var img_style = 'display: none; position: absolute; width: 100%; height: '+options.height+'px; background-color: transparent; background-repeat: no-repeat;';
		var txt_style = 'display: block; position: absolute; left: 0px; bottom: 0px; width: 100%;';
		var navi_style = 'background-repeat: no-repeat; background-position: 50% 50%;';
		return $(this).each(function() {
			$(this).wrapAll('<div class="kBannerHolder"></div>');
			function swapIt(i, container) {
				if(i == '+1') {
					i = container.parent().children('.kBannerNav').find('a.selected').attr('rel');
					i++;
					if(i == count) i = 0;
				} else if(i == '-1') {
					i = container.parent().children('.kBannerNav').find('a.selected').attr('rel');
					i--;
					if(i == '-1') i = (count-1);
				}
				container.parent().children('.kBannerNav').find('a[rel='+i+']').addClass('selected').siblings().removeClass('selected');
				if(options.txtPosition == 'outside') {
					container.append('<div class="img" style="'+img_style+'background-image:url('+items[i].path+')"></div>');
					container.parent().children('.kBannerTxt').text(items[i].title);
				} else {
					var style = (items[i].style) ? items[i].style : '';
					container.append('<div class="img" style="'+img_style+'background-image:url('+items[i].path+')"><span class="txtHolder" style="'+txt_style+style+'"><span class="txt">'+items[i].title+'</span></span></div>');
				}

				// transition method
				if(options.transition == 'fade' && !$.browser.msie)
				{
					container.find('div:last').fadeIn();
					container.find('div:first').fadeOut(function() { $(this).remove(); });
				}
				else
				{
					container.find('div:last').show();
					container.find('div:first').remove();
				}

				// check if url exist
				if(items[i].url) {
					container.find('div:last').attr({title: items[i].url}).css({cursor: 'pointer'}).bind('click', function() {
						document.location = items[i].url;
					})
				}
			}
			// add links container below/above the banner
			if(options.navPosition == 'top') {
				$(this).before('<div class=kBannerNav></div>');
			} else {
				$(this).after('<div class=kBannerNav></div>');
			}

			var count = $(this).find('img').length;
			var items = new Object();

			for (i=0; i<=count-1; i++) {
				items[i] = new Object();
				// title
				items[i].title = $(this).find('img').eq(i).attr('title');
				// url
				if($(this).find('img').eq(i).parent('a'))
				{
					items[i].url = $(this).find('img').eq(i).parent('a').attr('href');
				}
				// path
				items[i].path = $(this).find('img').eq(i).attr('src');
				$(this).parent().children('.kBannerNav').append('<a href="javascript:;" rel='+i+'>'+(i+1)+'</a>');
				// style
				if($(this).find('img').eq(i).attr('style'))
				{
					items[i].style = $(this).find('img').eq(i).attr('style');
				}
			}

			// add first image container
			if(options.txtPosition == 'outside') {
				$(this).append('<div title="'+items[0].title+'" class="img" style="'+img_style+'background-image:url('+items[0].path+')"></div>').children().show();
				$(this).parent().children('.kBanner').after('<div class="kBannerTxt">'+items[0].title+'</div>');
			} else {
				var style = (items[0].style) ? items[0].style : '';
				$(this).append('<div title="'+items[0].title+'" class="img" style="'+img_style+'background-image:url('+items[0].path+')"><span class="txt" style="'+txt_style+style+'">'+items[0].title+'</span></div>').children().show();
			}
			if(items[0].url) {
				$(this).find('div:last').attr({title: items[0].url}).css({cursor: 'pointer'}).bind('click', function() {
					document.location = items[0].url;
				})
			}

			// set start position
			$(this).parent().children('.kBannerNav').find('a:first').addClass('selected');
			// add arrows
			$(this).parent().children('.kBannerNav').prepend('<a href="javascript:;" rel="-1" class="leftArrow" style="'+navi_style+'">&nbsp;</a>').append('<a href="javascript:;" rel="+1" class="rightArrow" style="'+navi_style+'">&nbsp;</a>')
			// remove all img's
			$(this).find('img').remove();
			$(this).css({position: 'relative', width: options.width + 'px', height: options.height + 'px', background: 'url(images/loading.gif) no-repeat 50% 50%'}).show();
			// add listener to each link
			$(this).parent().children('.kBannerNav').find('a').bind('click', function() {
				// bind only when animation stop
				if(!$(this).parent().prev().children().is(':animated'))
				{
					swapIt($(this).attr('rel'), $(this).parent().parent().children('div:not(.kBannerNav)'));
					clearTimeout(t);
				}
			})
			// auto-swap function
			function autoSwap(start, i, container) {
				if(start == count) {
					start = 0;
				}
				if(i == count && options.loop == false) {
					clearTimeout(t);
					swapIt(start, container);
				} else {
					swapIt(start, container);
					i++;
					start++;
					t = setTimeout(function() { autoSwap(start, i, container); }, options.delay);
				}
			}
			// checking whether start position is number or not
			if(isNaN(options.start)) {
				var start = Math.floor(Math.random()*count);
			} else {
				var start = options.start-1;
			}
			autoSwap(start, 0, $(this));

			// callback
			options.callback(this);
		});
	};
})(jQuery);
