(function($){
	$.fn.pageSlide = function(options) {

		var settings = $.extend({
				width:        "300px", // Accepts fixed widths
				duration:     "normal", // Accepts standard jQuery effects speeds (i.e. fast, normal or milliseconds)
				direction:    "left", // default direction is left.
				bodywrapper:	"pageslide-body-wrap",
				start:        function(){},
				stop:         function(){},
				loaded:       function(){},
				onOpen:       function(){ return false; },
				modal:        false, // if true, the only way to close the pageslide is to define an explicit close class.
				_identifier: $(this)
		}, options);

		// these are the minimum css requirements for the pageslide elements introduced in this plugin.

		var pageslide_slide_wrap_css = {
			position: 'fixed',
			width: '0',
			top: '0',
			height: '100%',
			zIndex:'500'

		};

		var pageslide_body_wrap_css = {
			position: 'relative',
			zIndex: '0'
		};

		var pageslide_blanket_css = {
			position: 'absolute',
			top: '0px',
			left: '0px',
			height: '100%',
			width: '100%',
			opacity: '0.0',
			backgroundColor: 'black',
			zIndex: '1',
			display: 'none'
		};

		function _initialize(anchor) {

			// Create and prepare elements for pageSlide
			if ($("#"+settings.bodywrapper).size() == 0) {
				var psBodyWrap = document.createElement("div");
				$(psBodyWrap).css(pageslide_body_wrap_css);
				$(psBodyWrap).attr("id",settings.bodywrapper).width( $("body").width() );
				$("body").contents().wrapAll( psBodyWrap );

			} else {
				var psBodyWrap = $("#"+settings.bodywrapper);
				$(psBodyWrap).css(pageslide_body_wrap_css);
				$(psBodyWrap).attr("id",settings.bodywrapper).width( $("body").width() );

			}

			if ($("#pageslide-content, #pageslide-slide-wrap").size() == 0) {
				var psSlideContent = document.createElement("div");
				$(psSlideContent).attr("id","pageslide-content").width( settings.width );

				var psSlideWrap = document.createElement("div");
				$(psSlideWrap).css(pageslide_slide_wrap_css);
				$(psSlideWrap).attr("id","pageslide-slide-wrap").append( psSlideContent );
				$("body").append( psSlideWrap );

			}

			// introduce the blanket if modal option is set to true.
			if ($("#pageslide-blanket").size() == 0 && settings.modal == true) {
				var psSlideBlanket = document.createElement("div");
				$(psSlideBlanket).css(pageslide_blanket_css);
				$(psSlideBlanket).attr("id","pageslide-blanket");
				$("body").append( psSlideBlanket );
				$("#pageslide-blanket").click(function(){ return false; });
			}

			// Callback events for window resizing
			$(window).resize(function(){
				$("#"+settings.bodywrapper).width( $("body").width() );
			});

			// mark the anchor!
			$(anchor).attr("rel","pageslide");

		};

		function _openSlide(elm) {
			if($("#pageslide-slide-wrap").width() != 0) {
				/*
				$("#pageslide-slide-wrap").animate({width: 0}, settings.duration);
				direction = ($("#pageslide-slide-wrap").css("left") != "0px") ? {left: "0"} : {right: "0"};
				$("#"+settings.bodywrapper).animate(direction, settings.duration, function(){
					_openSlide(elm);
				});
				*/
				settings.start(elm);
				$.ajax({
						type: "GET",
						url: $(elm).attr("href"),
						success: function(data){
							$("#pageslide-content").css("width",settings.width).html(data)
								.queue(function(){
									$(this).dequeue();

									// add hook for a close button
									$(this).find('.pageslide-close').unbind('click').click(function(elm){
										_closeSlide(elm);
										$(this).find('pageslide-close').unbind('click');
									});

									settings.loaded();


								});
								if (settings.callback) {
									settings.callback();

								}
						}
					});

			} else {
				settings.start(elm);
				_showBlanket();
				// decide on a direction
				if (settings.direction == "right") {
					direction = {right:"-"+settings.width};
					$("#pageslide-slide-wrap").css({left:0});
					_overflowFixAdd();
				}
				else {
					direction = {left:"-"+settings.width};
					$("#pageslide-slide-wrap").css({right:0});
				}

				var doLoad = function() {
					settings.stop();
					$.ajax({
							type: "GET",
							url: $(elm).attr("href"),
							success: function(data){
								$("#pageslide-content").css("width",settings.width).html(data)
									.queue(function(){
										$(this).dequeue();

										// add hook for a close button
										$(this).find('.pageslide-close').unbind('click').click(function(elm){
											_closeSlide(elm);
											$(this).find('pageslide-close').unbind('click');
										});

										settings.loaded();


									});
									if (settings.callback) {
										settings.callback();

									}
							}
						});
				};

				if ($.browser.msie) {
					$("#pageslide-slide-wrap").css({'width': settings.width});
					$("#"+settings.bodywrapper).css(direction);
					doLoad();
				} else {
					$("#pageslide-slide-wrap").animate({width: settings.width}, settings.duration);
					$("#"+settings.bodywrapper).animate(direction, settings.duration, doLoad);
				}
			}
		};

		function _closeSlide(event) {
			if ($(event)[0].button != 2 && $("#pageslide-slide-wrap").css('width') != "0px") { // if not right click.
				$.fn.pageSlideClose(settings);
			}
		};

		// this is used to activate the modal blanket, if the modal setting is defined as true.
		function _showBlanket() {
			if(settings.modal == true) {
				$("#pageslide-blanket").toggle().animate({opacity:'0.8'}, 'fast','linear');
			}
		};

		// fixes an annoying horizontal scrollbar.
		function _overflowFixAdd(){($.browser.msie) ? $("body, html").css({overflowX:'hidden'}) : $("body").css({overflowX:'hidden'});}

		// Initalize pageslide, if it hasn't already been done.
		_initialize(this);
		return this.each(function(){
			$(this).unbind("click").bind("click", function(){
				_openSlide(this);
				$("#pageslide-slide-wrap").unbind('click').click(function(e){ if(e.target.tagName != "A") return false; });
				if (settings.modal != true) {
					$(document).unbind('click').click(function(e) { if(e.target.tagName != "A"){ _closeSlide(e); return false } });
				}
				return false;
			});
		});

	};
})(jQuery);

