	(function($) {
		
		$.alerts = {
			
			verticalOffset: -75,
			horizontalOffset: 0,
			repositionOnResize: true,
			overlayOpacity: .01,
			overlayColor: '#FFF',
			draggable: true,
			okButton: '&nbsp;&nbsp;OK&nbsp;&nbsp;',
			cancelButton: '&nbsp;Cancel&nbsp;',
			dialogClass: null,
			
			// Public methods
			
			alert: function(message, title, callback) {
				if($.browser.msie && parseInt($.browser.version) <= 6)
					hideSelectBoxes();
				if( title == null ) title = 'Alert';
				$.alerts._show(title, message, null, 'alert', function(result) {
					if( callback ) callback(result);
				});
			},
			
			confirm: function(message, title, callback) {
				if( title == null ) title = 'Confirm';
				$.alerts._show(title, message, null, 'confirm', function(result) {
					if( callback ) callback(result);
				});
			},
				
			prompt: function(message, value, title, callback) {
				if( title == null ) title = 'Prompt';
				$.alerts._show(title, message, value, 'prompt', function(result) {
					if( callback ) callback(result);
				});
			},
			
			// Private methods
			
			_show: function(title, msg, value, type, callback) {
				
				$.alerts._hide();
				$.alerts._overlay('show');
				
				$("BODY").append(
				  '<div id="popup_container">' +
					'<div id="popup_title"></div>' +
					'<div id="popup_content">' +
					  '<div id="popup_message"></div>' +
					'</div>' +
				  '</div>');
				
				if( $.alerts.dialogClass ) $("#popup_container").addClass($.alerts.dialogClass);
				
				// IE6 Fix
				var pos = ($.browser.msie && parseInt($.browser.version) <= 6 ) ? 'absolute' : 'fixed'; 
				
				$("#popup_container").css({
					position: pos,
					zIndex: 99999,
					padding: 0,
					margin: 0
				});
				
				$("#popup_title").text(title);
				$("#popup_content").addClass(type);
				$("#popup_message").text(msg);
				$("#popup_message").html( $("#popup_message").text().replace(/\n/g, '<br />') );
				
				$("#popup_container").css({
					minWidth: $("#popup_container").outerWidth(),
					maxWidth: $("#popup_container").outerWidth()
				});
				
				$.alerts._reposition();
				$.alerts._maintainPosition(true);
				
				switch( type ) {
					case 'alert':
						$("#popup_message").after('<div id="popup_panel"><input type="button" value="' + $.alerts.okButton + '" id="popup_ok" /></div>');
						$("#popup_ok").click( function() {
							$.alerts._hide();
							if($.browser.msie && parseInt($.browser.version) <= 6)
								displaySelectBoxes();
							callback(true);
						});
						$("#popup_ok").focus().keypress( function(e) {
							if( e.keyCode == 13 || e.keyCode == 27 ) $("#popup_ok").trigger('click');
						});
					break;
					case 'confirm':
						$("#popup_message").after('<div id="popup_panel"><input type="button" value="' + $.alerts.okButton + '" id="popup_ok" /> <input type="button" value="' + $.alerts.cancelButton + '" id="popup_cancel" /></div>');
						$("#popup_ok").click( function() {
							$.alerts._hide();
							if( callback ) callback(true);
						});
						$("#popup_cancel").click( function() {
							$.alerts._hide();
							if( callback ) callback(false);
						});
						$("#popup_ok").focus();
						$("#popup_ok, #popup_cancel").keypress( function(e) {
							if( e.keyCode == 13 ) $("#popup_ok").trigger('click');
							if( e.keyCode == 27 ) $("#popup_cancel").trigger('click');
						});
					break;
					case 'prompt':
						$("#popup_message").append('<br /><input type="text" size="30" id="popup_prompt" />').after('<div id="popup_panel"><input type="button" value="' + $.alerts.okButton + '" id="popup_ok" /> <input type="button" value="' + $.alerts.cancelButton + '" id="popup_cancel" /></div>');
						$("#popup_prompt").width( $("#popup_message").width() );
						$("#popup_ok").click( function() {
							var val = $("#popup_prompt").val();
							$.alerts._hide();
							if( callback ) callback( val );
						});
						$("#popup_cancel").click( function() {
							$.alerts._hide();
							if( callback ) callback( null );
						});
						$("#popup_prompt, #popup_ok, #popup_cancel").keypress( function(e) {
							if( e.keyCode == 13 ) $("#popup_ok").trigger('click');
							if( e.keyCode == 27 ) $("#popup_cancel").trigger('click');
						});
						if( value ) $("#popup_prompt").val(value);
						$("#popup_prompt").focus().select();
					break;
				}
				
				// Make draggable
				if( $.alerts.draggable ) {
					try {
						$("#popup_container").draggable({ handle: $("#popup_title") });
						$("#popup_title").css({ cursor: 'move' });
					} catch(e) { /* requires jQuery UI draggables */ }
				}
			},
			
			_hide: function() {
				$("#popup_container").remove();
				$.alerts._overlay('hide');
				$.alerts._maintainPosition(false);
			},
			
			_overlay: function(status) {
				switch( status ) {
					case 'show':
						$.alerts._overlay('hide');
						$("BODY").append('<div id="popup_overlay"></div>');
						$("#popup_overlay").css({
							position: 'absolute',
							zIndex: 99998,
							top: '0px',
							left: '0px',
							width: '100%',
							height: $(document).height(),
							background: $.alerts.overlayColor,
							opacity: $.alerts.overlayOpacity
						});
					break;
					case 'hide':
						$("#popup_overlay").remove();
					break;
				}
			},
			
			_reposition: function() {
				var top = (($(window).height() / 2) - ($("#popup_container").outerHeight() / 2)) + $.alerts.verticalOffset;
				var left = (($(window).width() / 2) - ($("#popup_container").outerWidth() / 2)) + $.alerts.horizontalOffset;
				if( top < 0 ) top = 0;
				if( left < 0 ) left = 0;
				
				// IE6 fix
				if( $.browser.msie && parseInt($.browser.version) <= 6 ) top = top + $(window).scrollTop();
				
				$("#popup_container").css({
					top: top + 'px',
					left: left + 'px'
				});
				$("#popup_overlay").height( $(document).height() );
			},
			
			_maintainPosition: function(status) {
				if( $.alerts.repositionOnResize ) {
					switch(status) {
						case true:
							$(window).bind('resize', function() {
								$.alerts._reposition();
							});
						break;
						case false:
							$(window).unbind('resize');
						break;
					}
				}
			}
			
		}
		
		// Shortuct functions
		jAlert = function(message, title, callback) {
			$.alerts.alert(message, title, callback);
		}
		
		jConfirm = function(message, title, callback) {
			$.alerts.confirm(message, title, callback);
		};
			
		jPrompt = function(message, value, title, callback) {
			$.alerts.prompt(message, value, title, callback);
		};
		
		function hideSelectBoxes() {
			var x = document.getElementsByTagName("SELECT");
			for (i=0;x && i < x.length; i++) {
				x[i].style.visibility = "hidden";
			}
		}

		function displaySelectBoxes() {
			var x = document.getElementsByTagName("SELECT");
			for (i=0;x && i < x.length; i++){
				x[i].style.visibility = "visible";
			}
		}


		
	})(jQuery);
