//window.log=function(){log.history=log.history||[];log.history.push(arguments);if(this.console){console.log(Array.prototype.slice.call(arguments))}};

/*global window,document,jQuery */

/*
* Partner Box Lite (only one category)
* @author: Thomas
*/
if(typeof jQuery != 'undefined') {	
	/*
	 * Special event for image load events
	 * Needed because some browsers does not trigger the event on cached images.

	 * MIT License
	 * Paul Irish     | @paul_irish | www.paulirish.com
	 * Andree Hansson | @peolanha   | www.andreehansson.se
	 * 2010.
	 *
	 * Usage:
	 * $(images).bind('load', function (e) {
	 *   // Do stuff on load
	 * });
	 * 
	 * Note that you can bind the 'error' event on data uri images, this will trigger when
	 * data uri images isn't supported.
	 * 
	 * Tested in:
	 * FF 3+
	 * IE 6-8
	 * Chromium 5-6
	 * Opera 9-10
	 */
	(function ($) {
		$.event.special.load = {
			add: function (hollaback) {
				if ( this.nodeType === 1 && this.tagName.toLowerCase() === 'img' && this.src !== '' ) {
					// Image is already complete, fire the hollaback (fixes browser issues were cached
					// images isn't triggering the load event)
					if ( this.complete || this.readyState === 4 ) {
						hollaback.handler.apply(this);
					}

					// Check if data URI images is supported, fire 'error' event if not
					else if ( this.readyState === 'uninitialized' && this.src.indexOf('data:') === 0 ) {
						$(this).trigger('error');
					}
				
					else {
						$(this).bind('load', hollaback.handler);
					}
				}
			}
		};
	}(jQuery));
	
	jQuery(function($) {	
		var settings;
		var holder;
		var currentCount = 1;
		var isActive = false;
		var timer;
		var currentItem = 0;
		var boxWidth ;
		var boxHeight ;
		var totalItems = 0;
		var totalLoaded = 0;
		var partners;
		var filled = false;

		function go(dir) {
			//prevent hammering
			if(isActive) {
				return;
			}
			
			isActive = true;
			dir = typeof(dir) != undefined ? 'next' : dir;
			
			//reset timer
			clearTimeout(timer);
			timer = setTimeout(function(){
				go();
			},settings.timerSpeed);
			
			//hide all
			holder.find('a').hide();
			
			//display
			var currentDisplaySize = 0;
			//			log('current item ' + currentItem);
			for(var i=0;i < totalItems;i++) {
				//fade in elements until reaching full width
				var partner = partners.eq(currentItem);
				var partnerWidth = partner.width() + parseInt(settings.itemSpacing);
	
				if(currentDisplaySize < boxWidth - partnerWidth) {
					partner.fadeIn();
					currentDisplaySize += partnerWidth;
					if(dir == 'next') {
						currentItem++;
					}
					else {
						currentItem--;
						if(currentItem == 0) {
							break;
						}
					}
					if(currentItem > totalItems) {
						currentItem = 0;
						break;
					}
				}
				else {
					break;
				}
			}
			
			//halign holder
			var sizeToFit = boxWidth - currentDisplaySize;
			sizeToFit = sizeToFit / 2;
			holder.css('margin-left',sizeToFit+'px');

			isActive = false;
		}
		
		function fill() {
			filled = true;
			partners = holder.find('a');
			
			//fill in to get infinite slider
			var partner, partnerWidth;
			var lastDisplaySize = 0;
			for(var i=0;i < totalItems;i++) {
				partner = partners.eq(i);
				partnerWidth = partner.width() + parseInt(settings.itemSpacing);
				if(lastDisplaySize < boxWidth - partnerWidth) {
					lastDisplaySize += partnerWidth;
				}
				else {
					lastDisplaySize = 0;
				}
			}
			
			var sizeToFit = boxWidth - lastDisplaySize - partnerWidth - 100;
			for(var j = 0; j < totalItems; j++) {
				partner = partners.eq(j);
				partnerWidth = partner.width() + parseInt(settings.itemSpacing);
				if(partnerWidth < sizeToFit && sizeToFit > 0) {
					sizeToFit -= partnerWidth;
					holder.append(partner.clone());
				}
			}
			
			//refresh count
			partners = holder.find('a');
			totalItems = partners.length;
			
			//valign
			partners.each(function() {
				$(this).css({
					'vertical-align':'middle',
					'display':'inline-block',
					'height':boxHeight + 'px',
					'margin-right':settings.itemSpacing+'px',
					'float':'left'
				});
				var image = $(this).find('img');
				var imageHeight = image.height();
				var margin = (boxHeight - imageHeight)/2;
				if(imageHeight < boxHeight) {
					image.css({
						'margin-top' : margin + 'px'
					})
				}
			})

			go();
		}
		
		function init() {
			//set box width
			boxWidth = $('.' + settings.boxClass + ' .' + settings.holderClass).width();
			boxHeight = settings.itemHeight;
			
			//load data
			$.ajax({
				type: "POST",
				url: settings.datasource,
				dataType: 'json',
				success: function(res){
					//					log(res);
			
					//creating holder
					holder = $('<div class="partners_holder"></div>');
					holder
					.css({
						'height':boxHeight+'px',
						'width':boxWidth+'px',
						'position':'absolute',
						'left':'0px',
						'top':'0px'
					})
					.hide();
					
					$('.' + settings.boxClass + ' .' + settings.holderClass).append(holder);
					totalItems = res.length;
					
					//attaching images
					$.each(res, function(i,v) {
						var img = $('<img />')
							.bind('load', function(e) {
								totalLoaded++;
								if(totalLoaded == totalItems && !filled) {
									holder.show();
									fill();
								}
							})
							.attr('src', v.image);
						var link = $("<a/>")
							.attr('class',settings.elementClass)
							.attr('href',v.link)
							.html(img);
						
						link.hide();
						holder.append(link);
						
						//						holder.append('<a href="'+v.link+'" class="' + settings.elementClass + '"><img src="'+v.image+'" title="'+v.name+'" /></a>');
					});

						
					//attaching events to prev next
					$('.'+settings.prevClass).click(function(e) {
						e.preventDefault();
						go('prev');
					});
					$('.'+settings.nextClass).click(function(e) {
						e.preventDefault();
						go('next');
					});
					//prevent double click selection
					$('.'+settings.nextClass + ','+'.'+settings.prevClass).mousedown(function(){
						return false;
					})
				},
				error: function(event, request, settings){
					log('Error partnerbox ' + request);
				}
			});
		}
		
		$.fn.extend({
			partnerbox: function(options) {
				settings = $.extend({}, $.fn.partnerbox.defaults, options);
				
				return this.each(function () {
					var $$	= $(this),
					o	= $.metadata ? $.extend({}, settings, $$.metadata()) : settings;

					init();
				});
			}
		});
		
		/**
		* Defaults
		*/
		$.fn.partnerbox.defaults = {
			'boxClass': 'partner_box',
			'titleTag':'h1',
			'holderClass':'holder',
			'elementClass':'partner',
			'itemsToDisplay' : 8,
			'datasource':'sample-partners-lite.json',
			'prevClass' : 'prev',
			'nextClass' : 'next',
			'animSpeed' : 1000,
			'timerSpeed' : 5000,
			'itemSpacing' : 10,
			'itemHeight' : 100
		};
		
	}(jQuery));
}
