jQuery.each(["Left","Right","Top","Bottom"], function(i, name){
	jQuery.fn["padding" + name] = function(){
		return parseInt(this.css("padding" + name))||0;
	};
	jQuery.fn["border" + name + "Width"] = function(){
		return parseInt(this.css("border" + name + "Width"))||0;
	};
	jQuery.fn["margin" + name] = function(margin) {
		return parseInt(this.css("margin" + name))||0;
	};
});
jQuery.each(["Height","Width"], function(i, name){
	var tl = i ? "Left":"Top",br = i ?"Right":"Bottom";
	jQuery.fn["layout" + name] = function(options) {
		var setting = $.extend({
			id       : null,
			body     : null,
			padding  : null,
			data     : [],
			callback : null
		},options);
		$.fn.num = function(){
			var _marg = [];
				_marg.push(parseInt(this.css("margin" + tl))||0);
				_marg.push(parseInt(this.css("margin" + br))||0);
				_marg.push(parseInt(this.css("padding" + tl))||0);
				_marg.push(parseInt(this.css("padding" + br))||0);
				_marg.push(parseInt(this.css("border" + tl + "Width"))||0);
				_marg.push(parseInt(this.css("border" + br + "Width"))||0);
			return eval(_marg.join("+"));
		};
		$.fn.border = function(){
			var _border = [];
			_border.push(parseInt(this.css("border" + tl + "Width"))||0);
			_border.push(parseInt(this.css("border" + br + "Width"))||0);
			return eval(_border.join("+"));
		}
		$.fn.getSize = function(){
			var _data = [];
			this.each(function(i){
				_data.push(eval('$(this).outer'+name+'(true)'));
			});
			return _data;
		};
		$.fn.setSize = function(value,data,idx){
			this.each(function(i){
				var _obj = $(this);
				var _num = _obj.num();
				if(i==idx)return;
				try{
					var n = data[i];
					if(n.id&&i==n.index){
						var _item = $(n.id);
						_num += _item.border()+eval(_item.getSize().join('+'))+_item.parent().num();
					}else if(i==n.index){
						_num += n.height;
					}
					var n = data[idx];
					if(n.id&&idx==n.index){
						var _item = $(n.id);
						_num -= _item.border()+eval(_item.getSize().join('+'))+_item.parent().num();
					}else if(idx==n.index){
						_num -= n.height;
					}
				}catch(e){}
			//	var _min = $.browser.msie&&$.browser.version=='6.0'?name.toLowerCase():"min"+name;
				var _min = "min"+name;
				_obj.css(_min,value-_num);
			});
		};
		if(this.size()>0){
			var _ret = this.getSize();
			if(setting.body){
				var win  = [];
				$('#container>div:not(#body)').each(function(){
					win.push($(this).outerHeight({margin:true}));
				});
				$('#container>#body').each(function(){
					win.push($(this).outerHeight({margin:true})-$(this).height());
				});
				$('#container').each(function(){
					win.push($(this).outerHeight({margin:true})-$(this).height());
				});
				$('#container').nextAll().each(function(){
					win.push($(this).outerHeight({margin:true}));
				});
				_ret.push($(window).height()-eval(win.join('+')));
			}
			var _max = Math.max.apply(Math,_ret);
			var _re = new RegExp(","+_max+",","i");
			var idx = ((","+_ret.toString()+",").replace(_re,"|").replace(/[^,|]/g,"")).indexOf("|");
			this.setSize(_max,setting.data,idx);
			if($.isFunction(setting.callback)) setting.callback.apply(this,[_max]);
		}
	};
});
$.fn.layout = function(options){
	var setting = $.extend({
		id       : null,
		minHeight: 550,
		maxHeight: 650,
		data     : null
	},options);
	var size = {
		height : Math.min(Math.max(document.documentElement.clientHeight,setting.minHeight),setting.maxHeight)
	};
	if(setting.id){
		var w = setting.data?eval(setting.data.join('+')):0;
		$(setting.id).height(size.height+w);
	}
	this.css(size);
};
