$(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;
		},

		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;
			}
		}

	});

	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
	}
});
