/*------------------------------------------------------------------------------
	jq_plugins.js
	require:jQuery
------------------------------------------------------------------------------*/



/*------------------------------------------------------------------------------
	fixedElement	2010.05.22
------------------------------------------------------------------------------*/
(function($) {
var plugin_name = 'fixedElement';

$.fn[ plugin_name ] = function( options ) {
	if ( options ) {
		if ( $.browser.msie && $.browser.version < 7 ) {
			var ele = this[0];
			if ( options.position == 'fixed' || ( !options.position && this.style.position == 'fixed' ) ) {
				$('html').css({
					'background-image':'url(null)',
					'background-attachment':'fixed',
					'width':'100%',
					'height':'100%'
				});
				
				ele.style.setExpression(
					'top',
					'eval(' + ( options.top || 0 ) + '+(document.body.scrollTop||document.documentElement.scrollTop))'
				);
				ele.style.setExpression(
					'left',
					'eval(' + ( options.left || 0 ) + '+(document.body.scrollLeft||document.documentElement.scrollLeft))'
				);
				options.position = 'absolute';
			} else if ( options.position && options.position != 'fixed' ) {
				ele.style.removeExpression('top');
				ele.style.removeExpression('left');
			}
		}
		this.css( options );
	}
	return this;
};
})(jQuery);



/*------------------------------------------------------------------------------
	fixedMenuBar	2010.05.25
	require:fixedElement
------------------------------------------------------------------------------*/
(function($) {
var plugin_name = 'fixedMenuBar';

var default_options = {
	fix:false,			//	画面に固定させるか解除するか
	toggle:true,		//	状態をトグルする
	return_status:false	//	現在状態を返すかjQueryオブジェクトを返すか
};
var status = false;
var dummy = $('<div id="dummyOfFixedMenuBar" style="margin:0;border-width:0"/>');

$.fn[ plugin_name ] = function( options ) {
	options = $.extend( {}, default_options, options );
	var f = options.fix || ( options.toggle && !status ) || false;
	if ( !!status != !!f ) {
		this.fixedElement({
			'position':f ? 'fixed' : 'static'
		});
		if (f) {
			this.after(
				dummy.css({
					'height':this.outerHeight({ margin: true })
				})
			);
		} else {
			dummy.remove();
		}
		status = !!f;
	}
	return options.return_status ? status : this;
};
})(jQuery);



/*------------------------------------------------------------------------------
	tabPanel、shrinkList共用
------------------------------------------------------------------------------*/
(function($) {

var over = function(f) {
	var _dt = $( this );
	if ( !_dt.hasClass('disabled') && ( f || !_dt.hasClass('selected') ) ) {
		_dt.addClass('overed').css({
			cursor:'pointer'
		});
	}
};
var out = function() {
	$( this ).removeClass('overed').css({
		cursor:'default'
	});
};


/*------------------------------------------------------------------------------
	tabPanel	2010.05.28
				2010.06.24	オプション「end」追加
------------------------------------------------------------------------------*/
var tabPanel = {
	plugin_name:'tabPanel',
	default_options:{
		tab_align:	'left',
		select:		':first',
		end:		undefined
	}
};

$.fn[ tabPanel.plugin_name ] = function( options ) {
	options = $.extend( {}, tabPanel.default_options, options );
	if ( !options.tab_align.match(/^(left|right)$/i) ) { options.tab_align = 'left'; }
	
	return this.each( function() {
		if ( this.tagName.match(/dl/i) ) {
			var _body = $('<div class="tab_panel_body" style="clear:'+options.tab_align+';"/>');
			var _last_dd;
			
			var dl = this;
			var _dl = $( this ).addClass('tab_panel');
			var _dds = _dl.children('dd').hide();
			var _dts = _dl.children('dt').css({
				float:	options.tab_align,
				cursor:	'default'
			}).each( function() {
				var _dt = $( this );
				var _dd = this._tabPanelDD = _dt.next();
				if ( !_dd.size() || !_dd[0].tagName.match(/dd/i) || _dd[0].childNodes.length == 0 ) {
					_dt.addClass('disabled');
				}
			}).click( function() {
				var _dt = $( this );
				var _dd = this._tabPanelDD;
				if ( !dl._tabPanelActive && _dd && !_dt.hasClass('selected') && !_dt.hasClass('disabled') ) {
					dl._tabPanelActive = true;
					_dts.not( _dt.addClass('selected') ).removeClass('selected');
					var anime = function() {
						_body.animate({
							height:_dd.height()
						}, 'fast', undefined, function() {
							_last_dd = _dd.fadeIn( 'fast', function() {
								dl._tabPanelActive = false;
								if ( options.end ) { options.end.apply( _dd[0] ); }
							});
						});
					};
					_last_dd ? _last_dd.fadeOut( 'fast', anime ) : anime();
				}
			}).mouseover( over ).mouseout( out );
			
			_dl.append( _body.append( _dds ) );
			_dts.filter( options.select ).click();
		}
	});
};


/*------------------------------------------------------------------------------
	shrinkList	2010.05.28
------------------------------------------------------------------------------*/
var shrinkList = {
	plugin_name:'shrinkList',
	default_options:{
		select:':first',
		auto_shrink:true
	}
};

$.fn[ shrinkList.plugin_name ] = function( options ) {
	options = $.extend( {}, shrinkList.default_options, options );
	
	return this.each( function() {
		if ( this.tagName.match(/dl/i) ) {
			var _last_dd;
			
			var dl = this;
			var _dl = $( this ).addClass('shrinkList');
			var _dds = _dl.children('dd').hide();
			var _dts = _dl.children('dt').each( function() {
				var	_dt = $( this );
				var dd = _dt.next()[0];
				if ( !dd || !dd.tagName.match(/dd/i) || dd.childNodes.length == 0 ) {
					_dt.addClass('disabled');
				}
			}).css({
				cursor:		'default'
			}).click( function() {
				var _dt = $( this );
				var _dd = _dt.next();
				if ( !dl._shrinkListActive && !_dt.hasClass('disabled') ) {
					dl._shrinkListActive = true;
					var finish = function() {
						_dts.not( _dt.addClass('selected') ).removeClass('selected');
						_last_dd = _dd;
						dl._shrinkListActive = false;
					};
					if ( _dd.filter(':hidden').size() ) {
						var anime = function() {
							_dd.slideDown( 'fast', finish );
						};
						if ( options.auto_shrink ) {
							( _last_dd && _last_dd.size() ) ? _last_dd.slideUp( 'fast', anime ) : anime();
						} else {
							anime();
						}
					} else {
						_dd.slideUp( 'fast', finish );
					}
				}
			}).mouseover( function() { over.call( this, true ); } ).mouseout( out );
			
			_dts.filter( options.select ).click();
		}
	});
	return this;
};

})(jQuery);



