/**
 * jpager
 * pager element
 * version 0.2 beta
 * author geiregat jonas
 */
(function($){
	$.fn.jpager = function(customOptions) {
	
		// init options
		// ============
		var options = {
			jpagerContentSelector : "jpager-content",
			jpagerSelector : "jpager",
			pageBreakSelector: "page-break",
			previousButtonSelector : "previous-btn",
			previousButtonText : "previous",
			previousLabelSelector : "previous-lbl",
			previousLabelText : "previous",
			nextButtonSelector : "next-btn",
			nextButtonText : "next",
			nextLabelSelector : "next-lbl",
			nextLabelText : "next",
			pageButtonSelector : "page-btn",
			pageLabelSelector : "page-lbl",
			currentPageSelector : "current-page",
			visibleContentSelector : "visible-content",
			hiddenContentSelector : "hidden-content"
		};
		
		var jpagers = [];
		
		if (customOptions) $.extend(options, customOptions);
		
		
		// private methods
		// ===============
		var showPage = function(page) {
			for (var i = 0; i < page.elements.length; i++) {
				$(page.elements[i]).addClass(options.visibleContentSelector);
				$(page.elements[i]).removeClass(options.hiddenContentSelector);
			}
		};
		
		var hidePage = function(page) {
			for (var i = 0; i < page.elements.length; i++) {
				$(page.elements[i]).addClass(options.hiddenContentSelector);
				$(page.elements[i]).removeClass(options.visibleContentSelector);
			}
		};

		var update = function(jpager, oldPage, newPage) {
			if (jpager.currentPage == 0 && jpager.element.previousButton.inDOM) {
				$(jpager.element.previousLabel).insertBefore(jpager.element.previousButton);
				$(jpager.element.previousButton).detach();				
				
				jpager.element.previousButton.inDOM = false;
				jpager.element.previousLabel.inDOM = true;
							
			} else if (jpager.currentPage > 0 && jpager.element.previousLabel.inDOM) {
				$(jpager.element.previousButton).insertBefore(jpager.element.previousLabel);
				$(jpager.element.previousLabel).detach();				
				
				jpager.element.previousLabel.inDOM = false;
				jpager.element.previousButton.inDOM = true;
			}
					
			if (jpager.currentPage == (jpager.pages.length - 1) && jpager.element.nextButton.inDOM) {
				$(jpager.element.nextLabel).insertBefore(jpager.element.nextButton);
				$(jpager.element.nextButton).detach();
				
				jpager.element.nextButton.inDOM = false;
				jpager.element.nextLabel.inDOM = true;
						
			} else if (jpager.currentPage < (jpager.pages.length - 1) && jpager.element.nextLabel.inDOM) {
				$(jpager.element.nextButton).insertBefore(jpager.element.nextLabel);
				$(jpager.element.nextLabel).detach();
				
				jpager.element.nextLabel.inDOM = false;
				jpager.element.nextButton.inDOM = true;
			}
			
			$(jpager.element.pageButtons[oldPage]).insertBefore(jpager.element.pageLabels[oldPage]);
			$(jpager.element.pageLabels[oldPage]).detach();
			
			jpager.element.pageLabels[oldPage].inDOM = false;
			jpager.element.pageButtons[oldPage].inDOM = true;
			
			$(jpager.element.pageLabels[newPage]).insertBefore(jpager.element.pageButtons[newPage]);
			$(jpager.element.pageButtons[newPage]).detach();
			
			jpager.element.pageButtons[newPage].inDOM = false;
			jpager.element.pageLabels[newPage].inDOM = true;
		}
				
		var create = function(pageableContent) {
			for (var i = 0; i < pageableContent.length; i++) {
				// create jpager object
				// ====================
				var jpager = {
					id : i,
					currentPage : 0,
					pages : [],
					element : {}
				}
				
				
				// create jpager pages
				// ===================
				var childNodes = pageableContent[i].childNodes;
				if (childNodes.length > 0) {					
					for (var j = 0; j < childNodes.length; j++) {
						if (childNodes[j].nodeName == "DIV" && $(childNodes[j]).hasClass(options.pageBreakSelector)) {
							jpager.pages.push({
								elements : []
							});
							$(childNodes[j]).hide();

						} else if (childNodes[j].nodeType == 1) {
							if (jpager.pages.length == 0) {
								jpager.pages.push({
									id: 0,
									elements : []
								});								
							}
							jpager.pages[jpager.pages.length - 1].elements.push(childNodes[j]);
						}
					}
				}
				
				if (jpager.pages.length > 1) {				
					// hide jpager pages
					// =================
					for (var j = 0; j < jpager.pages.length; j++) {
						if (jpager.currentPage != j) {
							hidePage(jpager.pages[j]);
						}
					}
					
					
					// create jpager element
					// =====================
					jpager.element = document.createElement("DIV");
					jpager.element.className = options.jpagerSelector;
								
					
					// create previous button
					// ======================
					var previousButton = document.createElement("A");
					previousButton.className = options.previousButtonSelector;
					previousButton.appendChild(document.createTextNode(options.previousButtonText));
					previousButton.href = "#";
					previousButton.inDOM = false;				
					$(previousButton).click(function() {
						if (jpager.currentPage > 0) {	
							hidePage(jpager.pages[jpager.currentPage]);
							jpager.currentPage--;
							showPage(jpager.pages[jpager.currentPage]);

							update(jpager, (jpager.currentPage + 1), jpager.currentPage);	
						}
						return false;
					});
					jpager.element.previousButton = previousButton;
					
					// create previous label
					// =====================
					var previousLabel = document.createElement("LABEL");
					previousLabel.className = options.previousLabelSelector;
					previousLabel.appendChild(document.createTextNode(options.previousLabelText));
					previousLabel.inDOM = false;
					jpager.element.previousLabel = previousLabel;
					
					
					// init previous controls
					// ======================
					if (jpager.currentPage == 0) {
						jpager.element.appendChild(previousLabel);
						previousLabel.inDOM = true;
						
					} else {
						jpager.element.appendChild(previousButton);
						previousButton.inDOM = true;
					}
					
					
					// create page buttons & labels
					// ============================
					jpager.element.pageButtons = [];
					jpager.element.pageLabels = [];
					for (var j = 0; j < jpager.pages.length; j++) {
						var pageButtonCounter = j;
						
						// create page button
						// ==================
						var pageButton = document.createElement("A");
						pageButton.className = options.pageButtonSelector;
						pageButton.title = j + 1;
						pageButton.pageNumber = j;
						pageButton.appendChild(document.createTextNode(j + 1));
						pageButton.href = "#";
						pageButton.inDOM = false;
						$(pageButton).click(function() {
							if (jpager.currentPage != this.pageNumber) {
								var oldPage = jpager.currentPage;

								hidePage(jpager.pages[jpager.currentPage]);
								jpager.currentPage = this.pageNumber;
								showPage(jpager.pages[jpager.currentPage]);

								update(jpager, oldPage, this.pageNumber);
							}				
							return false;
						});
						jpager.element.pageButtons.push(pageButton)

									
						// create page label
						// =================
						var pageLabel = document.createElement("LABEL");
						pageLabel.className = options.pageLabelSelector;
						pageLabel.appendChild(document.createTextNode(j + 1));
						pageLabel.inDOM = false;
						jpager.element.pageLabels.push(pageLabel);
						
						
						// init page controls
						// ==================
						if (jpager.currentPage == j) {
							jpager.element.appendChild(pageLabel);
							
						} else {
							jpager.element.appendChild(pageButton);
						}
					}
			
					
					// create next button
					// ==================
					var nextButton = document.createElement("A");
					nextButton.className = options.nextButtonSelector;
					nextButton.appendChild(document.createTextNode(options.nextButtonText));
					nextButton.href = "#";
					nextButton.inDOM = false;
					$(nextButton).click(function() {
						if (jpager.currentPage < (jpager.pages.length - 1)) {
							hidePage(jpager.pages[jpager.currentPage]);
							jpager.currentPage++;
							showPage(jpager.pages[jpager.currentPage]);

							update(jpager, (jpager.currentPage - 1), jpager.currentPage);						
						}
						return false;
					});
					jpager.element.nextButton = nextButton;
			
			
					// create next label
					// =================
					var nextLabel = document.createElement("LABEL");
					nextLabel.className = options.nextLabelSelector;
					nextLabel.appendChild(document.createTextNode(options.nextLabelText));
					nextLabel.inDOM = false;
					jpager.element.nextLabel = nextLabel;
			
			
					// init next controls
					// ==================								
					if (jpager.currentPage == (jpager.pages.length - 1)) {
						jpager.element.appendChild(nextLabel);
						nextLabel.inDOM = true;
						
					} else {
						jpager.element.appendChild(nextButton);
						nextButton.inDOM = true;
					}

					$(jpager.element).insertAfter(pageableContent[i]);
					
					jpagers.push(jpager);
				}
			}
		}
		
		
		// public methods
		// ==============
		this.destroy = function() {
			for (var i = 0; i < jpagers.length; i++) {
				$(jpagers[i].element).remove();
				for (var j = 0; j < jpagers[i].pages.length; j++) {
					for (var k = 0; k < jpagers[i].pages[j].elements.length; k++) {
						$(jpagers[i].pages[j].elements[k]).removeClass(options.hiddenContentSelector);
						$(jpagers[i].pages[j].elements[k]).removeClass(options.visibleContentSelector);
					}
				}				
			}			
		}
		
		this.each(function() {
			if (this != null) {
				pageableContent =  $(this).find("." + options.jpagerContentSelector);
				create(pageableContent);
			}			
		});
		
		return this;
	}
})(jQuery);
