(function($) {

	var window = this, undefined;

	window.jsx ? jsx = window.jsx : jsx = window.jsx = {};

	

	$.extend({

		transition: {

			hideandshow: function(curFrame, newFrame, container) {

				if (curFrame) {

					curFrame.hide(500);

				}

				if (newFrame) {

					newFrame.jquery_show(500);

				}

			},

			slideleft: function(curFrame, newFrame, container) {

				var left = 0;

				if (container) {

					left = container.width();

				}

				if (curFrame) {

					curFrame.animate({left: -left}, {

						duration: 800,

						finish: function() {

							curFrame.css('display', 'none');

						}

					});

				}

				if (newFrame) {

					newFrame.css('left', left).css('display', '');

					newFrame.animate({left: 0}, 800);

				}

			},

			crossfade: function(curFrame, newFrame, container) {

				if (curFrame) {

					curFrame.fadeOut(500);

				}

				if (newFrame) {

					newFrame.fadeIn(500);

				}

			},

			slideleftfadeout: function(curFrame, newFrame, container) {

				var left = 0;

				if (container) {

					left = container.width();

				}

				if (curFrame) {

					curFrame.css('opacity', 1);

					curFrame.animate({left: -left, opacity: 0}, {

						duration: 800,

						finish: function() {

							curFrame.css('display', 'none');

						}

					});

				}

				if (newFrame) {

					newFrame.css('opacity', '');

					newFrame.css('left', left).css('display', '');

					newFrame.animate({left: 0}, 800);

				}

			}

		}

	});

	

	$.fn.initTransition = function(options) {

		var self = dynamicFrames = this, undefined, firstFrame;

		$.extend(self, {

			defaultTransition: $.transition.hideandshow,

			frameList: [],

			container: null,

			currentFrame: null

		});

		if (options.container) {

			self.container = $(options.container);

		}

		if (options.transition) {

			self.defaultTransition = options.transition;

		}

		

		this.each(function(i) {

			var self = $(this);

			self.extend({

				jquery_show: self.show,

				show: function() {

					dynamicFrames.defaultTransition(dynamicFrames.currentFrame, this, dynamicFrames.container);

					dynamicFrames.currentFrame = this;

					return false;

				},

				index: i

			});

			if (self.attr('id')) {

				self.css('display', 'none');

				dynamicFrames.frameList[self.attr('id')] = self;

				dynamicFrames.frameList.push(self);

			}

		});

		

		if (options && options.enableHistory) {

			$(window).hashchange(function() {

				var hash = ""+location.hash;

				var newFrame = dynamicFrames.frameList[hash.replace(/^.*#/, '')];

				if (!newFrame && dynamicFrames.frameList.length) {

					newFrame = dynamicFrames.frameList[0];

				}

				if (newFrame) {

					dynamicFrames.defaultTransition(dynamicFrames.currentFrame, newFrame, dynamicFrames.container);

					dynamicFrames.currentFrame = newFrame;

				}

			});

			

			firstFrame = dynamicFrames.frameList[location.hash.replace(/^.*#/, '')];

			if (!firstFrame && dynamicFrames.frameList.length) {

				firstFrame = dynamicFrames.frameList[0];

			}

			if (firstFrame) {

				firstFrame.show();

			}

		} else if (dynamicFrames.frameList.length) {

			dynamicFrames.frameList[0].show();

		}

		

		return self;

	};

})(jQuery);