/*------------------------------------------------------------------------------
	incButton	2010.05.20
------------------------------------------------------------------------------*/
(function($) {
var plugin_name	= 'incButton';

var default_options	= {
	left_inc:	1,
	right_inc:	10,
	max:		99,
	min:		0,
	wait:		500,
	speed:		30,
	target:		undefined,
	setter:		undefined
};

var do_func_or_org = function(o) { return ( typeof o == 'function' ) ? o() : o; };

$.fn[ plugin_name ] = function( options ) {
	options = $.extend( {}, default_options, options );
	
	return this.each( function() {
		if ( this.tagName.match(/button/i) ) {
			var	_ele = $( this );
			//2011.05.26
			//var	_tar = $( options.target );
			var	_tar = ( typeof options.target === 'string' ) ? $( options.target ) : options.target;
			var f_input = _tar[0].tagName.match(/^input$/i);
				
			var timer;
			var now_n;
			var now_max;
			var now_min;
			var inc;
				
			var _get_num = function() {
				var num = f_input ? _tar.val() : _tar.text();
				return isNaN( num ) ? do_func_or_org( options.min ) : num - 0;
			};
			var _set_num = function() {
				//2011.05.28
				//var v = ( typeof now_n == 'number' && ( now_n != parseInt( now_n, 10 ) ) )
				//			? now_n.toFixed(2)
				//			: now_n
				//		|| do_func_or_org( options.min );
				var v = ( typeof now_n === 'number' )
							? ( now_n != parseInt( now_n, 10 ) )
								? now_n.toFixed(2)
								: now_n
							: do_func_or_org( options.min );
				f_input ? _tar.val(v) : _tar.text(v);
			};
			var _pm_func = function(t) {
				now_n += inc;
				if ( now_n > now_max ) { now_n = now_max; }
				if ( now_n < now_min ) { now_n = now_min; }
				_set_num();
				if ( now_n < now_max || now_n > now_min ) {
					timer = setTimeout( _pm_func, t || options.speed );
				} else {
					if ( typeof options.setter == 'function' ) { options.setter( now_n ) };
				}
			};
			var _md_func = function(e) {
				now_max = do_func_or_org( options.max );
				now_min = do_func_or_org( options.min );
				now_n = _get_num();
				if ( isNaN( now_n ) ) { now_n = now_min; }
				inc = ( e.button == 2 ) ? options.right_inc : options.left_inc;
				_pm_func( options.wait );
				return false;
			};
			var _mu_func = function(e) {
				if ( timer ) {
					clearTimeout( timer );
					timer = undefined;
					_set_num();
					if ( typeof options.setter == 'function' ) { options.setter( now_n ) };
				}
			};
				
			this.oncontextmenu = function() { return false; };
			_ele.mousedown( _md_func ).mouseup( _mu_func ).mouseout( _mu_func );
		}
	});
};
})(jQuery);