/*  
  formatNumber2: Formats a number with the indicated number of minimum digits following 
  the decimal point by adding extra 0's. Rounds off digits that exceed the 
  maxDigitsAfterDecimal parameter. If maxDigitsAfterDecimal==-1, then the function does 
  not round off any digits. 
*/ 
function formatNumber2(expression, minDigitsAfterDecimal, maxDigitsAfterDecimal) 
{ 
  var sReturn; 
  var vReturn; 
  var vValue; 
  var sPadding = ''; 
  var sSign = ''; 
  if(expression.toString().length==0) 
  { 
   vValue = 0; 
  } else if(!(isNaN(expression))) { 
   if(expression < 0) 
     sSign = '-'; 
   vValue = Math.abs(expression); 
  } else { 
   vValue = 0; 
  } 
  vReturn = vValue.toString().split('.'); 
  if(minDigitsAfterDecimal > 0) 
  { 
   for(i=0; i<minDigitsAfterDecimal; i++) 
     sPadding += '0'; 
   if(vReturn.length==1) 
   { 
     vReturn[1] = sPadding; 
   } else if(vReturn[1].length < minDigitsAfterDecimal) { 
     vReturn[1] = (vReturn[1] + sPadding).substr(0, minDigitsAfterDecimal); 
   } else { 
     if((vReturn[1].length > maxDigitsAfterDecimal) && (maxDigitsAfterDecimal!= -1)) 
     { 
      vReturn[1] = (Math.round(parsefloat(vReturn[1].substr(0,maxDigitsAfterDecimal+1))/10)).toString(); 
      //if the first digit(s) after the decimal point was a 0, it will have been lost in 
      //the above conversion. This while loop adds back any such 0 characters. 
      while(vReturn[1].length<maxDigitsAfterDecimal) 
        vReturn[1]='0'+vReturn[1]; 
      if(vReturn[1].length > maxDigitsAfterDecimal) 
      { 
        vReturn[0] = (parseInt(vReturn[0]) + 1).toString(); 
        vReturn[1] = sPadding; 
      } 
     } 
   } 
   if((vValue < 1) && (vValue!= 0) && (vReturn[0]!= '0')) 
     sReturn = '0' + vReturn[0] + '.' + vReturn[1]; 
   else 
     sReturn = vReturn[0] + '.' + vReturn[1]; 
  } else { 
   if(vReturn.length == 1) 
   { 
     if((vValue < 1) && (vValue!= 0)) 
     { 
      sReturn = '0' + (vReturn[0]); 
     } else { 
      sReturn = (vReturn[0]); 
     } 
   } else { 
     if((vReturn[1].length > maxDigitsAfterDecimal) && (maxDigitsAfterDecimal!= -1)) 
      vReturn[1] = (Math.round(parsefloat(vReturn[1].substr(0,maxDigitsAfterDecimal+1))/10)).toString(); 
     if((vValue < 1) && (vValue!= 0)) 
      sReturn = '0' + vReturn[0] + '.' + vReturn[1]; 
     else 
      sReturn = vReturn[0] + '.' + vReturn[1]; 
   } 
  } 
  return sSign + sReturn; 
} 
