(function($) {
  $.fn.thumbsCarousel = function(o) {
    var carousels = [];
    this.each(function() {
       carousels.push(new $.thumbsCarousel(this, o));
    });
    return (carousels.length == 1) ? carousels[0] : carousels;
  };
    
  // Default configuration properties. timeout is expressed in seconds
  var defaults = {
    one_slide: true,
    display_pagination: true,
    display_bottom_pagination: true,
    n_rows: 2,
    n_cols: 5,
    pic: '/img/cont/generic_thumb.jpg',
    info: '',
    url: "'/catalogo/play/'+cur_item.contentId+'/'+cur_item.contentTitle.slug()",
    params: '',
    has_preferred: 0,
    show_price: false,
    showNew: true,
		row_height: 175,
    imageType: 'hpl_',
    imageExt: '.jpg',
    imagePath: LOCANDINE_VOD,
    print_id: false,
    showBanner: true,
    showTitle: true,
    print_linkTitle: false,
		showStatus: false,
		errormsg: {'timeout' : 'Il sito non &egrave; in grado di caricare i dati in tempo utile, riprova pi&ugrave; tardi', 'error' : 'Il sito non &egrave; in grado di caricare i dati riprova pi&ugrave; tardi', 'default' : 'Il sito non &egrave; in grado di caricare i dati riprova pi&ugrave; tardi'}
  };
  
  $.thumbsCarousel = function(e, o) {
    this.options = $.extend({}, defaults, o || {});
    if (this.options.one_slide) {
			this.options.display_pagination = 0;
		}
    this.options.element_list = null;
    this.options.cont_id = $(e).attr('id');
    this.options.container_id = $(e).parent().attr('id');
    this.options.block_size = this.options.n_rows * this.options.n_cols;
    this.options.cur_block = 0;
    this.options.num_blocks;
		
    switch (this.options.n_cols) {
      case 3:
        this.options.ul_w = 655;
        break;
      case 4:
        this.options.ul_w = 966;
        break;
      case 5:
        this.options.ul_w = 990;
        break;
      // NOTE
      //	per "case 3 e 4" sincronizzare il valore della prima regola del blocco "/* layout a 3 colonne */" in jcarousel.skin.thumbs_carousel.css
    }
      
    var self = this;

    if (this.options.title)
      $('#'+this.options.container_id).prepend($('<h2 class="thumbs_carousel_title">'+this.options.title+'</h2>'));

    if (!this.options.json) {
			$('#'+this.options.cont_id).height(this.options.n_rows * this.options.row_height).addClass('center-loading');
      $.ajax({
        url: JSON_DOMAIN+this.options.json_url,
        dataType: 'json',
        data: this.options.data,
        context: this,
        success: function(data) {
          $('#'+this.options.cont_id+', #'+this.options.container_id).removeClass('center-loading');
          var items;
          if (data.resultObj.contentList) items = data.resultObj.contentList;
          if (data.resultObj.channelList) items = data.resultObj.channelList;
          this.setup(items);
        },
				error: function(XMLHttpRequest, textStatus, errorThrown) {
					// gestione dell'errore
					$('#'+this.options.cont_id + ' li').html(eval('this.options.errormsg.'+textStatus)).addClass('error');
					$('#'+this.options.cont_id).removeClass('center-loading');
					if(this.options.hide_on_error){
						for(var i in this.options.hide_on_error){
							jQuery(this.options.hide_on_error[i]).remove();
						}
					}
				}
      });
    } else {
      $('#'+this.options.cont_id+', #'+this.options.container_id).removeClass('center-loading');
      this.setup(this.options.json);
    }
  }
  
  $.thumbsCarousel.fn = $.thumbsCarousel.prototype = {
      thumbsCarousel: '0.0.1'
  };
  
  $.thumbsCarousel.fn.extend = $.extend;
  
  $.thumbsCarousel.fn.extend({
    reload: function(json) {
      var container = $('#'+this.options.container_id);
      var list = $('<ul id="'+this.options.cont_id+'" class="jcarousel-skin-thumbs"><li></li></ul>');
      container.empty().append(list);
      if (this.options.title)
        $('#'+this.options.container_id).prepend($('<h2 class="thumbs_carousel_title">'+this.options.title+'</h2>'));
      this.setup(json);
    },
    setup: function(json) {
      // imposto le classi a seconda delle opzioni
      var container = $('#'+this.options.container_id);
      container.addClass('cols_'+this.options.n_cols);
      if (this.options.one_slide)
        container.addClass('oneslide');
      if (this.options.display_pagination)
        container.addClass('haspagination');
      if (json && json.length > 6 && this.options.showBanner)
        $('div.banner').show();      
      
      // gestisco il json
      this.options.data = json;
      this.options.tot_items = this.options.data.length;
      if(this.options.one_slide) {
        this.options.block_size = this.options.tot_items; /* imposto la dimensione della pagina al valore del num. totale dei blocchi disponibili per non avere paginazioni */
      }
      this.options.num_blocks = Math.ceil(this.options.tot_items / this.options.block_size);
      
      var blockcode = '';
      /* commentare il ciclo for, ma non l'istruzione al suo interno, per fermare la costruzione del carousel alla prima slide */
      for (var i = 0; i < this.options.num_blocks; i++) {          
          blockcode += this.thumbs_html_block_generator(this.options.data, this.options.block_size, i, this.options.tot_items);
      }
      jQuery('#'+this.options.cont_id).html(blockcode);
			$('#'+this.options.cont_id).css('height','auto');

      /*if (jQuery.browser.webkit) { sembra funzionare anche senza
        var delhandler = setTimeout( function(){this.buildcarousel('#'+this.options.cont_id,1,this.thumbs_initCallback,this.thumbs_buttonPrevCallback,this.thumbs_buttonNextCallback)},25);
      } else {*/
        this.buildcarousel('#'+this.options.cont_id,1,this.thumbs_initCallback,this.thumbs_buttonPrevCallback,this.thumbs_buttonNextCallback);
      //}
//      $(document).pngFix();
    },
    thumbs_initCallback: function(carousel, state){
      if (carousel.options.thumbsCarousel.options.one_slide && jQuery.browser.webkit) {
        jQuery('#'+carousel.options.thumbsCarousel.options.cont_id).css('width', carousel.options.thumbsCarousel.options.ul_w+'px'); /* fix per Safari e Chrome */
      }
      if(carousel.options.thumbsCarousel.options.display_pagination){carousel.options.thumbsCarousel.pagination(carousel,'#'+carousel.options.thumbsCarousel.options.container_id,carousel.options.thumbsCarousel.options.num_blocks)}
      if(carousel.options.thumbsCarousel.options.has_preferred){carousel.options.thumbsCarousel.preferred(carousel,'#'+carousel.options.thumbsCarousel.options.container_id,carousel.options.thumbsCarousel.options.tot_items)}
      if (navigator.userAgent.match('MSIE 6')) {
        jQuery('#'+carousel.options.thumbsCarousel.options.cont_id+' ul li').mouseenter(function() {
					jQuery(this).find('.likecont').show();
					jQuery(this).find('.frame').hide();
          jQuery(this).find('.framehover').show();
				});
        jQuery('#'+carousel.options.thumbsCarousel.options.cont_id+' ul li').mouseleave(function() {
          jQuery(this).find('.likecont').hide();
          jQuery(this).find('.frame').show();
          jQuery(this).find('.framehover').hide();
				});
      }
			jQuery('#'+carousel.options.thumbsCarousel.options.cont_id+' ul li div.likecont a').click(function() {
				if(jQuery(this).hasClass('active')){
					jQuery(this).removeClass('active');
				} else {
					jQuery(this).parent().find('a').removeClass('active');
					jQuery(this).addClass('active');
				}
			});
	  },
    buildcarousel: function(objId,scrollvalue,initcallback,buttonprevcallback,buttonnextcallback) {
      jQuery(objId).jcarousel({
        scroll: scrollvalue,
        initCallback: initcallback,
        buttonPrevCallback: buttonprevcallback,
        buttonNextCallback: buttonnextcallback,
        thumbsCarousel: this
      });
    },
    thumbs_html_block_generator: function(data, block_size, block, tot_items){ /* generazione del codice html da passare a jCarousel */
      var cur_index;
      var cur_item;
      var blockcode = '\n<li>\n\t<ul class="thumbs_carousel_galleryblock">';
      var islast;
      var islastdays;
      var isnew;
      var curpic;
      var curinfo;
      var cururl;
      var isexternal;
			var like;
			var haslogo;
			var hasprice;
			var ispreferred;
			//var bookmarks = MDS.bookmarks.hasCookie();
      
      for (var i = 0; i < this.options.block_size; i++) {
        cur_index = block_size * block + i;
        if (cur_index < tot_items) {
          cur_item = data[cur_index];          
          islast = cur_index && ((cur_index+1) % this.options.n_cols == 0);
          isnew = (this.options.showNew) ? cur_item['isNew'] == 'Y' : false;
          isexternal = (cur_item.linkSite && cur_item.linkSite != '');
          islastdays = false; // disabilitato cur_item['isLastDays'] == 'Y';
          haslogo = cur_item['channelName'];          
          hasprice = (this.options.show_price) ? cur_item['price'] : false;
          ispreferred = this.options.has_preferred;          
					like = cur_item['like'];
          
										
          blockcode += '\n\t\t<li class="' + ((isnew)?'new ':'') + ((isexternal)?'external ':'') + ((islastdays)?'lastdays ':'') + ((haslogo)?haslogo.slug()+' ':'') + ((hasprice )?'price ':'') + ((ispreferred )?'preferred ':'') + ((islast )?'last':'') + '">';
          
          // link + id
          blockcode += '\n\t\t\t<a'; 
          if (this.options.print_id && cur_item.categoryId) {
            blockcode += ' id="categoryId_'+cur_item.categoryId+'"';
          } else if (this.options.print_id && cur_item.contentId) {
            blockcode += ' id="contentId_'+cur_item.contentId+'"';
          }
          
          // title
          if(this.options.print_linkTitle){
	          blockcode += ' title="';
	          if (cur_item.categoryName && cur_item.categoryName != '') {
	            blockcode += cur_item.categoryName;
	          } else if(cur_item['contentTitle'] && (cur_item['contentTitle']!='')){
	            blockcode += cur_item['contentTitle'];
	          } else if (cur_item.channelName && cur_item.channelName != '') {
	            blockcode += cur_item.channelName;
	          } else {
	            blockcode += this.options.info;
	          }
	          blockcode += '" ';
          }
          
          // target
          if (cur_item.linkSite && cur_item.linkSite != '') {
          	blockcode += ' target="_blank"';
          }
          
          // href
          blockcode += ' href="';
          if (cur_item.linkSite && cur_item.linkSite != '') {
          	blockcode += cur_item.linkSite;
          } else if (this.options.url) {
            var url = eval(this.options.url);
            if (cur_item.categoryName && cur_item.categoryList && cur_item.categoryList.length == 0)
              url = url.replace(/\#/,'');
            blockcode += url+this.options.params;
          }
          if (cur_item.categoryName && cur_item.categoryList && cur_item.categoryList.length == 0) {
            var pId = (parentId) ? '?parentId='+parentId : '?parentId='+cur_item.categoryId;
            blockcode += '/'+cur_item.categoryId+pId;
          }
          blockcode += '" ';
          blockcode += 'class="cl">';

          blockcode += '\n\t\t\t\t<span class="base">';
          blockcode += '\n\t\t\t\t\t<img src="';
          
          // IMAGE URL
          var itemId = (cur_item.contentId) ? cur_item.contentId : cur_item.categoryId;
          if (cur_item.channelId) itemId = cur_item.channelId;
          blockcode += getImgMirror()+this.options.imagePath+this.options.imageType+itemId+this.options.imageExt;
          
          blockcode += '" ';
          blockcode += 'alt="';
          if(cur_item['contentTitle'] && (cur_item['contentTitle']!='')){
            blockcode += cur_item['contentTitle'];
          }else if (cur_item.categoryName && cur_item.categoryName != '') {
            blockcode += cur_item.categoryName;
          } else if (cur_item.channelName && cur_item.channelName != '') {
            blockcode += cur_item.channelName;
          } else {
            blockcode += this.options.info;
          }
          blockcode += '" ';
          blockcode += 'title="';
          if(cur_item['contentTitle'] && (cur_item['contentTitle']!='')){
            blockcode += cur_item['contentTitle'];
          }else if (cur_item.categoryName && cur_item.categoryName != '') {
            blockcode += cur_item.categoryName;
          } else if (cur_item.channelName && cur_item.channelName != '') {
            blockcode += cur_item.channelName;
          } else {
            blockcode += this.options.info;
          }
          blockcode += '" />';
          
          if (this.options.showTitle) {
            blockcode += '\n\t\t\t\t\t<span class="desc">';
            if (!this.options.hide_title) {
              if(cur_item['contentTitle'] && (cur_item['contentTitle']!='')){
								var tempTitle = cur_item['contentTitle'];
								if(tempTitle.length>46){
	                tempTitle= tempTitle.substring(0,46)+'...';
	              }
                blockcode += tempTitle;
              } else if (cur_item.channelName && cur_item.channelName != '') {
                blockcode += '<strong>'+cur_item.channelName+'</strong>';
              } else {
                blockcode += this.options.info;
              }
            }
            blockcode += '</span>';
          }
					//Stato della serie, in onda o completa
          if (this.options.showStatus) {
						if(cur_item['cat_Img'] && cur_item['cat_Img']!=''){
							blockcode += '\n\t\t\t\t\t<img class="status" src="'+STATUS_PATH;
							blockcode += cur_item['cat_Img'];
							blockcode += '" alt="" title="" />';
						}
          }
          blockcode += '\n\t\t\t\t</span>';

          if (cur_item.categoryName && (cur_item.categoryName!='')) {
            var cattext = cur_item.categoryName;
            if (cattext.length > 19)
              cattext = cattext.substr(0,19).trim()+'...';
            blockcode += '\n\t\t\t\t<span class="cl category">' + cattext + '</span>';
          }

          if(this.options.show_price && cur_item['price'] && (cur_item['price']!='')){
            blockcode += '\n\t\t\t\t<strong class="price">' + cur_item['price'] + '</strong>';
          }

          if (cur_item['linkSite'] && cur_item['linkSite'] != '')
          	blockcode += '\n\t\t\t\t<span class="external"></span>';
          
          blockcode += '\n\t\t\t\t<span class="frame"></span>';
          blockcode += '\n\t\t\t\t<span class="framehover"></span>';
          blockcode += '\n\t\t\t</a>';

          if(this.options.has_preferred){
            blockcode += '\n\t\t\t<form class="preferredcheckcontainer" method="post" action="#" >';
            blockcode += '\n\t\t\t\t<fieldset>';
            blockcode += '\n\t\t\t\t\t<input class="preferred" type="checkbox" value="' + cur_item['contentId'] + '">'; // '+ ((cur_item['preferred']=='yes')?' checked="checked"':'') + '
            blockcode += '\n\t\t\t\t</fieldset>';
            blockcode += '\n\t\t\t</form>';
          }

          blockcode += '\n\t\t</li>';          
        }
        else {
            break;
        }
      }
      blockcode += '\n\t</ul>\n</li>\n';
      return blockcode;
    },
    preferred: function(carousel, cont_id, tot) { /* funzione per la creazione e gestione dei preferiti: inserisce il numero di elementi caricati nel carousel nel titolo dello stesso e lo aggiorna nel pulsante "preferiti" nell'header */
			jQuery(cont_id+' h2.thumbs_carousel_title').html( jQuery(cont_id+' h2.thumbs_carousel_title').html() + ' ( '+tot+' )');
			jQuery('#loginbar_preferiti').html(tot);
			//jQuery(cont_id+' h2.thumbs_carousel_title').css({'font-size':'18px', 'line-height':'21px'});
    },
    updatePaginator: function(cont_id,delta){ /* PAGINAZIONE: funzione lanciata dal click sulle frecce di avanzamento: aggiorna gli indici di paginazione se visualizzabili */
      jQuery(cont_id+' .pagination .pag_cur').html(parseInt(jQuery(cont_id+' .pagination .pag_cur').html()) + delta); 
    },    
    pagination: function(carousel,cont_id,tot){ /* funzione per la creazione e gestione della paginazione, deve inserire e gestire gli indicatori di paginazione tra i controlli del carousel e quindi può intervenire solamente dopo la costruzione dello stesso */
    	if (tot > 1) {
	      jQuery(cont_id+' .jcarousel-container').append('<div class="pagination"><span class="pag_cur">1</span>/<span class="pag_tot">'+tot+'</span></div>');
	      jQuery(cont_id+' .jcarousel-next').click(function(){ if(!jQuery(this).hasClass('jcarousel-next-disabled') && !carousel.animating){carousel.options.thumbsCarousel.updatePaginator(cont_id,1)}  });
	      jQuery(cont_id+' .jcarousel-prev').click(function(){ if(!jQuery(this).hasClass('jcarousel-prev-disabled') && !carousel.animating){carousel.options.thumbsCarousel.updatePaginator(cont_id,-1)} });
    	}
      if(carousel.options.thumbsCarousel.options.display_bottom_pagination){ //Costruisco blocco della seconda paginazione
      	var bottom_arrow= $('<div class="bottom_arrow">');
      	
      	prev_arrow_std = jQuery('#'+carousel.options.thumbsCarousel.options.container_id+' .jcarousel-prev:first');
      	bottom_arrow_prev= prev_arrow_std.clone(true,true);    
      	next_arrow_std= jQuery('#'+carousel.options.thumbsCarousel.options.container_id+' .jcarousel-next');
      	bottom_arrow_next= next_arrow_std.clone(true,true);
      	
      	jQuery(bottom_arrow).append('<div class="jcarousel-prev jcarousel-prev-horizontal jcarousel-prev-disabled-horizontal" style="display: block;"></div>');
      	if (tot > 1) {
      		jQuery(bottom_arrow).append('<div class="pagination"><span class="pag_cur">1</span>/<span class="pag_tot">'+tot+'</span></div>');
      		jQuery(bottom_arrow).append('<div class="jcarousel-next jcarousel-next-horizontal" style="display: block;"></div>');
      	} else {
      		jQuery(bottom_arrow).append('<div class="jcarousel-next jcarousel-next-horizontal jcarousel-next-disabled-horizontal" style="display: block;"></div>');
      	}
      	jQuery('#'+carousel.options.thumbsCarousel.options.container_id+' .jcarousel-container').append(bottom_arrow);
      	$('.jcarousel-skin-thumbs > .jcarousel-container > .jcarousel-next').die().live('click', function() {
					if ($(this).siblings('.bottom_arrow').find('.pagination').size()) {
						var bottomarrow = $(this).parents('.jcarousel-container').find('.bottom_arrow .jcarousel-next');
						var pages = $(this).siblings('.pagination').text().split('/');
      			var cur = pages[0];
      			var total = pages[1];
      			if (cur == total) {
      				$(this).add(bottomarrow).addClass('jcarousel-next-disabled-horizontal');
      				$(this).add(bottomarrow).siblings('.jcarousel-prev').removeClass('jcarousel-prev-disabled-horizontal');
      			} else {
      				$(this).add(bottomarrow).siblings('.jcarousel-prev').removeClass('jcarousel-prev-disabled-horizontal');
      			}
      	  }
      	});
      	$('.jcarousel-skin-thumbs > .jcarousel-container > .jcarousel-prev').die().live('click', function() {
      	  if ($(this).siblings('.bottom_arrow').find('.pagination').size()) {
      	  	var bottomarrow = $(this).parents('.jcarousel-container').find('.bottom_arrow .jcarousel-prev'); 
	      		var pages = $(this).siblings('.pagination').text().split('/');
	      		var cur = pages[0];
	      		var total = pages[1];
	      		if (cur == 1) {
	      			$(this).add(bottomarrow).addClass('jcarousel-prev-disabled-horizontal');
	      			$(this).add(bottomarrow).siblings('.jcarousel-next').removeClass('jcarousel-next-disabled-horizontal');
	      		} else {
	      			$(this).add(bottomarrow).siblings('.jcarousel-next').removeClass('jcarousel-next-disabled-horizontal');
	      		}
      	  }
      	});
      	$('.bottom_arrow .jcarousel-next').die().live('click', function() {
      		if ($(this).siblings('.pagination').size()) {
      			var toparrow = $(this).parents('.jcarousel-container').find('.jcarousel-next:first'); 
      			toparrow.click();
      			var pages = $(this).parents('.bottom_arrow').find('.pagination').text().split('/');
      			var cur = pages[0];
      			var total = pages[1];
      			if (cur == total) {
      				$(this).add(toparrow).addClass('jcarousel-next-disabled-horizontal');
      				$(this).add(toparrow).siblings('.jcarousel-prev').removeClass('jcarousel-prev-disabled-horizontal');
      			} else {
      				$(this).add(toparrow).siblings('.jcarousel-prev').removeClass('jcarousel-prev-disabled-horizontal');
      			}
      		}
      	});
      	$('.bottom_arrow .jcarousel-prev').die().live('click', function() {
      		if ($(this).siblings('.pagination').size()) {
	      		var toparrow = $(this).parents('.jcarousel-container').find('.jcarousel-prev:first'); 
	      		toparrow.click();
	      		var pages = $(this).parents('.bottom_arrow').find('.pagination').text().split('/');
	      		var cur = pages[0];
	      		var total = pages[1];
	      		if (cur == 1) {
	      			$(this).add(toparrow).addClass('jcarousel-prev-disabled-horizontal');
	      			$(this).add(toparrow).siblings('.jcarousel-next').removeClass('jcarousel-next-disabled-horizontal');
	      		} else {
	      			$(this).add(toparrow).siblings('.jcarousel-next').removeClass('jcarousel-next-disabled-horizontal');
	      		}
      		}
      	})
      }
		}
  });
})(jQuery);
