
	/**
	 * @author	Dennis Laupman
	 * @description	Reactions navigation
	 * @since	20090316
	 * @requires	jquery.js
	 * @copyright	Pluxbox, 2009
	 * @version	0.9
	 */


	(function( pb, $ )
	{
		pb.reactionsNavigation = function()
		{
			this.reactionsPerPage = 0;
			this.currentPage = 0;
			this.numberOfReactions = 0;
			this.filter = 0;
			this.eventHandlers = null;
		}
		
		pb.reactionsNavigation.prototype = 
		{
				setNumberOfRecords : function( numberOfReactions )
				{
					if(typeof(numberOfReactions) != "number")
					{
						alert("\"numberOfReactions\" is not a number!");
						return false;
					}
					else
					{
						this.numberOfReactions = numberOfReactions;
						return true;
					}
				}
				
			,	setReactionsPerPage: function( reactionsPerPage )
				{
					if(typeof(reactionsPerPage) != "number")
					{
						alert("\"reactionsPerPage\" is not a number!");
						return false;
					}
					else
					{
						this.reactionsPerPage = reactionsPerPage;
						return true;
					}
				}
				
			,	setFilter : function( filter )
				{
					this.filter = filter;
					//this.numberOfReactions = 999;
					this.loadPages(0);
				}
				
			,	setEvents : function( eventHandlers )
				{
					if(typeof(eventHandlers) != "object")
					{
						alert("\"eventHandlers\" is not a object!");
						return false;
					}
					else
					{
						this.eventHandlers = eventHandlers;
						return true;
					}					
				}
	
			,	setFormObject : function( formObject )
				{
					if(typeof(formObject) != "object")
					{
						alert("\"formObject\" is not a object!");
						return false;
					}
					else
					{
						this.eventHandlers.form = formObject;
						this.updateEvents();
						return true;
					}					
				}
	
			,	updateEvents : function()
				{
					var object = this;
					
					if(!this.eventHandlers)
					{
						alert("\"eventHandlers\" is not set!");
						return false;
					}
						
					this.eventHandlers.next.unbind("mousedown").bind("mousedown", function(){ return false; });
					this.eventHandlers.prev.unbind("mousedown").bind("mousedown", function(){ return false; });
		
					if( this.getNumberOfPages() > 1 && this.currentPage < (this.getNumberOfPages()-1))
					{
						this.eventHandlers.next.addClass('active')
						this.eventHandlers.next.unbind("click").bind("click", function(){ object.loadPages(object.currentPage+1); return false; });
					}
					else
					{
						this.eventHandlers.next.removeClass('active');
						this.eventHandlers.next.unbind("click").bind("click", function(){ return false; });
					}
					
					if( this.getNumberOfPages() > 1 && this.currentPage > 0)
					{
						this.eventHandlers.prev.addClass('active')
						this.eventHandlers.prev.unbind("click").bind("click", function(){ object.loadPages(object.currentPage-1); return false; });
					}
					else
					{
						this.eventHandlers.prev.removeClass('active');
						this.eventHandlers.prev.unbind("click").bind("click", function(){ return false; });
					}
					
					if( this.getNumberOfPages() > 3)
					{	
						var	firstNumber = (this.currentPage == 0) ? "<span>1</span> " : (this.currentPage < 2) ? "<a href=\"#\">1</a> " : "<a href=\"#\">1</a> ... ";
						var	lastNumber = (this.currentPage == (this.getNumberOfPages()-1)) ? "<span>"+this.getNumberOfPages()+"</span> " : (this.currentPage > (this.getNumberOfPages()-3)) ? "<a href=\"#\">"+this.getNumberOfPages()+"</a>" : "... <a href=\"#\">"+this.getNumberOfPages()+"</a>";
						var	maxIndexNumbers = (this.currentPage < 2) ? 4 : (this.currentPage > (this.getNumberOfPages()-3)) ? (this.currentPage + (3 - -( this.getNumberOfPages() - (this.currentPage + 3)))) : (this.currentPage + 3);
						var	minIndexNumbers = (this.currentPage < 2) ? 2 : (this.currentPage > (this.getNumberOfPages()-3)) ? (maxIndexNumbers - 2) : (maxIndexNumbers - 3);
						
						this.eventHandlers.numbers.empty();
						this.eventHandlers.numbers.append( firstNumber );
						
						for(i = minIndexNumbers; i < maxIndexNumbers; i++)
						{
							if((i-1) == this.currentPage)
								this.eventHandlers.numbers.append("<span>"+i+"</span> ");
							else
								this.eventHandlers.numbers.append("<a href=\"#\">"+i+"</a> ");
						}
			
						this.eventHandlers.numbers.append( lastNumber );
						
						$("a", this.eventHandlers.numbers).unbind("mousedown").bind("mousedown", function(){ return false; });
						$("a", this.eventHandlers.numbers).unbind("click").bind("click", function(){ object.loadPages(($(this).text()*1)-1); return false; });
						
						delete	firstNumber, lastNumber, maxIndexNumbers, minIndexNumbers;
					}
					else if( this.getNumberOfPages() > 1)
					{
						this.eventHandlers.numbers.empty();
						
						for(i = 1; i < ((this.getNumberOfPages()*1)+1); i++)
						{
							if((i-1) == this.currentPage)
								this.eventHandlers.numbers.append("<span>"+i+"</span> ");
							else
								this.eventHandlers.numbers.append("<a href=\"#\">"+i+"</a> ");
						}
						
						$("a", this.eventHandlers.numbers).unbind("mousedown").bind("mousedown", function(){ return false; });
						$("a", this.eventHandlers.numbers).unbind("click").bind("click", function(){ object.loadPages(($(this).text()*1)-1); return false; });
					}
					else
					{
						this.eventHandlers.numbers.empty();
					}
	
					this.eventHandlers.form.bind("submit", function()
					{
						object.sendReaction( $(this) );
						return false;
					});
					
					delete	object;
				}
				
			,	sendReaction : function( formObject )
				{
					if(this.validateReaction( formObject ))
					{	
						var	object = this;
						var	postVar =
						{
								nid : $("input.item-id").val() || ""
							,	email : formObject.find("input#email").val() || ""
							,	message : formObject.find("textarea#comment").val() || ""
							,	captcha : formObject.find("input#captcha").val() || ""
							,	captcha_checksum : formObject.find("input.captcha_checksum").val() || ""
							,	captcha_time : formObject.find("input.captcha_time").val() || ""
						}
						
							postVar.name = formObject.find("input#surname").val() +" "+ formObject.find("input#familyname").val();
						
						$.getJSON("/api/pb.reactions.api.php", postVar, function( data )
						{	
							var data = eval(data);
					
							if(data.success)
							{		
								formObject.hide();	
								$("div#popup-frame").find(".error").hide();
								$("div#popup-frame").find(".send").fadeIn();
								object.loadPages(0);
							}
							else
							{
								$("div#popup-frame").find(".error").fadeIn();
								
								for(error in data.errors)
									$("label."+data.errors[error]).addClass("add-error");
							}
						});
						
						delete object;
					}
					else
					{
						
						$("div#popup-frame").animate( { height:425 }, function()
						{
							$("div#popup-frame").find(".error").fadeIn();
						});
					
					}
				}
				
			,	validateReaction : function( formObject )
				{
					var	errors = false; 
					
					
					$(".add-error").removeClass("add-error");
					
					if(!formObject.find("input#surname").val())
					{
						$("label.surname").addClass("add-error");
						errors = true;
					}
					
					if(!formObject.find("input#familyname").val())
					{
						$("label.familyname").addClass("add-error");
						errors = true;
					}
					
					if(!formObject.find("input#email").val())
					{
						$("label.email").addClass("add-error");
						errors = true;
					}
					else
					{
						var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
		
						if(!emailPattern.test(formObject.find("input#email").val()))
						{
							$("label.email").addClass("add-error");
							errors = true;
						}
					}
					
					if(!formObject.find("textarea#comment").val())
					{
						$("label.comment").addClass("add-error");
						errors = true;
					}
					
					var	code = formObject.find("input#captcha").val();
					if(code.length < 4)
					{
						$("label.captcha").addClass("add-error");
						errors = true;
					}
				
					if(errors)
						return false;
					else
						return true;
				}
				 
			,	getNumberOfPages : function()
				{	
					return Math.ceil(this.numberOfReactions / this.reactionsPerPage);
				}
					
			,	loadPages : function( page )
				{
					var	object = this;
						object.currentPage = page;
						
					var	itemsOffset = (this.currentPage*this.reactionsPerPage) || 0;
	
					$("div#reaction-content").load("/page/reactions/"+this.filter+"/"+itemsOffset, function( )
					{
						//tijdelijk slordig ;)
						object.setNumberOfRecords( $("input#numberOfReactions").val()*1 );
						object.updateEvents();
					});
					
					delete	object, itemsOffset;
				}
		}
		
	})( PluxboxR5, jQuery );