var YzUtil=
{
	newGuid : function()
	{
		var g='';for(var i=1;i<=32;i++){g+=Math.floor(Math.random()*16.0).toString(16);}
		return g.substr(0,8);
	},
	rand : function(n)
	{
		if(typeof n=='undefined')n=1000;
		return Math.ceil(Math.random()*n);
	},
	collectGarbage : function()
	{
		if(typeof CollectGarbage=="function")
			CollectGarbage(); 
	},
	delay : function(fn,paramArr,thisObject,milliseconds)
	{
		if(typeof fn=="function")
		{
			if(typeof milliseconds=="undefined")milliseconds=0;
			//var win=arguments[4] || window;
			window.setTimeout(function(){
				if(paramArr)
					//fn.apply(thisObject || win,[].concat(paramArr));
					fn.apply(thisObject,[].concat(paramArr));
				else
					//fn.apply(thisObject || win);	
					fn.apply(thisObject);
				},
				milliseconds
			);
		}
	},
	formatDataSize : function(s)
	{
		var r=parseFloat(s),u="B";
		if(s>1024*1024)
		{
			r=s/(1024*1024);
			u="M";
		}
		else if(s>1024)
		{
			r=s/1024;
			u="KB";
		}
		return r.toFixed(2)+u;
	},
	formatTime : function(t)
	{
		var h=parseInt(t/3600);
		var m=parseInt((t-h*3600)/60);
		var s=t-h*3600-m*60;
		var r=h>0 ? h+" hour" : "";
			r+=m>0 ? m+" minute" : "";
			r+=s.toFixed(0)+" second";
		return r;
	},
	cancelEvent : function(e){if(e)e.preventDefault();return false;},
	preventDefault : function(e)
	{
		if(!e)
		{
			window.event.returnValue = false;
			return false;
		}
		if(e.preventDefault)e.preventDefault();
		e.cancelBubble=true;
		e.returnValue=false;
		return false;	
	},
	createXmlObject : function(type)
	{
		//type: required, 'XmlHttp' || 'DOMDocument'
		//xmlStr: optional, the DOMDocument initialize XML
		switch(type)
		{
			case 'XmlHttp' :
				return Yz.isIE ? new ActiveXObject("MSXML2.XmlHttp") : new XMLHttpRequest();
	
			case 'DOMDocument' :
				if(Yz.isIE==false)
				{
					// Originaly, we were had the following here:
					// return document.implementation.createDocument( '', '', null ) ;
					// But that doesn't work if we're running under domain relaxation mode, so we need a workaround.
					// See http://ajaxian.com/archives/xml-messages-with-cross-domain-json about the trick we're using.
					var doc =(new DOMParser()).parseFromString(xmlStr || "<tmp></tmp>", "text/xml");
						if(!xmlStr)
							doc.firstChild.parentNode.removeChild(doc.firstChild);
						return doc;
				}
				var doc=new ActiveXObject("MSXML2.DOMDocument");
					if(xmlStr)doc.loadXML(xmlStr);
				return doc;
			break;	
		}
		return null ;
	},
	sendHttpRequest : function(url,method,data,xmlHttp,retType)
	{
		if(method=="" || !method)method="get";
		
		if(!xmlHttp)xmlHttp=Yz.util.createXmlObject("XmlHttp");
		xmlHttp.open(method,url,false);
		if(method.toLowerCase()=="post")
			xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
		xmlHttp.send(data);
		try
		{
			return retType=="1" ? xmlHttp.responseBody : xmlHttp.responseText;
		}
		finally{xmlHttp=null;}
	},
	sendHttpRequestAsync : function(url,data,callback)
	{
		var xmlHttp=Yz.util.createXmlObject("XmlHttp");
		xmlHttp.onreadystatechange=function(){callback(xmlHttp);};
		xmlHttp.open(data ? "post" : "get",url,true);
		if(data)xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); 
		xmlHttp.send(data);
	},
	addEventListener : function( sourceObject, eventName, listener )
	{
		if(window.attachEvent)
			sourceObject.attachEvent('on'+eventName,listener);
		else
			sourceObject.addEventListener(eventName,listener,false) ;

	},
	removeEventListener : function( sourceObject, eventName, listener )
	{
		if(window.detachEvent)
	 		sourceObject.detachEvent( 'on' + eventName, listener ) ;
	 	else
	 		sourceObject.removeEventListener( eventName, listener,false) ;	
	},
	addEventListenerEx : function( sourceObject, eventName, listener, paramsArray )
	{
		if(Yz.isIE==false)
		{
			sourceObject.addEventListener(eventName,
				function(e){listener.apply(sourceObject,[e].concat(paramsArray||[]));},
				false) ;

			return;
		}
		
		// Ok... this is a closures party, but is the only way to make it clean of memory leaks.
		var o = new Object() ;
		o.Source = sourceObject ;
		o.Params = paramsArray || [] ;	// Memory leak if we have DOM objects here.
		o.Listener = function( ev )
		{
			return listener.apply( o.Source, [ ev ].concat( o.Params ) ) ;
		}
	
		if (Yz.cleanup)
			Yz.cleanup.add( null, function() { o.Source = null ; o.Params = null ; } ) ;
	
		sourceObject.attachEvent( 'on' + eventName, o.Listener ) ;
	
		sourceObject = null ;	// Memory leak cleaner (because of the above closure).
		paramsArray = null ;	// Memory leak cleaner (because of the above closure).
	},
	
	createEventListener : function( func, params )
	{
		var f = function()
		{
			var aAllParams = [] ;
			for ( var i = 0 ; i < arguments.length ; i++ )
				aAllParams.push( arguments[i] ) ;
			func.apply(this, aAllParams.concat( params ) ) ;
		}
		return f ;
	},
	
	getRelativePath : function(win)
	{
		if(!win)win=window;
		var s="/"+win.location.href.replace(/http:\/\/.*?\//,'');
		s=s.substr(0,s.lastIndexOf("/"));
		if(s.endsWidth("/")==false)s+="/";
		return s;
	},
	
	scaleImageEx : function(scale,w,h,maxWidth,maxHeight,imgElt)
	{
		if(w==0)w=Math.floor(scale*h);
		if(h==0)h=Math.floor(w/scale);
		if(w>maxWidth)
		{
			w=maxWidth; h=Math.floor(w/scale);
		}
		if(h>maxHeight)
		{
			h=maxHeight; w=Math.floor(scale*h);
		}
		if(imgElt)
		{
			imgElt.height=h;
			imgElt.width=w;
		}
		return {Width : w, Height : h};
	},
	
	scaleImage : function(origWidth,origHeight,maxWidth,maxHeight,imageElt)
	{
		var w=origWidth,h=origHeight,maxW=maxWidth,maxH=maxHeight;
		var scale=w/h;
				
		if(w>maxW || h>maxH)
		{
			if(w>maxW)
			{
				w=maxW; h=Math.floor(w/scale);
			}
			
			if(h>maxH)
			{
				h=maxH; w=Math.floor(scale*h);
			}
		}
		
		if(imageElt)
		{
			imageElt.height=h;
			imageElt.width=w;
		}
		return {width : w, height : h};
	},
	
	htmlEncode : function(s)
	{
		if(!s)return "";
		return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
	},
	
	importStyleSheet : function(doc,cssFile,bIsSync)
	{
		if(typeof Yz!="undefined" && Yz.config && Yz.config.skin)
		{
			cssFile=Yz.config.skin+"Css/"+cssFile;
		}
		
		var cssId=cssFile.replace(/(\/)|(\.)/g,"_"); 
			if(doc.getElementById(cssId))return;
		
		if(!bIsSync)	
		{
			var link = doc.createElement("LINK");
				link.rel	= 'stylesheet' ;
				link.type	= 'text/css' ;
				link.href	= cssFile ;
				link.id		= cssId;
			doc.getElementsByTagName("HEAD")[0].appendChild(link);
			return;
		}
		
		var cssFilePath=cssFile.split("/"); 
			cssFilePath=cssFilePath.slice(0,cssFilePath.length-1).join("/");
			
		var cssText=Yz.util.sendHttpRequest(cssFile);
			cssText=Yz.util.fixCssTextUrl(cssFilePath,cssText);
		var tmpDiv=doc.createElement("DIV");
			tmpDiv.innerHTML="&nbsp;<style id='"+cssId+"' type='text/css'>"+cssText+"</style>";
			doc.getElementsByTagName("HEAD")[0].appendChild(tmpDiv.childNodes[1]);
			tmpDiv.innerHTML="";
			cssText=null;
	},
		
	addRemoveClass : function(elt,cls)
	{
		if(!elt)return;
		
		var s=elt.className.trim();
			s=s.replace(/([^\s]+)(\s?)/g,'"$1":"$1",');
			s="o={"+s.substr(0,s.length-1)+"};";
		var o=null; eval(s);
		var a=cls.split(" "),c;
			while(c=a.pop())
			{
				if(c.indexOf("-")==0)
					o[c.substr(1)]=null;
				else
					o[c]=c;
			}
		var ac="";	
			for(var p in o){if(o[p])ac+=o[p]+" ";}
			elt.className=ac.trim();
	},
	
	removeNode__ : function(node)
	{
		if(!node)return;
		var doc=this.getElementDocument(node);
	    var garbageBin = doc.getElementById('IELeakGarbageBin');
    	if(!garbageBin)
    	{
			garbageBin = doc.createElement('DIV');
			garbageBin.id = 'IELeakGarbageBin';
			garbageBin.style.display = 'none';
			doc.body.appendChild(garbageBin);
		}

	    // move the element to the garbage bin
	    garbageBin.appendChild(node);
	    garbageBin.innerHTML = '';
	},
	removeNode : function(node)
	{
		//注意在IE下删除节点的时候，一定要保证该节点没有任何子节点的情况下
		//使用removeNode方法删除，否则会产生孤立节点无法回收而产生内存泄露
		//即使是节点没有任何的javascript引用也是如此
		if(!node)return;
		if(node.tagName=="BODY" || node.TagName=="HTML")return;
		if(Yz.isIE)
		{
			if(node.tagName!="IFRAME" && node.tagName!="TABLE" && node.tagName!="TR")
				node.innerHTML="";
			node.removeNode();
		}
		else
		{
			node.parentNode.removeChild(node);
		}
		node=null;
	},
	
	purge : function(d) 
	{
    	var a = d.attributes, i, l, n;
    	if (a) 
    	{
        	l = a.length;
        	for (i = 0; i < l; i += 1) 
        	{
            	n = a[i].name;
            	if (typeof d[n] === 'function') 
            	{
                	d[n] = null;
            	}
        	}
    	}
    	a = d.childNodes;
    	if (a) 
    	{
        	l = a.length;
        	for (i = 0; i < l; i += 1) 
        	{
            	Yz.util.purge(d.childNodes[i]);
        	}
    	}
	},
	
	getElementAscensor : function(element,ascensorTagNames)
	{
		var e = element ;
		var lstTags = "," + ascensorTagNames.toUpperCase() + "," ;
		
		while ( e )
		{
			//if ( lstTags.indexOf( "," + e.nodeName.toUpperCase() + "," ) != -1 )
			if ( lstTags.indexOf( "," + e.nodeName.toUpperCase() + "," ) != -1 )
				return e ;
	
			e = e.parentNode ;
		}
		return null ;
	},
	disableSelection : function(elt)
	{
		if(Yz.isIE==false){elt.style.MozUserSelect='none';return;}
		var e,i=0;elt.unselectable="on";  
		while((e=elt.all[i++]))
		{
			if(e.tagName.isIn(["IFRAME","TEXTAREA","INPUT","SELECT"]))continue;
			e.unselectable="on";
		}
	},
	disableContextmenu : function(doc,disableSelect)
	{
		if(!doc)doc=window.document;
		doc.oncontextmenu=Yz.util.cancelEvent;
		if(disableSelect)doc.onselectstart=Yz.util.cancelEvent;
	},
	getElementDocument : function(elt){return elt.ownerDocument || elt.document;},
	getElementWindow : function(elt){return this.getDocumentWindow(this.getElementDocument(elt));},
	getDocumentWindow : function(doc){return doc.parentWindow || doc.defaultView;},
	getParentWindow : function(doc){return doc.contentWindow ? doc.contentWindow : doc.parentWindow;},
	getViewPaneSize : function( win )
	{
		//if(!Yz.isIE)
		//	return { Width : win.innerWidth, Height : win.innerHeight } ;

		var oSizeSource ;
	
		var oDoc = win.document.documentElement ;
		if ( oDoc && oDoc.clientWidth )				// IE6 Strict Mode
			oSizeSource = oDoc ;
		else
			oSizeSource = win.document.body ;		// Other IEs
	
		if ( oSizeSource )
			return { Width : oSizeSource.clientWidth, Height : oSizeSource.clientHeight } ;
		else
			return { Width : 0, Height : 0 } ;
	},
	getElementPosition : function(el,relativeWindow)
	{
		var c = { X:0, Y:0 } ;
		var relWin=relativeWindow || window;
		var ownerWin=this.getElementWindow(el);
		while(el)
		{
			c.X += el.offsetLeft; c.Y += el.offsetTop;
			if(Yz.isOpera==false)
			{
				if(el.className=="YzDialog_innerBorder" || el.className=="YzDialog_outerBorder")
				{
					c.X++; c.Y++;
				}	
			}
			
			if(Yz.isIE)
			{
				if(el.currentStyle.styleFloat=="left")
				{
					var bw=parseInt(el.currentStyle.borderLeftWidth);
					if(isNaN(bw))bw=0;
					c.X+=bw;
				}
				//if(el.tagName=="TD")
				//{
				//	c.X+=(el.offsetWidth-el.clientWidth)/2;
				//	c.Y+=(el.offsetHeight-el.clientHeight)/2;
				//}
			}
			
			if(el.offsetParent)
			{
				el=el.offsetParent;
			}
			else
			{
				if(relWin!=ownerWin)
				{
					if (el=ownerWin.frameElement)
						ownerWin=this.getElementWindow(el) ;
				}
				else
				{
					break;
				}
			}
		}
		return c;
	},
	getElementPositionOLD : function(el,relativeWindow)
	{
		if(Yz.isIE)return this.getElementPositionIE(el,relativeWindow);
		
		var c = { X:0, Y:0 } ;
		var oWindow = relativeWindow || window ;
		var oOwnerWindow = this.getElementWindow( el ) ;
		
		while(el)
		{
			//if(el.tagName!="BODY")
			//{
				c.X += el.offsetLeft - el.scrollLeft;
				c.Y += el.offsetTop - el.scrollTop;
			//}
			
			if ( el.offsetParent )
			{
				//-----------------------------------------------------
				var op=el.offsetParent,ptn = op.tagName.toLowerCase(); 
				if(Yz.isIE==false)
				{
					var borderWidth=parseInt(op.offsetWidth-op.clientWidth)/2; 
					if(isNaN(borderWidth))borderWidth=0;
					if(ptn!="table" && ptn!="body" && ptn!="html")
					{c.X+=borderWidth; c.Y+=borderWidth;}
				}
								
				if(Yz.isIE)
				{
					if (ptn!="table" && ptn!="body" && ptn!="html" &&
						op.clientTop && op.clientLeft) 
					{ 
						c.X += op.clientLeft; 
						c.Y += op.clientTop; 
					}
				}
				//-----------------------------------------------------
				
				el = el.offsetParent ;
			}
			else
			{
				if ( oOwnerWindow != oWindow )
				{
					if (el=oOwnerWindow.frameElement)
						oOwnerWindow = this.getElementWindow(el) ;
				}
				else
				{
					//if(el.tagName!="BODY")
					//{
						c.X += el.scrollLeft;
						c.Y += el.scrollTop;
					//}
					break ;
				}
			}
		}
		return c ;
	},
	getScrollPosition : function(relativeWindow)
	{
		if(Yz.isIE==false)return {X : relativeWindow.pageXOffset, Y : relativeWindow.pageYOffset};
		var doc = relativeWindow.document;
		var pos = {X : doc.documentElement.scrollLeft, Y : doc.documentElement.scrollTop};
		if (pos.X>0 || pos.Y>0) return pos ;
		return {X : doc.body.scrollLeft, Y : doc.body.scrollTop};
	},
	getCurrentElementStyle : function(elt,propName)
	{
		return Yz.isIE ? elt.currentStyle[propName] : elt.ownerDocument.defaultView.getComputedStyle(elt,'').getPropertyValue(propName);
	},
	cloneObject : function( sourceObject )
	{
		var fCloneCreator = function() {} ;
		fCloneCreator.prototype = sourceObject ;
		return new fCloneCreator ;
	},
	fixCssTextUrl : function(cssFilePath,cssText)
	{
		cssFilePath=cssFilePath.trim();
		if(cssFilePath.lastIndexOf("/")==cssFilePath.length-1)
			cssFilePath=cssFilePath.substr(0,cssFilePath.length-1);
		
		var re=/url\s*\(([\s'"]*)(.*?)([\s"']*)\)/gi;
		var urls=cssText.match(re);
			if(urls.length==0)return cssText;
		
		var reUrl=/(url\s*\()(([\s'"]*)(.*?)([\s"']*))(\))/gi;
		var reDd=/\.\.\//gi;
			for(var i=0;i<urls.length;i++)
			{
				var url=urls[i].replace(reUrl,"$4");
				var p=cssFilePath.split("/");
				var	a=url.match(reDd);
					url=p.splice(0,p.length-a.length).join("/")+"/"+url.replace(reDd,"");
					cssText=cssText.replace(reUrl,"$1"+url+"$6");
			}
			return cssText;
	},
	
	createBogusBR : function( targetDocument )
	{
		var eBR = targetDocument.createElement('br');
		eBR.setAttribute( 'type', '_moz' ) ;
		return eBR ;
	},

	appendBogusBr : function( element )
	{
		if(!element)return;
	
		var arr=element.getElementsByTagName('br');
		var eLastChild = arr.length>0 ? arr[arr.length-1] : null;
	
		if ( !eLastChild || ( eLastChild.getAttribute( 'type', 2 ) != '_moz' && eLastChild.getAttribute( '_moz_dirty' ) == null ) )
		{
			var doc = YzUtil.getElementDocument( element ) ;
	
			if (Yz.isOpera )
				element.appendChild(doc.createTextNode(''));
			else
				element.innerHTML+="&nbsp;";
				//element.appendChild(YzUtil.createBogusBR(doc));
		}
	},

	isIPAddress : function(ip)
	{
		var a=ip.split(".");
		if(a.length!=4)return false;
		for(var i=0;i<4;i++)
		{
			var d=parseInt(a[i]);
			if(isNaN(d) || d>=255 || d<0)return false;
		}
		return true;
	},
	getFileNameWithoutExt : function(fn)
	{
		var x=fn.lastIndexOf(".");
		var y=fn.lastIndexOf("\\");
		if(x<y)return fn.substr(y+1);
		
		return fn.substring(y+1,x);
	},
	getFileNameWithExt : function(fn)
	{
		return fn.substr(fn.lastIndexOf("\\")+1);
	},
	getFileNameExt : function(fn)
	{
		var x=fn.lastIndexOf('.');
		var y=fn.lastIndexOf('\\');
		if(x<y)return '';
		
		return fn.substr(x+1);
	}
}
Yz.util=YzUtil;

