/* Pages
 Author: Dimitri Giani
 
 Copyright: 2009 Dimitri Giani
*/

PagesDefaults = {
	
	isHomePage: false,
	navigationPagesContainer: 'pages',
	defaultPage: 1,
	
	pagesClass: 'aPage',
	
	totalPages: 2,
	navigation: 'navigation',
	navigationItems: null,
	navigationItemsStep: 25,
	navigationItemsStepHome: 3,
	homeClass: 'home',
	
	mask: 'mask',
	scroller: 'scroller',
	pageWidth: 715,
	currentPage: 1,
	leftArrow: 'navigationPrev',
	rightArrow: 'navigationNext'
};

function Pages(options) {
	
	// Scope
	var obj = this;
	
	// Set Defaults
	obj.defaults = jQuery.extend(PagesDefaults, options);
	
	// Initialization
	obj.init = function() {
		// Get Total Pages
		obj.defaults.totalPages = $('div.aPage').length;
		
		// Create Navigation Items
		obj.createNavigationItems();
		
		// Init Scroller
		obj.initScroller();
		
		// Set Navigation Items
		obj.positioningPagesNavigation();
		
		// Set Default Page
		obj.setDefaultPage();
	}
	
	obj.createNavigationItems = function() {
		
		// Create Navigation Items
		for (x = 0; x < obj.defaults.totalPages; x++)
		{
			
			// Create Element
			var div = $(document.createElement('div'));
			var a = $(document.createElement('a'));
			$(a).attr('href', '#');
			$(a).attr('rel', (x+1));
			
			// Choose correct Class
			if (x == 0 && obj.defaults.isHomePage)
			{
				$(a).attr('class', 'home');
			}
			else
			{
				$(a).attr('class', 'page');
			}
			
			$('#'+obj.defaults.navigationPagesContainer).append(div);
			$(div).append(a);
		}
		
		// Set Navigation Items
		obj.defaults.navigationItems = $('#'+obj.defaults.navigationPagesContainer+' a');
	}
	
	// Positioning Pages Navigation
	obj.positioningPagesNavigation = function() {
		
		var lastElm = null;
		var pos = 0;
		
		obj.defaults.navigationItems.each(function(t, elm) {
		
			// Search for center
			pos = (obj.defaults.pageWidth-(obj.defaults.totalPages * obj.defaults.navigationItemsStep)) / 2;
		
			// Set Step
			pos += t*obj.defaults.navigationItemsStep;
			
			// Set step for the element after the Home Button
			if (lastElm != null) {
				if(lastElm.search(obj.defaults.homeClass) != -1) {
					pos += obj.defaults.navigationItemsStepHome;
				}
			}
		
			// Set Left
			$(elm).css('left', pos);
		
			// Set last Element
			lastElm = $(elm).attr('class');
		
		});
	}
	
	obj.setDefaultPage = function() {
		
		$('#'+obj.defaults.scroller).css('left', -obj.defaults.pageWidth*(obj.defaults.defaultPage-1));
		
		// Set New Default Page
		obj.defaults.currentPage = obj.defaults.defaultPage;
		
		// Highlight correct Page
		obj.selectNavigationItemsAtIndex(obj.defaults.defaultPage);
		
		// Check Arrow Navigation
		obj.checkArrows();
	}
	
	obj.initScroller = function() {
		// Set Scroller Dimension
		$('#'+obj.defaults.scroller).css('width', obj.defaults.totalPages*obj.defaults.pageWidth);
		
		// Set Actions
		obj.setNavigationActions();
		
	}
	
	obj.setNavigationActions = function() {
		
		// Unbind Event
		obj.defaults.navigationItems.unbind('click');
		$('#'+obj.defaults.leftArrow).unbind('click');
		$('#'+obj.defaults.rightArrow).unbind('click');
		
		// Bind Event
		obj.defaults.navigationItems.click(function() {
			obj.movePage($(this));
			return false;
		});
		
		$('#'+obj.defaults.leftArrow).click(function() {
			obj.movePageTo(obj.defaults.currentPage-1);
			return false;
		});
		$('#'+obj.defaults.rightArrow).click(function() {
			obj.movePageTo(obj.defaults.currentPage+1);
			return false;
		});
	}
	
	obj.resetNavigationActions = function() {
		
		// Unbind Event
		obj.defaults.navigationItems.unbind('click');
		$('#'+obj.defaults.leftArrow).unbind('click');
		$('#'+obj.defaults.rightArrow).unbind('click');
		
		// Bind Event
		obj.defaults.navigationItems.click(function() {
			return false;
		});
		
		$('#'+obj.defaults.leftArrow).click(function() {
			return false;
		});
		$('#'+obj.defaults.rightArrow).click(function() {
			return false;
		});
	}
	
	obj.deselectAllNavigationItems = function() {
		obj.defaults.navigationItems.each(function(t, elm) {
			$(elm).removeClass('selected');
			$(elm).removeClass('selectedHome');
		});
	}
	
	obj.selectNavigationItemsAtIndex = function(index) {
		// Add Selected Class
		obj.defaults.navigationItems.each(function(t, elm) {
			// Correct Page
			if (index == (t+1)) {
				if ($(elm).hasClass('home')) {
					$(elm).addClass('selectedHome');
				}
				else {
					$(elm).addClass('selected');
				}
			}
		});
	}
	
	obj.movePage = function(a) {
		
		// Get Page ID
		var page = parseInt($(a).attr('rel'));
		
		// Remove all Selected Class
		obj.deselectAllNavigationItems();
		
		// Add Selected Class
		if ($(a).hasClass('home')) { $(a).addClass('selectedHome'); }
		else { $(a).addClass('selected'); }
		
		// Change Current Page
		obj.defaults.currentPage = page;
		
		// Commit Animation
		obj.commitPageAnimation();
		
		// Check Arrow Navigation
		obj.checkArrows();
		
		// Toggle Navigation Actions
		obj.resetNavigationActions();
	}
	
	obj.movePageTo = function(page) {
		
		// Remove all Selected Class
		obj.deselectAllNavigationItems();
		
		// Add Selected Class
		obj.selectNavigationItemsAtIndex(page);
		
		// Change Current Page
		obj.defaults.currentPage = page;
		
		// Commit Animation
		obj.commitPageAnimation();
		
		// Check Arrow Navigation
		obj.checkArrows();
		
		// Toggle Navigation Actions
		obj.resetNavigationActions();
	}
	
	obj.commitPageAnimation = function() {
		
		// Page Animation
		$('#'+obj.defaults.scroller).animate({"left": -obj.defaults.pageWidth*(obj.defaults.currentPage-1)}, 700, null, function() {
			obj.setNavigationActions();
		});
		
	}
	
	obj.checkArrows = function() {
		
		// First Page
		if (obj.defaults.currentPage == 1)
		{
			$('#'+obj.defaults.leftArrow).css('display', 'none');
			$('#'+obj.defaults.rightArrow).css('display', 'block');
		}
		else if (obj.defaults.currentPage == obj.defaults.totalPages)
		{
			$('#'+obj.defaults.rightArrow).css('display', 'none');
			$('#'+obj.defaults.leftArrow).css('display', 'block');
		}
		else
		{
			$('#'+obj.defaults.rightArrow).css('display', 'block');
			$('#'+obj.defaults.leftArrow).css('display', 'block');
		}
		
	}
	
	// Start
	this.init();
}























































