$( function() {
	/*
	var float = new Floatings("floating");						//---------- 创建对象：参数为浮动对象的id
	float.SetMode(0);											//---------- 浮动模式：参数 "0"为上下浮动，"1"为全页面浮动，"2"为嵌套在对象内部上下浮动。
	float.Position( { "top" : "200px" , "left" : "0px" } );		//---------- 对象位置：只有当模式为"0"或"1"时有效，格式如事例，属性名可以为"top"距离顶部距离、"left"距离左侧距离、"bottom"距离底部距离、"right"距离右侧距离，其中 "top"和"bottom" 或者 "left"和"right" 同时出现则以后出现的属性为准。
	float.Time = 500;											//---------- 浮动时间：仅当模式为"0"或"2"时有效，为发生浮动到浮动结束的时间长度，单位为"毫秒"。
	float.Step = 100;											//---------- 浮动步长：仅当模式为"1"时有效，为浮动每秒移动的距离，单位为"像素"。
	float.StartTop = 50;										//---------- 开始浮动：仅当模式为"2"时有效，当容器对象的顶部距离浏览器顶部距离为这个属性的值时，对象开始浮动。
	float.Start();												//---------- 浮动开始：自动开始浮动。
	*/
} );

function Floatings(id) {
	this.Obj = $("#" + id);
	//this.Name = "浮动类";
	//this.Author = "Keboy";
	//this.Version = "v1.0";
	//this.CreateDate = "2010-1-11";
	this.Top = new Object();
	this.Left = new Object();
}
Floatings.prototype = {
	Test: 0,
	Mode: 0,	//---------- 属性：浮动模式
	Time: 0,	//---------- 属性：浮动时间
	Step: 0,	//---------- 属性：浮动步长
	Floatable: true,	//---------- 属性：可否浮动
	SetPositionable: true,	//---------- 属性：可否设置初始化位置
	Ctrl: true,	//---------- 属性：可否控制浮动暂停
	Toward: new Array(),	//---------- 数组：随机浮动方向
	D: function() {	//---------- 方法：返回兼容多浏览器的网页整体对象
		if ( $.browser.safari ) {
			return $(document.body);
		}
		else {
			return $(document.documentElement);
		}
	},
	SetMode: function(mode) {	//---------- 方法：设置模式
		this.Mode = mode;
		if ( mode == 0 || mode == 1 ) {
			this.Obj.css( { "position" : "absolute" , "z-index" : "9999" } );
		}
		else if ( mode == 2 ) {
			this.SetPositionable = false;
		}
		else {
			this.Floatable = false;
		}
	},
	Position: function(objs) {	//---------- 方法：初始化位置的赋值函数
		if ( this.Floatable && this.SetPositionable ) {
			for ( var obj in objs ) {
				if ( obj == "top" || obj == "bottom" ) {
					this.Top.Name = obj;
					this.Top.Value = objs[obj];
				}
				else if ( obj == "left" || obj == "right" ) {
					this.Left.Name = obj;
					this.Left.Value = objs[obj];
				}
			}
			this.Obj.css("top",this.GetTopPositon()).css("left",this.GetLeftPositon());
		}
	},
	GetTopPositon: function() {	//---------- 方法：返回浮动对象距离顶部距离
		if ( this.Top.Name == "top" ) {
			return this.Top.Value;
		}
		else if ( this.Top.Name == "bottom" ) {
			return parseFloat($(document.documentElement).get(0).clientHeight) - parseFloat(this.Top.Value) - this.Obj.get(0).offsetHeight + "px";
		}
	},
	GetLeftPositon: function() {	//---------- 方法：返回浮动对象距离左侧距离
		if ( this.Left.Name == "left" ) {
			return this.Left.Value;
		}
		else if ( this.Left.Name == "right" ) {
			return parseFloat($(document.documentElement).get(0).clientWidth) - parseFloat(this.Left.Value) - this.Obj.get(0).offsetWidth + "px";
		}
	},
	Start: function() {	//---------- 方法：开始浮动，根据模式调用不同的浮动方法
		switch(this.Mode) {
			case 0:
				this.UpDownFloat();
				break;
			case 1:
				this.RandomFloat();
				break;
			case 2:
				this.InnerFloat();
				break;
		}
	},
	UpDownFloat: function() {	//---------- 方法：上下浮动
		var _this = this;
		$(window).scroll( function() {
			var StayTop = parseFloat(_this.D().get(0).scrollTop) + parseFloat(_this.GetTopPositon());
			var StayLeft = parseFloat(_this.D().get(0).scrollLeft) + parseFloat(_this.GetLeftPositon());
			_this.Obj.stop().animate( { "top" : StayTop + "px" , "left" : StayLeft + "px" } , { queue: false, duration: _this.Time } );
		} ).resize( function() {
			var StayTop = parseFloat(_this.D().get(0).scrollTop) + parseFloat(_this.GetTopPositon());
			var StayLeft = parseFloat(_this.D().get(0).scrollLeft) + parseFloat(_this.GetLeftPositon());
			_this.Obj.stop().animate( { "top" : StayTop + "px" , "left" : StayLeft + "px" } , { queue: false, duration: _this.Time } );
		} );
	},
	RandomFloat: function() {	//---------- 方法：全页面浮动
		for ( var i = 0; i < 4; i++ ) {
			this.Toward[i] = false;
		}
		switch(true) {
			case this.Top.Name == "top" && this.Left.Name == "left":
				this.Toward[0] = true;
				break;
			case this.Top.Name == "top" && this.Left.Name == "right":
				this.Toward[1] = true;
				break;
			case this.Top.Name == "bottom" && this.Left.Name == "right":
				this.Toward[2] = true;
				break;
			case this.Top.Name == "bottom" && this.Left.Name == "left":
				this.Toward[3] = true;
				break;
		}
		var _this = this;
		var Playing = setInterval(PlayingBox,1000/this.Step);
		if ( this.Ctrl ) {
			this.Obj.mouseover( function() {
				clearInterval(Playing);
			} ).mouseout( function() {
				Playing = setInterval(PlayingBox,1000/_this.Step);
			} );
		}
		function PlayingBox() {
			var StartTop = parseFloat(_this.Obj.css("top")) , StartLeft = parseFloat(_this.Obj.css("left"));
			checkNext(StartTop,StartLeft);
			switch(true) {
				case _this.Toward[0]:
					StartTop++;
					StartLeft++;
					break;
				case _this.Toward[1]:
					StartTop++;
					StartLeft--;
					break;
				case _this.Toward[2]:
					StartTop--;
					StartLeft--;
					break;
				case _this.Toward[3]:
					StartTop--;
					StartLeft++;
					break;
			}
			_this.Obj.css( { "top" : StartTop + "px" , "left" : StartLeft + "px" } );
		}
		function checkNext(top,left) {
			switch(true) {
				case _this.Toward[0]:
					if ( left + 1 + _this.Obj.get(0).offsetWidth > $(document.documentElement).get(0).clientWidth + _this.D().get(0).scrollLeft ) {
						_this.Toward[0] = false;
						_this.Toward[1] = true;
						checkNext(top,left);
					}
					else if ( top + 1 + _this.Obj.get(0).offsetHeight > $(document.documentElement).get(0).clientHeight + _this.D().get(0).scrollTop ) {
						_this.Toward[0] = false;
						_this.Toward[3] = true;
						checkNext(top,left);
					}
					break;
				case _this.Toward[1]:
					if ( left - 1 < _this.D().get(0).scrollLeft ) {
						_this.Toward[1] = false;
						_this.Toward[0] = true;
						checkNext(top,left);
					}
					else if ( top + 1 + _this.Obj.get(0).offsetHeight > $(document.documentElement).get(0).clientHeight + _this.D().get(0).scrollTop ) {
						_this.Toward[1] = false;
						_this.Toward[2] = true;
						checkNext(top,left);
					}
					break;
				case _this.Toward[2]:
					if ( left - 1 < _this.D().get(0).scrollLeft ) {
						_this.Toward[2] = false;
						_this.Toward[3] = true;
						checkNext(top,left);
					}
					else if ( top - 1 < _this.D().get(0).scrollTop ) {
						_this.Toward[2] = false;
						_this.Toward[1] = true;
						checkNext(top,left);
					}
					break;
				case _this.Toward[3]:
					if ( left + 1 + _this.Obj.get(0).offsetWidth > $(document.documentElement).get(0).clientWidth + _this.D().get(0).scrollLeft ) {
						_this.Toward[3] = false;
						_this.Toward[2] = true;
						checkNext(top,left);
					}
					else if ( top - 1 < _this.D().get(0).scrollTop ) {
						_this.Toward[3] = false;
						_this.Toward[0] = true;
						checkNext(top,left);
					}
					break;
			}
		}
	},
	InnerFloat: function() {	//---------- 方法：嵌套在对象内部上下浮动
		var _this = this;
		$(window).scroll( function() {
			var StayTop = parseFloat(_this.D().get(0).scrollTop) - parseFloat(_this.StartTop);
			var Staying = _this.Obj.parent().get(0).offsetHeight - parseFloat(_this.Obj.parent().css("paddingTop")) - parseFloat(_this.Obj.parent().css("paddingBottom")) - _this.Obj.get(0).offsetHeight;
			var newPos = ( ( ( StayTop < Staying ) ? StayTop : Staying ) > 0 ) ? ( ( StayTop < Staying ) ? StayTop : Staying ) : 0
			_this.Obj.stop().animate( { "marginTop" : newPos + "px" } , { queue: false, duration: _this.Time } );
		} ).resize( function() {
			var StayTop = parseFloat(_this.D().get(0).scrollTop) - parseFloat(_this.StartTop);
			var Staying = _this.Obj.parent().get(0).offsetHeight - parseFloat(_this.Obj.parent().css("paddingTop")) - parseFloat(_this.Obj.parent().css("paddingBottom")) - _this.Obj.get(0).offsetHeight;
			var newPos = ( ( ( StayTop < Staying ) ? StayTop : Staying ) > 0 ) ? ( ( StayTop < Staying ) ? StayTop : Staying ) : 0
			_this.Obj.stop().animate( { "marginTop" : newPos + "px" } , { queue: false, duration: _this.Time } );
		} );
	}
};