Yz.util.pager=function(pageSize,pageNow,rowCount,pagePageSize,lang,hideStatistic)
{
	if(!pagePageSize)pagePageSize=10; 
			
	if(pageSize<=0)return "";
	
	var pageCount=Math.ceil(rowCount/pageSize);
		if(pageCount<=1)return "";
	
	var txtFirstPage=lang=="EN" ? "<strong>&#171;</strong> First " : "首页";
	var txtLastPage=lang=="EN" ? "Last <strong>&#187;</strong> " : "末页";
			
	var pages=[];
	var x=(Math.ceil(pageNow/pagePageSize)-1);
		
		pages.push(pageNow==1 ? "<a class='off'>"+txtFirstPage+"<a> " : "<a class='pagen' page='1'>"+txtFirstPage+"</a>");
		
		var s=x*pagePageSize+1;
		var e=s+pagePageSize;
		
		if(x>0)pages.push("<a class='pagen' page='"+(s-1)+"'>...</a> ");
		if(e>pageCount)e=pageCount+1;
		
		for(var i=s;i<e;i++)
		{
			pages.push(pageNow==i ? "<a class='off' style='color:red;'><b>"+i+"</b></a>" : "<a class='pagen' page='"+i+"'>["+i+"]</a>");
		}
		
		if(pageCount>pagePageSize && e<pageCount)
			pages.push("<a class='pagen' page='"+e+"'>...</a> ");
		
		pages.push(pageNow==pageCount ? "<a class='off'>"+txtLastPage+"</a>" : "<a class='pagen' page='"+pageCount+"'>"+txtLastPage+"</a>");
		
	var stat=hideStatistic==true ? '' : "<td><a class='statistic'>Total "+rowCount+", Page "+pageNow+" of "+pageCount+"</a>&nbsp;&nbsp;</td>";
	var r="<table class='pager' cellspacing='0' cellpadding='0'>"+
	  	  "<tr>"+stat+"<td nowrap>"+pages.join("&nbsp;")+" &nbsp;</td></tr>"+
		  "</table>";
	return r;
}

