/**
 * Namespace "StuffBrowser"
 * @class Card
 * @author jorn@info.nl
 * 
 * @desc Functions that parse JSON data to HTML and insert them into "cards".
 *       These cards can be browsed/paginated through. This is handled by the Paginate class.
 * 
 * - Base.paths.product_image must have been set
 * - 
 */
StuffBrowser.Card = function($){
	var products = {};
	var img_base_src = '';
	
	// ================== PARSER FUNCTIONS ==================
	
	/**
	 * Get KWICK VIEW content
	 * @param {Object} first_item_id
	 */
	function getKwicksViewContent(first_item_id)
	{
		var v = StuffBrowser.View.getViewData(0);
		var item = v.item_html;
		var html = v.item_container.clone();
		
		// make item shorcuts
		var image_link = item.find('.image a');
		var image = image_link.children('img');
		var data = item.children().children('.data');
		
		var max = getMaxProductsForView(first_item_id, v.max_items);
		for( var i = first_item_id; i < max; i++ ){
			var p = products[i];
			var d = p.product.creationDate;
			
			item.attr('id', i);
			image_link.attr('href', Base.paths.view_product_url + p.product.ID);
			
			if( p.defaultAttachment === 0 ){
				image.attr('src', Base.paths.theme_path, '/img/product_no_image.png');
			}
			else{
				image.attr('src', img_base_src +'?id='+ p.product.ID +'-'+ p.defaultAttachment +'&w=235&h=235');
			}
			data.find('.name')
				.text(p.product.subject)
				.attr('href', Base.paths.view_product_url + p.product.ID);
			data.children('.date').text(d.getDate() +'/'+ (d.getMonth()+1) +'/'+ d.getFullYear());
			data.find('.reviews').text(p.reviewCount);
			data.find('.cms-meanrating').html(StuffBrowser.View.generateMeanRating(p.meanRating));
			data.find('.votes').text(p.ratingCount);
			data.find('.have').text(p.haveCount);
			data.find('.want').text(p.wantCount);
			
			item.clone().appendTo(html);
		}
		return [html];
	}
	
	/**
	 * Get LIST VIEW content
	 * 
	 * @param {Object} first_item_id
	 */
	function getListViewContent(first_item_id)
	{
		var v = StuffBrowser.View.getViewData(1);
		var item = v.item_html;
		var html = [v.item_container.clone(), v.item_container.clone()]; // we need 2 ul's
		
		// make item shorcuts
		var nr = item.children('.nr');
		var cat = item.children('.cat');
		
		var max = getMaxProductsForView(first_item_id, v.max_items);
		var half = first_item_id + (v.max_items /2);
		
		for( var i = first_item_id; i < max; i++ ){
			var p = products[i];
			
			item.attr('id', i);
			nr.text(i+1);
			cat.addClass('categoryX');
			item.find('a').text(p.product.subject).attr('href', Base.paths.view_product_url + p.product.ID);
			
			item.clone().appendTo(html[(i<half)?0:1]); // put in html[0] or [1] depending on which side of half we are
			cat.removeClass('categoryX'); // reset class, so it won't stack
		}
		return html;
	}
	
	/**
	 * Get THUMBNAIL VIEW content
	 * 
	 * @param {int} first_item_id
	 */
	function getThumbnailViewContent(first_item_id)
	{
		var v = StuffBrowser.View.getViewData(2);
		var item = v.item_html;
		var html = v.item_container.clone();
		
		var max = getMaxProductsForView(first_item_id, v.max_items);
		for( var i = first_item_id; i < max; i++ ){
			var p = products[i];
			
			item.attr('id', i);
			item.find('a').attr('href', Base.paths.view_product_url + p.product.ID);
			
			if( p.defaultAttachment === 0 ){
				item.find('img').attr('src', Base.paths.theme_path, '/img/product_no_image.png');
			}
			else{
				item.find('img').attr('src', img_base_src +'?id='+ p.product.ID +'-'+ p.defaultAttachment +'&w=70&h=70');
			}
			
			item.clone().appendTo(html);
		}
		return [html];
	}
	
	/**
	 * Returns the max id of product json, which is used in the for loop
	 * when getting view content.
	 * 
	 * @param {int} f first_item_id (requested for view)
	 * @param {int} m max_items (for selected view)
	 */
	function getMaxProductsForView(f, m)
	{
		return products[f + m]? f + m: products.length;
	}
	
	
	// ================== CALLING FUNCTIONS ==================
	
	/**
	 * Create card and fill with HTML generated from JSON
	 * 
	 * @param {int} view_id Kwick, List or Thumbnail view (0,1,2)
	 * @param {int} card_nr Is equal to paginator
	 */
	function createCard(card_nr, view_id)
	{
		var tab = StuffBrowser.getCurrentTab();
		var target = tab +' .card'+ card_nr;
		
		if( $(target).length != 0 )
			return; // card already exists
		else {
			// create & position card
			if( card_nr >= StuffBrowser.Paginate.getCurrentCard() )
				$(tab +' .card-holder').append('<div class="card card'+ card_nr +'"></div>');
			else
				$(tab +' .card-holder').prepend('<div class="card card'+ card_nr +'"></div>');
			
			// If there are no products, append notification
			if( products.length == 0 ){
				$(target).append('<p class="nostuff">'+ StuffBrowser.nostuff_message +'</p>');
			}
			
			// Compose "get..ViewContent" function name and run it
			var view = StuffBrowser.View.getViewData(view_id);
			var first_item_id = (card_nr * view.max_items) - view.max_items;
			var append = eval('get'+ view.name +'ViewContent')(first_item_id); // getKwicksViewContent | getListViewContent | getThumbnailViewContent
			
			// Since the list view returns an array, we made the other functions return an array too.
			$.each(append, function(i, html){ // html is an <ul>
				html.appendTo(target);
			});
			
			// For the kwick view, bind kwicks event to newly added card (live doesn't work)
			// other views get the tooltip
			if( view_id == 0 )
				StuffBrowser.initKwicks(card_nr);
			else
				StuffBrowser.Tooltip.bindEvents(card_nr);
		}
	}
	
	return {
		/**
		 * Calls createCard() for current card and X number of cards to it's
		 * right and left.
		 * 
		 * @param {int} card_nr
		 * @param {int} spread Nr of extra cards left & right
		 */
		load: function(card_nr, spread)
		{
			if( card_nr <= 0 ) return false;
			
			var view = StuffBrowser.View.getCurrent();
			createCard(card_nr, view); // Always first get the requested card
			
			// If spread is given, create and fill other cards
			if( typeof spread != 'undefined' ){
				for( var i = card_nr - spread; i <= card_nr + spread; i++ ){
					if( i > 0 && i != card_nr ){
						// don't create right spread card if no items left
						if( card_nr <= Math.ceil(products.length / StuffBrowser.View.getViewData(view).max_items) ){
							createCard(i, view);
						}
					}
				}
			}
		},
		
		/**
		 * Sets what products to display in the different tabs
		 */
		setProductSource: function()
		{
			products = StuffBrowser.products[StuffBrowser.getCurrentTab(true)];
		},
		
		/**
		 * Initialization - called by parent
		 */
		init: function() {
			// Set private variables
			view = StuffBrowser.View.getViewData();
			img_base_src = Base.paths.product_image;
		}
	};
}(jQuery);
