$(document).ready(function(){

	$.extend($.fn, {

		toggleExpand: function(){
			$( this )
				.toggleClass( 'Expand' )
				.toggleClass( 'Collapse' );
			return this;
		},

		makeHover: function( sClassName ){
			var sClassName = sClassName || 'Hover';
			$( this ).unbind( 'hover' ).hover(function(){
				$( this ).addClass( sClassName );
			}, function(){
				$( this ).removeClass( sClassName );
			});
			return this;
		},

		makeFocus: function( sClassName ){
			var sClassName = sClassName || 'Focus';
			$( this ).unbind( 'focus' ).focus(function(){
				$( this ).addClass( sClassName );
			});
			$( this ).unbind( 'blur' ).blur(function(){
				$( this ).removeClass( sClassName );
			});
			return this;
		},

		makeTooltip: function( sClassName ){
			var sClassName = sClassName || 'Tooltip';
			var eTooltip = $( '<div class="' + sClassName + '">' + $( this ).attr( 'title' ) + '</div>' ).appendTo( this );
			$( this ).removeAttr( 'title' ).mouseover(function(){
				$( '.' + sClassName, this ).show();
			}).mousemove(function( kmouse ){
				$( '.' + sClassName, this ).css({
					left: kmouse.pageX + 15
					, top: kmouse.pageY + 15
//					left: 15
//					, top: 15
				});
			}).mouseout(function(){
				$( '.' + sClassName, this ).hide();
			});
/*
			$( this ).removeAttr( 'title' ).mouseover(function(){
				$( '.' + sClassName, this ).css({
//				$( eTooltip ).css({
					opacity: 1
					, display: 'none'
				}).fadeIn( 10 );
			}).mousemove(function( kmouse ){
				$( '.' + sClassName, this ).css({
//				$( eTooltip ).css({
//					left: kmouse.pageX + 15
//					, top: kmouse.pageY + 15
					left: 15
					, top: 15
				});
			}).mouseout(function(){
				$( '.' + sClassName, this ).fadeOut( 10 );
//				$( eTooltip ).fadeOut( 100 );
			});
*/
		},

		disable: function(){
			if( $( this ).is( 'form' ) ){
				$( 'input, textarea, select', this ).disable();
			} else {
				$( this ).attr( 'disabled', 'disabled' );
				$( this ).addClass( 'Disabled' );
			}
			return this;
		},

		enable: function(){
			if( $( this ).is( 'form' ) ){
				$( 'input, textarea, select', this ).enable();
			} else {
				$( this ).removeAttr( 'disabled' );
				$( this ).removeClass( 'Disabled' );
			}
			return this;
		},

		check: function( bState ){
// TODO: if( typeof bState is 'number' ) $( this ).val( bState );
			if( bState == undefined ){
				return $( this ).attr( 'checked' ) ? 1 : 0;
			} else {
				if( bState > 1 || bState == true || bState == 'checked' ){
					$( this ).attr( 'checked', 'checked' );
				} else {
					$( this ).removeAttr( 'checked' );
				}
				return this;
			}
		}
/*
		checkVal: function(){
			return $( this ).attr( 'checked' ) )
		}
*/

	});

	jQuery.json = function( data, callback, beforeSend, complete ){
		var beforeSend = ( beforeSend ) ? beforeSend : null;
		var complete = ( complete ) ? complete : null;
		var oAjax = jQuery.ajax({
			data: prepare( data ),
			dataType: 'json',
			beforeSend: beforeSend,
			complete: complete,
			error: function( s,q,a ){
				alert(q);
			},
			success: callback
		});

		function prepare( _Data, sPrefix, queryText ){
			var result;
			if( sPrefix == null ) sPrefix = "";
			if( (''+typeof( _Data )).toLowerCase() == 'object' ){
				result = {}
				for( var Key in _Data ){
					var Data = _Data[Key];
					Key = this.escape( Key );
					if( Data === null ) continue;
					if( Data instanceof Function ) continue;
					if( Data instanceof Object ){
						result[ Key ] = prepare( Data )
					}
					if( Data === true ) Data = 1;
					if( Data === false ) Data = '';
					result[ Key ] = Escape( '' + Data );
				}
			} else {
				result = Escape( _Data );
			}
			return result;

			// JS escape() does not quote '+'
			function Escape( sData ) {
				return escape( sData ).replace( new RegExp('\\+','g'), '%2B' );
			}
			return _Data;
		}
	}

	jQuery.alert = function( Data, sPrefix ){
		sPrefix = sPrefix ? sPrefix : '';
		var result = '';
		for( key in Data ){
//			if( typeof Data[key] == 'object' ){
//				result += jQuery.alertObject( Data[key], sPrefix + '    ' );
//			} else {
				result += sPrefix + key + ':	' + Data[key] + '\n';
//			}
		}
		alert( result );
//		return result
	}
});