Yz.util.scrollItH=function(elt,speed,step)
{
	elt=(typeof elt=="string") ? document.getElementById(elt) : elt;
    if(!elt)return;
    elt.innerHTML="<table cellpadding=0 cellspacing=0><tr><td><nobr>"+elt.innerHTML+"</nobr></td><td><nobr>"+elt.innerHTML+"</nobr></td></tr></table>";
    
    if(elt.clientWidth*2>=elt.firstChild.offsetWidth)
    	elt.firstChild.style.width=elt.clientWidth*2;
    
    var td2=elt.firstChild.rows[0].cells[1];
    function __scroll()
    {
        if(td2.offsetWidth-elt.scrollLeft<=0)
        	 elt.scrollLeft-=elt.scrollWidth;
        else
        	elt.scrollLeft+=step; 
    }
   
    var intId=setInterval(__scroll,speed);
    elt.onmouseover=function(){clearInterval(intId);intId=null;};
    elt.onmouseout=function(){intId=setInterval(__scroll,speed);};
    
    elt.style.visibility="visible";
}

Yz.util.scrollItV=function(elt,speed,step)
{
    elt.innerHTML="<div>"+elt.innerHTML+"</div><div>"+elt.innerHTML+"</div>";
    function __scroll()
    {
        if(elt.lastChild.offsetTop-elt.scrollTop<=0)
            elt.scrollTop-=elt.firstChild.offsetHeight;
        else 
        elt.scrollTop+=step;
    }

    var tid=setInterval(__scroll,speed);
        elt.onmouseover=function() {clearInterval(tid);};
        elt.onmouseout=function(){tid=setInterval(__scroll,speed);};
}

