(function($){
	
	$.fn.flippingBook = function(options) {
		
		/**
		  * Defining default parameters
		  */
		  
		var _self = this;
		
		var settings = $.extend({
				stageWidth: '100%',
				stageHeight: '100%',
				containerId: 'fbContainer',
				forwardButtonId: 'fbForwardButton',
				backButtonId: 'fbBackButton',
				zoomButtonId: 'fbZoomButton',
				printButtonId: 'fbPrintButton',
				downloadButtonId: 'fbDownloadButton',
				currentPagesId: 'fbCurrentPages',
				totalPagesId: 'fbTotalPages',
				contentsMenuId: 'fbContentsMenu',
				
				bookWidth: 640,
				bookHeight: 480,
				pagesSet: [],		
				scaleContent: true,
				preserveProportions: false,
				centerContent: true,
				hardcover: false,
				hardcoverThickness: 3,
				hardcoverEdgeColor: 0xFFFFFF,
				highlightHardcover: true,
				frameWidth: 0,
				frameColor: 0xFFFFFF,
				frameAlpha: 100,
				firstPageNumber: 1,
				autoFlipSize: 50,
				navigationFlipOffset: 30,
				flipOnClick: true,
				handOverCorner: true,
				handOverPage: true,
				alwaysOpened: false,
				staticShadowsType: "Asymmetric", // Asymmetric, Symmetric, Default
				staticShadowsDepth: 1,
				staticShadowsLightColor: 0xFFFFFF, // works for "Symmetric" shadows only
				staticShadowsDarkColor: 0x000000,
				dynamicShadowsDepth: 1,
				dynamicShadowsLightColor: 0xFFFFFF, // works for "dark" pages only
				dynamicShadowsDarkColor: 0x000000,
				moveSpeed: 2,
				closeSpeed: 3,
				gotoSpeed: 3,
				rigidPageSpeed: 5,
				flipSound: "",
				hardcoverSound: "",
				preloaderType: "Dots", // "Progress Bar", "Round", "Thin", "Dots", "Gradient Wheel", "Gear Wheel", "Line", "Animated Book", "None"
				pageBackgroundColor: 0xf9f3ba,
				loadOnDemand: true,
				allowPagesUnload: true,
				showUnderlyingPages: false,
				playOnDemand: true,
				freezeOnFlip: false,
				darkPages: false,
				smoothPages: false,
				rigidPages: false,
				flipCornerStyle: "first page only",// "first page only", "each page", "manually"
				flipCornerPosition: "bottom-right",// "bottom-right","top-right","bottom-left","top-left"
				flipCornerAmount: 50,
				flipCornerAngle: 20,
				flipCornerRelease: true,
				flipCornerVibrate: true,
				flipCornerPlaySound: false,
				zoomEnabled: true,
				zoomPath: "pages/large/",
				zoomImageWidth: 900,
				zoomImageHeight: 1165,
				zoomOnClick: true,
				zoomUIColor: 0x8f9ea6,
				zoomHint: "Double click for zooming.",
				zoomHintEnabled: true,
				centerBook: true,		
				useCustomCursors: true,
				dropShadowEnabled: true,
				dropShadowHideWhenFlipping: true,
				backgroundColor: '',	// 0xFFFFFF
				backgroundImage: '',	// path to image
				backgroundImagePlacement: "fit", //  "top left", "center", "fit"
				printEnabled: true,
				printTitle: "Print Pages",
				downloadURL: "",
				downloadTitle: "Download PDF",
				downloadSize: "Size: xx Mb",
				downloadComplete: "Complete",
				extXML: "",
				flipSound: "sounds/02.mp3"

		},options);
		
		var container = '';

		this.create = function() {
			$.swfobject.embedSWF("FlippingBook.swf", settings.containerId, settings.stageWidth, settings.stageHeight, "8.0.0", "js/expressInstall.swf", settings, {allowScriptAccess: "always", wmode: 'transparent' });
			container = document.getElementById(settings.containerId);
		};
		
		$('#' + settings.forwardButtonId).unbind().css({'cursor': 'pointer'}).bind('click', function() {
			container.flipForward();
		});
	
		$('#' + settings.backButtonId).unbind().css({'cursor': 'pointer'}).bind('click', function() {
			container.flipBack();
		});
	
		$('#' + settings.zoomButtonId).unbind().css({'cursor': 'pointer'}).bind('click', function() {
			if (container.isZoomedIn())
				container.zoomOut();
			else 
				container.zoomIn();
		});
	
		$('#' + settings.printButtonId).unbind().css({'cursor': 'pointer'}).bind('click', function() {
			container.print();
		});
	
		$('#' + settings.downloadButtonId).unbind().css({'cursor': 'pointer'}).bind('click', function() {
			container.dowloadFile();
		});
		
		this.onPutPage = function( leftPageNumber, rightPageNumber ){
			_updatePagination( leftPageNumber, rightPageNumber );
			_updateContentsMenu( leftPageNumber, rightPageNumber );
		};
	
		this.updatePagination = function( leftPageNumber, rightPageNumber ){
			var leftPageExists = ( leftPageNumber != undefined );
			var rightPageExists = ( rightPageNumber != undefined );
					
			var pageNumberString = leftPageNumber + "-" + rightPageNumber;
			if( !leftPageExists )
				pageNumberString = rightPageNumber;	
			if( !rightPageExists )
				pageNumberString = leftPageNumber;
		
			$('#' + settings.currentPagesId).html(pageNumberString);
			$('#' + settings.totalPagesId).html(" / " + container.totalPages());
		};
		
		this.buildContentsMenu = function() {
			var contentsSelect = $('#' + settings.contentsMenuId);
			if (typeof(contentsSelect) != 'undefined') {
				$.each(settings.contents, function() {
					$('<option value="' + this[1] + '">' + this[0] + '</option>').appendTo('#' + settings.contentsMenuId);
				});
				
				contentsSelect.change(function() { _self.onContentsChange() });
			}
		};
		
		this.onContentsChange = function(){
			var contentsSelect = $('#' + settings.contentsMenuId );
			var pageNumber = contentsSelect.children('option:selected').val();
			
			if( pageNumber )
				container.flipGotoPage( pageNumber );
		};
		
		this.updateContentsMenu = function( leftPageNumber, rightPageNumber ){
			var contentsSelect = $('#' + settings.contentsMenuId );
		
			if( typeof(contentsSelect) != 'undefined' ){
				for( var i = 0; i < settings.contents.length - 1; i++ ){
					var minPage = contentsSelect.children('option:nth-child(' + i + ')').val();
					var maxPage = contentsSelect.children('option:nth-child(' + (i+1) + ')').val();
					var leftOK = false;
					var rightOK = false;
					
					if( leftPageNumber )
						leftOK = ( Number( leftPageNumber ) >=  minPage && Number( leftPageNumber ) <= maxPage );
					else
						leftOK = true;
		
					if( rightPageNumber )
						rightOK = ( Number( rightPageNumber ) >=  minPage && Number( rightPageNumber ) <= maxPage );
					else
						rightOK = true;
						
					if( leftOK && rightOK )	
						break;
				}	
				contentsSelect.children('option:nth-child(' + i + ')').attr('selected', true);
			}
		};
		
		this.create();
		
		return this;
		
	};	
})(jQuery);
