	var xmlhttp	
	var uploading=null
	
	function doubleDigit(digit) {
		if(digit < 10) digit='0'+digit;
		return (digit)
	}
					
	function calcTime(time){
	
		this.minute=doubleDigit(0)
		this.second=doubleDigit(time)
		this.hour=""
		
		if(time > 59) {
			this.minute=doubleDigit(Math.floor(time/60));
			this.second=doubleDigit(Math.floor(time % 60));
		}
		
		if(this.minute > 59) {
			this.hour=doubleDigit(Math.floor(this.minute/60))+":";
			this.minute=doubleDigit(Math.floor(this.minute % 60));
		}
		
	}
	
	function getStats(size,totalSize) {
				
		var time=Math.floor(((new Date()-start)/100)/10);
		var speed=Math.floor(size/time);
		var remTime=Math.floor((totalSize-size)/speed);
		
		var elap = new calcTime(time)
		var rem = new calcTime(remTime)
		
		timeString="Elapsed ( "+elap.hour+elap.minute+":"+elap.second+" )";
		statString=Math.floor(size)+" / "+Math.floor(totalSize)+" KB";	
			
		if (isNaN(speed) || speed=="Infinity") { 
			speedString="Calculating...";
		} else {
			speedString=speed+" KB/s";
		}
		
		if(isNaN(remTime) || time < 3){
			remtimeString="Calculating...";			
		} else {
			remtimeString="Remaining ( "+rem.hour+rem.minute+":"+rem.second+" )";
		}
		
		document.getElementById("elap").innerHTML=timeString;
		document.getElementById("rem").innerHTML=remtimeString;
		document.getElementById("speed").innerHTML=speedString;
		document.getElementById("stats").innerHTML=statString;
			
	}
	
	function parseXML(xmlDOM, xslFile, eID) {

		// Mozilla based browsers
		
		if(document.implementation && document.implementation.createDocument){
		
			resultDocument = null;
			var xsltProcessor = new XSLTProcessor(); // Start up the processor									
			
			var fetchXSL = new XMLHttpRequest(); // Fetch and import the XSL sheet to the processor
			fetchXSL.open("GET", xslFile, false);
			fetchXSL.send(null);
			
			xsltProcessor.importStylesheet(fetchXSL.responseXML);

			if(xmlDOM.documentElement) { // Transform and output to HTML DOM ID else create DOM from filename (usually blank.xml when no xml response is available) then transform
				
				resultDocument = xsltProcessor.transformToFragment(xmlDOM, document);
				
			} else {
				
				var fetchXML = new XMLHttpRequest();
				fetchXML.open("GET", xmlDOM, false);
				fetchXML.send(null);
				resultDocument = xsltProcessor.transformToFragment(fetchXML.responseXML, document);
				
			}
			
			document.getElementById(eID).appendChild(resultDocument);
			
		// MSIE based browsers

		} else if(window.ActiveXObject) {
										 
			var xsl = new ActiveXObject("Microsoft.XMLDOM")
			xsl.async = false
			xsl.load(xslFile)
			
			if(xmlDOM.documentElement) {
						
				document.getElementById(eID).innerHTML=xmlDOM.transformNode(xsl)
				
			} else {
				var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
				xmlDoc.async = false
				xmlDoc.load(xmlDOM)
				document.getElementById(eID).innerHTML=xmlDoc.transformNode(xsl)
			}
						
		}
		
	}
	
	function NBB_FILEUPLOAD(i,submit) {
	
		xmlhttp=null
		if (window.XMLHttpRequest){
			xmlhttp=new XMLHttpRequest()	
		} else if (window.ActiveXObject) {
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
		}
		
		if (xmlhttp!=null) {
			var url="ajax_request.php"
			url=url+"?i="+i
			xmlhttp.onreadystatechange=action
			xmlhttp.open("POST",url,true)
			xmlhttp.setRequestHeader('Content-Type','text/xml'); 
			xmlhttp.send(null);
		} else {
			alert("Sorry, your browser does not support XMLHTTP.\n Please disable Javascript and try again.")
		}
	}
	
	function resetDisplay(position) {
		
		if(uploading!="true") {
			var element = document.getElementById("ajax");
			while (element.firstChild) {
					element.removeChild(element.firstChild);
			}
		}
		
		if(position=="uploading") {
			document.getElementById('ajax').style.display="block"	
			document.getElementById('uform').style.display="none"
			document.getElementById("jtf").disabled=true
			document.getElementById("jtf").value="Please wait ... "
		} else if(position=="complete") {
			document.getElementById('ajax').style.display="none"	
			document.getElementById('uform').style.display="block"	
			document.getElementById("jtf").disabled=false
			document.getElementById("jtf").value="Upload Just-The-File"
			
			// generate a new unique id for next upload
				var d = new Date();
				nocache = d.getTime();
				i = nocache+"d"+Math.floor(Math.random()*1000);
				
				var form_action = document.getElementById("uform").action.split("=");
				
				document.getElementById("uform").action=form_action[0]+"="+i;	
				document.getElementById("uform").onsubmit=function(){NBB_FILEUPLOAD(i,true)};		
			
		} else if(position=="starting") {
			document.getElementById('ajax').style.display="block"	
			document.getElementById('uform').style.display="block"	
			document.getElementById("jtf").disabled=true
			document.getElementById("jtf").value="Please wait ... "
		}

		
	}
	
	function display_complete() {
		if (xmlhttp.readyState==4) { 
			if (xmlhttp.status==200){ 	
				resetDisplay("complete")
				document.getElementById('display').style.display="block"
				document.getElementById('display').innerHTML=xmlhttp.responseText;	
			}
		}
	}
	
	function action() {
	
		if (xmlhttp.readyState==1) {
			if(uploading==null) {
				document.getElementById('display').style.display="none"
				document.getElementById('ajax_error_div').style.display="none"
				resetDisplay("starting")
				parseXML("jtf-blank.xml", "jtf-styles.xml", "ajax")
			}	
		}
		
		if (xmlhttp.readyState==2) {
			if(uploading==null) {
				start=new Date();
			}		
		}
		 
		if (xmlhttp.readyState==4) { 
			if (xmlhttp.status==200){ 			
				
				var status=xmlhttp.responseXML.getElementsByTagName("STATUS")[0].childNodes[0].nodeValue
				var id=xmlhttp.responseXML.getElementsByTagName("ID")[0].childNodes[0].nodeValue
				var percent=xmlhttp.responseXML.getElementsByTagName("PERCENT")[0].childNodes[0].nodeValue
				var errors=xmlhttp.responseXML.getElementsByTagName("ERROR")

				if(errors.length != 0) {
			
					document.getElementById('ajax_error_div').style.display="block"
					document.getElementById('errors').innerHTML=""
					document.getElementById('target_upload').src=""
					
					document.getElementById('error_title').innerHTML="Oh noes, an error!"
					
					for (i=0;i<errors.length;i++){
						document.getElementById('errors').innerHTML+="<p>"+errors[i].childNodes[0].nodeValue+"<p>"
  					}
					
					uploading=null
					
  					resetDisplay("complete")

				} else if(status != "Saving File"){

					resetDisplay("uploading")
	
					if(uploading!="true") { parseXML(xmlhttp.responseXML, "jtf-styles.xml", "ajax"); }
					
					getStats(xmlhttp.responseXML.getElementsByTagName("CURRENTSIZE")[0].childNodes[0].nodeValue,xmlhttp.responseXML.getElementsByTagName("FILESIZE")[0].childNodes[0].nodeValue)
					
					document.getElementById('progress_fill').style.width=percent;
					document.getElementById('progress_percent').innerHTML=percent;
					
					uploading = "true"
					
					NBB_FILEUPLOAD(id,false)

				} else {
					
					uploading=null
												
					xmlhttp=null
					if (window.XMLHttpRequest){
						xmlhttp=new XMLHttpRequest()	
					} else if (window.ActiveXObject) {
						xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
					}
					
					var url2="/"
					url2=url2+"?action=create&POST="+id
					xmlhttp.onreadystatechange=display_complete
					xmlhttp.open("POST",url2,true)
					xmlhttp.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
					xmlhttp.send(null);
					
				}
				
			}
		}
	}