/**
 * Estensione per la gestione delle news filtrabili e animate 
 * nel sito CF&L
 * nome mbPrettyNews
 */
(function($){
	/**
	 * mbPrettyNewsObj oggetto che gestisce le funzionalità del plugin
	 * @param {Object} $stage: L'oggetto jQuery usato come stage per le news
	 * @param {Object} options
	 */
	var mbPrettyNewsObj = function($stage, options)
	{
		//$stage deve essere un oggetto jQuery
		if(!($stage instanceof jQuery))
		{
			alert('mbPrettyNews: è necessario passare un parametro di tipo jquery');
			return;
		}
		//imposto l'overflow per il contenitore delle notizie
		
		if(!options) options={};
		//impostazioni di default
		var settings = 	{
							iNewsHeight:130,
							iNewsWidth:215,
							iMargin:5,
							sAllTitle:'Tutti',
							iPageLength:15,
							iPagesMax:5,
							iStart:1,
							drawFilterButtons:null,
							drawNews:null,
							drawNavigateButtons:null
						}
		this.options = {};
		$.extend(this.options, settings, options);
		//metodi definiti dal plugin
		this.drawFilterButtons = this.options.drawFilterButtons;
		this.drawNews = this.options.drawNews;
		this.drawNavigateButtons = this.options.drawNavigateButtons;
		this.sUrl = this.options.sUrl;
		this.iPageLength = this.options.iPageLength;
		
		//creo all'interno di stage una div con posizione relativa
		this.stage = $stage;
		//gestione posizione delle news
		this.currentPos = {x:0,y:0,page:0};
		
		//indica l'attuale posizione orrizzontale di news_container
		this.currentPage = 1;
		//methods per la posizione
		this.resetCoord = function()
		{
			this.currentPos ={x:0,y:this.options.iMargin,page:0};
		}
		/**
		 * Resttituisce la prossima coordinata della news
		 */
		this.nextCoord = function()
		{
			var opt = this.options;
			var actualPos = jQuery.extend({},this.currentPos) ;
			this.currentPos.x += opt.iNewsWidth + opt.iMargin;
			if((this.currentPos.x + opt.iNewsWidth + opt.iMargin )> ($stage.width() * (this.currentPos.page + 1)))
			{
				this.currentPos.x = $stage.width() * this.currentPos.page;
				this.currentPos.y += opt.iNewsHeight + opt.iMargin;
				if((this.currentPos.y + opt.iNewsHeight ) > this.minHeight())
				{
					this.currentPos.page ++;
					this.currentPos.x = $stage.width() * this.currentPos.page;
					this.currentPos.y = opt.iMargin;	
				}
			}
			return actualPos;	
		}
		
		//altezza minima dell'area delle news
		this.minHeight = function()
		{
			var cols = Math.floor($stage.width()/this.options.iNewsWidth);
			var rows = (this.options.iPageLength % cols == 0) ? this.options.iPageLength / cols :
																Math.floor(this.options.iPageLength / cols) + 1;
			return rows * (this.options.iNewsHeight + this.options.iMargin);
		};
		
		//caricamento della risorsa JSON che contiene le news
		this.load = function(url, pars)
		{
			if ((typeof url) == 'object')
			{
				pars = url;
				url = this.sUrl;
			}
			else
			{
				this.sUrl = url;
			}
			var me = this;
			$stage.addClass('mb-utility-loading'); //caricamento in corso...
			
			pars.Start = 1;
			pars.Length = this.options.iPagesMax * this.options.iPageLength;
				
			if (pars.parentTag)
				this.options.sParentTag = pars.parentTag
			else
				pars.parentTag = this.options.sParentTag;
			
			jQuery.getJSON(url, pars, function(data)
			{

				me.aaNews = data.aaData;
				me.iStart = data.start;
				me.iLength = data.length;
				me.iTotal = data.total;
				me.sColor = data.sColore;
				//carico e creo i bottoni se non sono stati creati
				if (!me.aaTags)
				{
					me.aaTags = data.aaTags;
					//aggiungo il ruolo filter ai bottoni tags
					for(var i = 0; i < me.aaTags.length; i++)
					{
						me.aaTags[i].push('filter');
					}
					//aggiungo il tag 'all' con il ruolo cancel
					me.aaTags.push([me.options.sAllTitle, data.sColore, 'cancel'])
					if (me.drawFilterButtons)
						me.drawFilterButtons(me);
				}
				
				if(me.drawNews)
					me.drawNews(me);
//				if(me.drawNavigateButtons)
//					me.drawNavigateButtons(me);
					
				$stage.removeClass('mb-utility-loading');//caricamento finito
			})
		};
		this.gotoPage = function(iPage)
		{
			var me = this;
			var myLeft = -1 * (iPage - 1) * this.stage.width();
			this.news_container.animate({
								left: myLeft 
							}, 
							'normal', 
							'swing',
							function()
							{
								me.currentPage = iPage;
								me.drawNavigateButtons(me);
							});		
			;
		}
		
	};
	/**
	 * Estensione jQuery
	 * @param {string} url: risorsa json da richiamare
	 * @param {Object} parameters: parmetri da passare alla url in particolare Lenght che definisce il
	 * 				   numero di news per pagina
	 * @param {Object} options: opzioni di impaginazione delle nes (vedi settings) 
	 */
	$.fn.mbPrettyNews = function(url, parameters, options)
	{
		if(!options) options = {};
		var $stage = ($('<div></div>'))
						.css('position', 'relative')
						.width(this.width())
						.css('overflow', 'hidden')
						.appendTo(this);
		//defsult
		var settings = 	{
							iNewsHeight:130,
							iNewsWidth:215,
							iMargin:5,
							sAllTitle:'Tutti',
							iPageLength:15,
							sUrl:'/ajaxNews/ajax_grupponews_JSON.aspx',
							sParentTag:'NEWS_sala_stampa'
						};
		//metodi assegnato all'oggeto mbPrettyNewsObj
		var methods = 	{
							drawFilterButtons: function(obj) // disegna i bottoni corrispondenti ai tag
							{
								// obj è l'ggetto mbPrettyNewsObj che raccoglie tutte  
								// le infromazioni
								var tags = obj.aaTags;
								$('*', $stage).remove();
								var btn_nav = $('<ul></ul>'); //nav tool bar
								btn_nav.addClass('mb-pn-button-filter-nav')
									   .appendTo($stage);
								for(i=0; i<tags.length; i++)
								{
									var el = tags[i];
									var btn = $('<a href=#>' + el[0] + '</a>').css('background-color', el[1]);
									btn.addClass('mb-utility-transp');
									btn.attr('role',el[2]);
									btn.appendTo($('<li></li>').css({'border-color':el[1]}).appendTo(btn_nav));
									btn.hover(
										function()
										{
											$this = jQuery(this);
											var c = $this.css('background-color');
											var t =$this.html();
											jQuery('.mb-pn-news[rel*="' + t +',"]', $stage)
													.css('background-color',c);
											if($this.attr('rel')=="selected")
												return false;
											$this.removeClass('mb-utility-transp');
											
										},
										function()
										{
											$this = jQuery(this);
											var c = obj.sColor;
											var t =$this.html();
											jQuery('.mb-pn-news', $stage)
													.css('background-color',c);
											if($this.attr('rel')=="selected")
												return false;
											$(this).addClass('mb-utility-transp');
										});
									btn.click(
										function()
										{
											$this = jQuery(this);
											if($this.attr('rel')=="selected")
													return false;
												jQuery('a[rel="selected"]', btn_nav).removeAttr('rel')
																			 		.addClass('mb-utility-transp')
																					.css('cursor','pointer');
												$this.attr('rel', 'selected')
													 .removeClass('mb-utility-transp')
													 .css('cursor','default');
											var c = $this.css('background-color');
											obj.sColor = c;
											var t =$this.html();
											obj.resetCoord();
											//rmozione messaggio no news
											$('.mb-pn-newscontainer .mb-pn-nonews').remove();
											//variabile che controlla se sono visualizzate news
											var visibleNews = 0;
											var role = $this.attr('role');
											jQuery('.mb-pn-newscontainer .mb-pn-news', $stage)
													.each(function()
													{
														var tagstr = $(this).attr('rel');
														var tagsarray;
														if (tagstr)
														 tagsarray = tagstr.split(',');
														else
															tagsarray = [];
														if((jQuery.inArray(t,tagsarray) >= 0) || role =='cancel')
														{
															var p = obj.nextCoord();
															$(this).css('display','block');
															$(this).animate({
																			opacity:1,
																			top:p.y,
																			left:p.x,
																			'background-color':c
																			});		
															visibleNews++;
														}
														else
														{
															$(this).animate({opacity:0}, function()
															{
																$(this).css('display','none');
															});
														}
													});
											if(visibleNews == 0)
											{
												var p = obj.nextCoord();
												$('<div></div>').appendTo($('.mb-pn-newscontainer'))
																.addClass('mb-pn-nonews')
																.html(t + ' : nessuna notizia trovata.')
																.css({left:p.x + 'px', top:p.y +'px'})
											}
											obj.gotoPage(1);
											return false;
										});
									}
									//seleziono il bottone "ALL" per default
									$('a[role="cancel"]',btn_nav).attr('rel', 'selected')
										 .removeClass('mb-utility-transp')
										 .css('cursor','default');
								},
								drawNews:function(obj) //disegna le news
								{
									var news = obj.aaNews;
									var news_container;
									obj.resetCoord();
									var oldNews = jQuery('.mb-pn-newscontainer', $stage);
									if (oldNews.length > 0)
									{
										oldNews.fadeOut('slow', function()
										{
											$(this).remove();	
											news_container.fadeIn('slow', function()
											{
												jQuery('a[rel="selected"]', $stage).removeAttr('rel')
											 									   .trigger('click');

											});									  
										})
									}
									news_container = jQuery('<div></div>').appendTo($stage)
																		  .hide()
																		  .addClass('mb-pn-newscontainer');
									news_container//.width($stage.width())
												  .height(obj.minHeight())
												  .css('width','auto');
									//memorizzo il contanitore di news nell'oggetto PrettyNews 
									//per utilizzarlo nel comando goto
									obj.news_container = news_container;
									for(i = 0; i < news.length; i++)
									{
										var el = news[i];
										var n = jQuery('<div></div>').appendTo(news_container)
																	 .addClass('mb-pn-news')
																	 .css('background-color', obj.sColor);
										n.outerWidth(obj.options.iNewsWidth);
										n.outerHeight(obj.options.iNewsHeight);
										var pos = obj.nextCoord();
										n.css({left:pos.x + 'px', top:pos.y + 'px',cursor:'pointer'});
										n.html('<h5>' + el[2] + '</h5>' + '<h1>' + el[1] + '</h1>' + el[3]);
										n.attr('rel',el[4]+',');
										n.attr('id',el[0]);
										n.hover(
											function()
											{
												var $this = jQuery(this);
												$this.addClass('mb-utility-black');
												jQuery('*',$this).addClass('mb-utility-white');
											},
											function()
											{
												var $this = jQuery(this);
												$this.removeClass('mb-utility-black');
												jQuery('*',$this).removeClass('mb-utility-white');
											})
									}	
									if(oldNews.length == 0)
										news_container.fadeIn('slow', function(){obj.drawNavigateButtons(obj)});
									else
										obj.drawNavigateButtons(obj);									  
								},
								drawNavigateButtons:function(obj) //navigazione tra le pagine di news
								{
									jQuery('.mb-pn-navbar',$stage).remove();
									var pageLength = obj.iPageLength;
									var numNews = $('div.mb-pn-news:visible', obj.news_container).length;
									var pageNo = obj.currentPage;
									var pageTot = ((numNews % pageLength) == 0) ? numNews/pageLength :
																				  Math.floor(numNews/pageLength)+1;
									if (pageTot < obj.currentPage)
									{
										obj.gotoPage(pageTot);
										return;
									}
									var navbar =jQuery('<div></div>').appendTo($stage)
														 			 .addClass('mb-pn-navbar');
									if(obj.currentPage > 1)
									{
										jQuery('<a href="#">&nbsp;</a>').addClass('mb-pn-navbar-btnleft')
																		 .click(function()
																		 {
																		 	obj.gotoPage(obj.currentPage - 1);
																			return false;
																		 })
																		 .appendTo(navbar);
									}

									jQuery('<div></div>').appendTo(navbar)
														 .html('pagina ' + pageNo + ' su ' + pageTot);

									if((obj.currentPage) < pageTot)
									{
										jQuery('<a href="#">&nbsp;</a>').addClass('mb-pn-navbar-btnright')
																		 .click(function()
																		 {
																		 	obj.gotoPage(obj.currentPage + 1);
																			return false;
																		 })
																		 .appendTo(navbar);
									}
														 
									jQuery('<div></div>').appendTo(navbar)
														 .addClass('mb-utility-clear');
								}
							};
		var o = {};
		$.extend(o,  settings, options, methods);
		//solo il primo elemento
		var prettyNewsObj = new mbPrettyNewsObj($stage, o);
		var pars = $.extend({},parameters, {Start:1})
		prettyNewsObj.load(url, pars);	
		return this;
	}
})( jQuery );

