(function($){
	$.fn.checkdate = function($op) {
		var _opts = $.extend({ wrong: false, error: 'Wrong date, try "YYYY-MM-DD"', dash: 0 }, $op);
    
		return this.filter('input').each(function() {
			if ($(this).data('installed'))
				return false;
    
			$(this).data('installed',true).data('valid',-1);

			var guess = function($e) {
				var _v = $e.target.value;
				if (!_v.length) return false;
				var _obj = $(this);

				var _a = _v.split('-');
				_obj.data('valid',0);

				if (_opts.wrong || _a.length != 3) {
					alert(_opts.error);
					return false;
				}

				var _dst = new Array;
				for (var $x=0; $x<3; $x++) {
					if (_a[$x] > 31) _dst[0] = _a[$x];
					else if (_a[$x] > 12 && _a[$x] <= 31) _dst[2] = _a[$x];
					else if (_a[0] && _a[2]) _dst[1] = _a[$x]
				}
				if (!_dst[0] || !_dst[1] || !_dst[2]) {
					if (_a[0] > 31) _dst = _a;
					else if (_a[2] > 31 || (_a[0] <= 12 && _a[1] <= 31)) 
						{ _dst[0] = _a[2]; _dst[1] = _a[0]; _dst[2] = _a[1] }
					else if (_a[2] > 31 || (_a[1] <= 12 && _a[0] <= 31)) 
						{ _dst[0] = _a[2]; _dst[1] = _a[1]; _dst[2] = _a[0] }
				}
				if (_dst.length == 3) {
					var _today = new Date();
					if (_dst[0] > 6 && _dst[0] < 100) _dst[0] = eval(_dst[0]) + 1900;
                
					if (_dst[0] > _today.getFullYear() || _dst[0] < 1900 || 
						_dst[1] < 1 || _dst[1] > 12 || _dst[2].length > 2 ||
						_dst[2] < 1 || _dst[2] > 31) {
						_opts.wrong = true;
						alert(_opts.error);
					} else {
						_opts.wrong = false;
						_obj.data('valid',1);
						$e.target.value 
							= _dst[0] +'-' +(_dst[1].length>1?'':'0')
							+ _dst[1] +'-' +(_dst[2].length>1?'':'0')
							+ _dst[2];
						if ($.isFunction(_opts.callback))
							_opts.callback(_v);
						return true;
					}
				}
				return true;
			};
    		
			var check = function(e) {
				var _v = e.target.value;

				if (e.which == 191)
					e.target.value = _v.replace(/[\/]/,'-');

				if (e.which >= 48 && e.which <= 57 && _v.length <= 10) {
					if (_v.length < 10)
						return true;
					else if (_v.length == 10) 
						guess(e); 
					return false;
				} else if (e.which == 189 && (_opts.dash == 2 || _v.lastIndexOf('-') == _v.length-1)) {
					return false;
				} else if (e.which == 39 || e.which == 37 || e.which == 189 || e.which == 191 
					|| e.which == 116 || e.which == 8 || e.which == 9) {
					_opts.wrong = false;
					_opts.dash 
						= ((_v.indexOf('-') == -1) 
						? 0 : ((_v.indexOf('-') == _v.lastIndexOf('-')) 
						? 1 : 2))
					if (e.which == 189 && _opts.dash == 2) return false;
					return true;
				} else if (e.which == 13) {
					guess(e);
					return false;
				}
				return false;
			};
			$(this).keydown(check).keyup(check).change(check).blur(guess);
		});
	};
})(jQuery);