// pageSlideClose allows the system to automatically close any pageslide that is currently open in the view.
(function($){
	$.fn.pageSlideClose = function(options) {
		var settings = $.extend({
				width:          "300px", // Accepts fixed widths
				duration:       "normal", // Accepts standard jQuery effects speeds (i.e. fast, normal or milliseconds)
				direction:      "left", // default direction is left.
				modal:          false, // if true, the only way to close the pageslide is to define an explicit close class.
				onClosed:				function(){},
				_identifier: $(this)
		}, options);

		function _hideBlanket() { if(settings.modal == true && $("#pageslide-blanket").is(":visible")) {
			$("#pageslide-blanket").animate({opacity:'0.0'}, 'fast','linear',function(){$(this).hide();});
		}}

		function _overflowFixRemove(){($.browser.msie) ? $("body, html").css({overflowX:''}) : $("body").css({overflowX:''});}

		_hideBlanket();

		var doOnClose = function() {
			$("#pageslide-content").css("width","0px").empty();
			$('#'+settings.bodywrapper+', #pageslide-slide-wrap').css('left','');
			$('#'+settings.bodywrapper+', #pageslide-slide-wrap').css('right','');
			_overflowFixRemove();

			settings.onClosed();

		};

		direction = ($("#pageslide-slide-wrap").css("left") != "0px") ? {left: "0"} : {right: "0"};
		if ($.browser.msie) {
			$("#"+settings.bodywrapper).css(direction);
			$("#pageslide-slide-wrap").css({width: "0"});
			doOnClose();
		} else {
			$("#"+settings.bodywrapper).animate(direction, settings.duration);
			$("#pageslide-slide-wrap").animate({width: "0"}, settings.duration, doOnClose);
		}

	}
})(jQuery);

// this adds the ability to close pageSlide with the 'escape' key, if not modal.
(function($){
	$(document).ready(function(){
		$(document).keyup(function(event){
			if (!$("#pageslide-blanket").is(":visible") && event.keyCode == 27) $.fn.pageSlideClose();
		});
	});
})(jQuery);