/*
**  sprintf.js -- POSIX sprintf(3) style formatting function for JavaScript
**  Copyright (c) 2006-2007 Ralf S. Engelschall <rse@engelschall.com>
**  Partly based on Public Domain code by Jan Moesen <http://jan.moesen.nu/>
**  Licensed under GPL <http://www.gnu.org/licenses/gpl.txt>
*/
Yz.util.sprintf = function () 
{
    /*  argument sanity checking  */
    if (!arguments || arguments.length < 1)
        alert("sprintf:ERROR: not enough arguments");

    /*  initialize processing queue  */
    var argumentnum = 0;
    var done = "", todo = arguments[argumentnum++];

    /*  parse still to be done format string  */
    var m;
    while(m = /^([^%]*)%(\d+$)?([#0 +'-]+)?(\*|\d+)?(\.\*|\.\d+)?([%diouxXfFcs])(.*)$/.exec(todo)) 
    {
        var pProlog    = m[1],
            pAccess    = m[2],
            pFlags     = m[3],
            pMinLength = m[4],
            pPrecision = m[5],
            pType      = m[6],
            pEpilog    = m[7];

        /*  determine substitution  */
        var subst;
        if (pType == '%')
            /*  special case: escaped percent character  */
            subst = '%';
        else 
		{
            /*  parse padding and justify aspects of flags  */
            var padWith = ' ';
            var justifyRight = true;
            if (pFlags) 
            {
                if (pFlags.indexOf('0') >= 0)
                    padWith = '0';
                if (pFlags.indexOf('-') >= 0) 
                {
                    padWith = ' ';
                    justifyRight = false;
                }
            }
            else
                pFlags = "";

            /*  determine minimum length  */
            var minLength = -1;
            if (pMinLength) 
            {
                if (pMinLength == "*") 
                {
                    var access = argumentnum++;
                    if (access >= arguments.length)
                        alert("sprintf:ERROR: not enough arguments");
                    minLength = arguments[access];
                }
                else
                    minLength = parseInt(pMinLength, 10);
            }

            /*  determine precision  */
            var precision = -1;
            if (pPrecision) 
            {
                if (pPrecision == ".*") 
                {
                    var access = argumentnum++;
                    if (access >= arguments.length)
                        alert("sprintf:ERROR: not enough arguments");
                    precision = arguments[access];
                }
                else
                    precision = parseInt(pPrecision.substring(1), 10);
            }

            /*  determine how to fetch argument  */
            var access = argumentnum++;
            if (pAccess)
                access = parseInt(pAccess.substring(0, pAccess.length - 1), 10);
            if (access >= arguments.length)
                alert("sprintf:ERROR: not enough arguments");

            /*  dispatch into expansions according to type  */
            var prefix = "";
            switch (pType) 
            {
                case 'd':
                case 'i':
                    subst = arguments[access];
                    if (typeof subst != "number")
                        subst = 0;
                    subst = subst.toString(10);
                    if (pFlags.indexOf('#') >= 0 && subst >= 0)
                        subst = "+" + subst;
                    if (pFlags.indexOf(' ') >= 0 && subst >= 0)
                        subst = " " + subst;
                    break;
                case 'o':
                    subst = arguments[access];
                    if (typeof subst != "number")
                        subst = 0;
                    subst = subst.toString(8);
                    break;
                case 'u':
                    subst = arguments[access];
                    if (typeof subst != "number")
                        subst = 0;
                    subst = Math.abs(subst);
                    subst = subst.toString(10);
                    break;
                case 'x':
					subst = arguments[access];
					if (typeof subst != "number")
						subst = 0;
					subst = subst.toString(16).toLowerCase();
					if (pFlags.indexOf('#') >= 0)
						prefix = "0x";
				break;
				case 'X':
					subst = arguments[access];
					if (typeof subst != "number")
						subst = 0;
					subst = subst.toString(16).toUpperCase();
					if (pFlags.indexOf('#') >= 0)
						prefix = "0X";
				break;
				case 'f':
				case 'F':
					subst = arguments[access];
					if (typeof subst != "number")
					subst = 0.0;
					subst = 0.0 + subst;
					if (precision > -1) 
					{
						if (subst.toFixed)
							subst = subst.toFixed(precision);
						else 
						{
							subst = (Math.round(subst * Math.pow(10, precision)) / Math.pow(10, precision));
							subst += "0000000000";
							subst = subst.substr(0, subst.indexOf(".")+precision+1);
						}
					}
					subst = '' + subst;
					if (pFlags.indexOf("'") >= 0) 
					{
						var k = 0;
						for (var i = (subst.length - 1) - 3; i >= 0; i -= 3) 
						{
							subst = subst.substring(0, i) + (k == 0 ? "." : ",") + subst.substring(i);
							k = (k + 1) % 2;
						}
					}
				break;
				case 'c':
					subst = arguments[access];
					if (typeof subst != "number")
					subst = 0;
					subst = String.fromCharCode(subst);
				break;
				case 's':
					subst = arguments[access];
					if (precision > -1)
					subst = subst.substr(0, precision);
					if (typeof subst != "string")
					subst = "";
				break;
			}
				
			/* apply optional padding */
			var padding = minLength - subst.toString().length - prefix.toString().length;
			if (padding > 0) 
			{
				var arrTmp = new Array(padding + 1);
				if (justifyRight)
					subst = arrTmp.join(padWith) + subst;
				else
					subst = subst + arrTmp.join(padWith);
			}
			
			/* add optional prefix */
			subst = prefix + subst;
		}
			
		/* update the processing queue */
		done = done + pProlog + subst;
		todo = pEpilog;
	}
	return (done + todo);
}