///////////////////////////////////////////////////
//
function IsEmpty(value)
{
	val = Trim(value, 'both')
	
    return val.length == 0;
} 

///////////////////////////////////////////////////
//
function Trim(arg, func) 
{
	var trimvalue = '';
    arglen = arg.length;
    
    if(arglen < 1) 
		return trimvalue;

    if(func == 'left' || func== 'both') 
    {
		i = 0;
        pos = -1;
        
        while (i < arglen) 
        {
			if (arg.charCodeAt(i) != 32 && !isNaN(arg.charCodeAt(i))) 
			{
				pos = i;
                break;
            }
            
            i++;
        }
    }

    if (func == 'right' || func== 'both') 
    {
		var lastpos = -1;
        i = arglen;
        
        while (i >= 0) 
        {
			if (arg.charCodeAt(i) != 32 && !isNaN(arg.charCodeAt(i))) 
			{
				lastpos = i;
                break;
            }
            
            i--;
        }
    }

    if (func == 'left') 
    {
		trimvalue = arg.substring(pos, arglen - 1);
    }

    if (func == 'right') 
    {
		trimvalue = arg.substring(0, lastpos + 1);
    }
    
    if (func == 'both') 
    {
		trimvalue = arg.substring(pos, lastpos + 1);
    }

    return trimvalue;
}

////////////////////////////////////////////////////
// 
function sprintf(strFormat)
{
	// Možné stavy automatu
	var pos_Text      = 1;
	var pos_Flags     = 2;
	var pos_Width     = 3;
	var pos_Precision = 4;
	var pos_Type      = 5;
	
	// Formátovací příznaky
	var bLeftAlign;
	var bSignPrefix;
	var bZeroPrefix;
	var bBlankPrefix;
	var bNumberPrefix;
	
	var	nWidth;
	var nPrecision;
	
	// Běhové proměnné
	var NumArgs = arguments.length - 1;			// Celkový počet argumentů funkce
	var	nArg = 1;								// Argument, který se má použít příště
	var Pos = pos_Text;							// Určuje v jakém stavu se nachází automat
	var strResult = new String;					// Výsledný string
   
	// Jdu přes celý formátovací řetězec
	for(var i = 0; i < strFormat.length; i++)
	{
		var a = strFormat.charAt(i);
		
		switch(Pos)
		{
		case pos_Text:
			{
				if(a == "%")
				{
					// Posunu automat do nového stavu
					Pos = pos_Flags;
					
					// Nastavím formátovací příznaky na default
					bLeftAlign	   = false;
					bSignPrefix	   = false;
					bZeroPrefix    = false;
					bBlankPrefix   = false;
					bNumberPrefix  = false;
					
					nWidth		   = -1;
					nPrecision     = -1;
				}
				else
					strResult += strFormat.charAt(i);
					
				break;
			}
		case pos_Flags:
			{
				switch(a)
				{
				case "-":
					{
						bLeftAlign = true;
						break;
					}
				case "+":
					{
						bSignPrefix = true;
						break;
					}
				case "0":
					{
						bZeroPrefix = true;
						break;
					}
				case " ":
					{
						bBlankPrefix = true;
						break;
					}
				case "#":
					{
						bNumberPrefix = true;
						break;
					}
				case "%":
					{
						strResult += '%';
						Pos = pos_Text;
						break;
					}
				default: 
					{
						i--;
						Pos = pos_Width;
					}
				}
				
				break;
			}
		case pos_Width:
			{
				var n = parseInt(strFormat.substr(i));
			
				if(isNaN(n))
				{
					i--;
				}
				else
				{
					nWidth = n;
				
					i += n.toString().length - 1;
				}
			
				Pos = pos_Precision;
			
				break;
			}
		case pos_Precision:
			{
				if(a == ".")
				{
					var n = parseInt(strFormat.substr(++i));
			
					if(isNaN(n))
						throw("sprintf");
					
					nPrecision = n;
				
					i += n.toString().length - 1;
				}
				else
				{
					i--;
				}
			
				Pos = pos_Type;
			
				break;
			}
		case pos_Type:
			{
				var s = new String;
		
				if(nArg > NumArgs)
					throw("sprintf");	
					
				switch(a)
				{
				case "s":
					{
						s = arguments[nArg++];
					
						if(nPrecision >= 0)
							s.substr(0, nPrecision);
						
						if(nWidth >= 0)
						{
							if(bLeftAlign)
								while(s.length < nWidth)
									s = s + " ";
							else
								while(s.length < nWidth)
									s = " " + s;
						}
					
						break;
					}
				case "d":
				{
					var Number = arguments[nArg++];
					s = Math.abs(Number).toString();
					var strSignPrefix = new String;
					
					if(Number < 0)
						strSignPrefix = "-";
					else
						if(bSignPrefix)
							strSignPrefix = "+";
					
					if(bLeftAlign && bZeroPrefix)	
						throw("sprintf");
					
					if(nWidth >= 0 || nPrecision >= 0)	
					{
						var n = Math.max(nWidth, nPrecision)
						
						if(strSignPrefix.length > 0)
							n -= strSignPrefix.length;
						
						if(bLeftAlign)
						{
							while(s.length < n)
								s += " ";
						}
						else
						{
							while(s.length < n)
							{
								if(bZeroPrefix)
									s = "0" + s;
								else
									s = " " + s;
							}
						}
					}
					
					s = strSignPrefix + s;
				
					break;
				}				
				case "x":
				{
					var Number = arguments[nArg++];
					s = Math.abs(Number).toString(16);
					var strSignPrefix = new String;
					
					if(Number < 0)
						strSignPrefix = "-";
					else
						if(bSignPrefix)
							strSignPrefix = "+";
					
					if(bLeftAlign && bZeroPrefix)	
						throw("sprintf");
					
					if(nWidth >= 0 || nPrecision >= 0)	
					{
						var n = Math.max(nWidth, nPrecision)
						
						if(strSignPrefix.length > 0)
							n -= strSignPrefix.length;
						
						if(bLeftAlign)
						{
							while(s.length < n)
								s += " ";
						}
						else
						{
							while(s.length < n)
							{
								if(bZeroPrefix)
									s = "0" + s;
								else
									s = " " + s;
							}
						}
					}
					
					s = strSignPrefix + s;
				
					break;
				}
					
				default: throw("sprintf");		// Není implementováno
				}
				
				strResult += s;
				Pos = pos_Text;
			}
		}
	}
         
	return strResult;
}


