/*
 * Author:	Lam (PHP+JS+CSS)
 * Date:	2009.08.26
 * Email:	gzkakaxi@qq.com, liancanwei@gmail.com, lam@mixmedia.com
 * Extend:	jQuery
 * Copyright(c)2009 Lam(liancanwei)
 *
_________________________________________

HTML Code:
	form:
		It must to use "<table>" to set the "<form>" elements
		<input tips="xxx" />
	poper:
		<div class="tips-poper" id="tips" style="display:none;">
			<div class="tips-poper-wrap">
				<div class="tips-poper-content"></div>
			</div>
		</div>
_________________________________________

Javacript Code:
		$(Element).tips().validate({name: rule});
_________________________________________

*/

jQuery.fn.extend({
	tips: function(tipsId, fadeSpeed){
		this.each(function(){				   
			var tips;
			var speed = 0;
			var objs = $(this).find('[tips]');
			
			if(tipsId){
				tips = $('#' + tipsId);
			}else{
				tips = $('#tips');
			}
			if(fadeSpeed){
				speed = fadeSpeed;
			}

			objs.each(function(){
				var text = null, offset;
				
				$(this)
				.focus(function(){
					text = $(this).attr('tips');
					offset = $(this).parent('td').next('td').offset();
					tips.css({
						'left': offset.left,
						'top': offset.top
					})
					.show(speed)
					.find('.tips-poper-content').html(text);
				})
				.blur(function(){
					tips.css({
						'display': 'none'
					});
				});
			});
		});
		return this;
	},
	
	validate: function(param, validateClass) {
		this.each(function(){
			var $this = $(this); // 获取表单对象
			var objs = $this.find(':text, :password, :checkbox, :radio, :file, select');
			var i = 0, length, number;
			
			if(!param) return;
			if(!validateClass) validateClass = 'validate';
			
			// 获取param长度
			length = formValidate();
			
			// 表单提交
			$this.submit(function(){
				formValidate('submit');
				number = $this.find('[isValidate=true]').length;
				
				// 验证未通过, 禁止提交
				if(number == 0 || number != length) return false;
				
			});
			
			// 表单重置
			$this.find('[type=reset]').click(function(){
				var validate = $this.find('.' + validateClass);
				validate.attr('class', 'validate').html('');
				objs.removeAttr('isValidate');
			});
			
			function formValidate(type){
				$.each(param, function(name, rule){
					var obj = $this.find('[name=' + name + ']');
					var isValidate = obj.attr('isValidate');
					var validate = obj.parent('td').next('td').children('.' + validateClass);
					
					if(type == 'submit'){
						formCheck(rule, obj, validate, isValidate);
					}else{
						obj
						.blur(function(){
							formCheck(rule, obj, validate, isValidate);
						})
						.change(function(){
							formCheck(rule, obj, validate, isValidate);
						})
						.keyup(function(){
							formCheck(rule, obj, validate, isValidate);
						});
						i++;
					}
				});
				return i;
			}
			
			function formCheck(rule, obj, validate, isValidate){
				// 如果已验证通过, 跳过程序
				if(isValidate == 'true') return;
				
				// 执行验证
				var rs = rule(obj[0], validate[0]);
				if(rs){
					validate.removeClass('validate-false').addClass('validate-true').html('');
					obj.attr('isValidate', 'true');
				}else{
					validate.removeClass('validate-true').addClass('validate-false');
					obj.attr('isValidate', 'false');
				}
			}
			
		});
		return this;
	},
	
	dialog: function(content, isHover){
		this.each(function(){
			var $this = $(this);
			var $window = $(window);
			var cssLeft, cssTop;
			var mask;

			if(isHover == false){
				isHover = false;
			}else{
				isHover = true;	// 默认有覆盖层
			}
			
			// 判断是否IE6
			var isIE6 = false;
			if($.browser.msie){
				if(parseInt($.browser.version) < 7){
					isIE6 = true;	// for css hack
				}
			}
			
			
				
			// 插入蒙版层
			if(isHover){
				if(isIE6){
					mask = $('<div style="position:absolute;left:0;top:0;z-index:1000;width:100%;height:' + $(document).height() + 'px;background:#666;filter:alpha(opacity=50);opacity:0.5"></div>');
				}else{
					mask = $('<div style="position:fixed;left:0;top:0;z-index:1000;width:100%;height:100%;background:#666;filter:alpha(opacity=50);opacity:0.5"></div>');
				}
				mask.insertBefore($this);
			}
			
			if(isIE6){
				$this.css('position', 'absolute');
				$select = $('select').css('visibility', 'hidden');
			}
			
			// 写入内容
			if(content) $this.find('.dialog-body').html(content);
			cssLeft = ($window.width() - $this.width()) / 2;
			cssTop = ($window.height() - $this.height()) / 2.5;
			if(isIE6) cssTop += $window.scrollTop();
			
			// 弹出dialog
			$this.css({
				left: cssLeft,
				top: cssTop
			}).show(200);

			// 关闭dialog
			var buttonClose = $this.find('[name=close]').click(function(){
				if(isHover) mask.remove();	// 移除蒙版层
				$this.hide(200);
				if(isIE6) setTimeout(function(){$select.css('visibility', '')}, 100);
			});
			
			//Esc键关闭
			$(document).keydown(function(e){
				if(e.keyCode == 27){
					buttonClose.click();
				}
			});
			
			//双击关闭
			$this.dblclick(function(){buttonClose.click();});
		});
		return this;
	}
});