	var drawableStages; // how many img elements are defined
	var visableStage; // which stage is currently visible?
	var editStage; // what stage is being edited?

	var propagated=false;
	
	var investorRemoved; // array for storing the investors that the user wishes to remove
	
	var editedInvestors=false;	
	

	function init(){
		 drawableStages=equityData.length;
		 visableStage=equityData.length;		
		 
		 if (equityData.length > 0) {
			 placePies(equityData.length);				
		 }
		 
		 if (equityData.length==0) {
			stageAdd(); 
		 }
		 
		 document.onkeypress = keyPress
		 if (document.layers)
			document.captureEvents(Event.KEYPRESS);
	}

	

	function keyPress(e) {
		
		var kC  = (window.event) ?    // MSIE or Firefox?
                  event.keyCode : e.keyCode; 
       var Esc = (window.event) ?    
                 27 : e.DOM_VK_ESCAPE // MSIE : Firefox
		
		if ((kC==13)&(document.getElementById('stageEdit').style.visibility=='visible')) {;
			stageEditFormSave();
		} else if ((kC==Esc)&(document.getElementById('stageEdit').style.visibility=='visible')) {
			stageEditCancel();			
		}

	}

	window.onload=init;

	function showNextStage() {
		if (visableStage<equityData.length) {
			visableStage++;
			placePies(visableStage);
		}	
	}

	function showPreviousStage() {
		if (visableStage>1)  {
			visableStage--;
			placePies(visableStage);
		}	
	}

	function showStage(i) {
		visableStage=i;
		placePies(visableStage);
	}


	function placePies(stage) {
		
		clearPies();
		
		var i,j,pie,columns,rows,sumColumnWidth,sumRowHeight;	
		var pieColumn = new Array(stage);		
		var pieRow = new Array(stage);		
		var shareHoldersPerStage = new Array(stage);	
		var stageRadius = new Array(stage);	
		var uniqueShareHolding = new Array();	
		var uniqueShareHoldings;	
		var canv_width=document.imggraphbg.width*((equityData.length+stage)/(2*equityData.length));
		var canv_height=document.imggraphbg.height*((equityData.length+stage)/(2*equityData.length));
		var temp,found;
		var totalShares;
				
		// What percentage is owned by founders?		
		for(i=0; i<stage; i++) {			
			shareHoldersPerStage[i]=0;			
			totalShares=0;
			
			for(j=0; j<investors.length; j++) {
				if (investors[j][2]==0) {
					shareHoldersPerStage[i] += equityData[i][investors[j][4]-1];
				}
				totalShares += equityData[i][investors[j][4]-1];
			}			
			shareHoldersPerStage[i] = shareHoldersPerStage[i]/totalShares;
		}
		
		columns = 1;
		pieColumn[0] = 0;
		for(i=1;i<stage;i++) {		
			if (ddMMMyyyy(equityDate[i-1])!=ddMMMyyyy(equityDate[i])) { columns++; }
			if ((ddMMMyyyy(equityDate[i-1])==ddMMMyyyy(equityDate[i])) 
			  & (shareHoldersPerStage[i-1]==shareHoldersPerStage[i])) { columns++; }
			
			pieColumn[i]=columns-1;
		}
			
		var columnWidth = new Array(columns);
		for(i=0;i<columns;i++){columnWidth[i]=-1;}
		for(i=0;i<stage;i++){
			if (columnWidth[pieColumn[i]] < Math.pow(equityValue[i],0.5)) {
				columnWidth[pieColumn[i]] = Math.pow(equityValue[i],0.5);		
			}		
		}

		sumColumnWidth=0;
		for(i=0;i<columns;i++) {sumColumnWidth+=columnWidth[i];}
		for(i=0;i<columns;i++) {columnWidth[i]=Math.round(columnWidth[i]*canv_width/sumColumnWidth);}
				
		// how many different rows will we need
		uniqueShareHoldings=0;
		for(i=0;i<stage;i++){
		
			found=false;
			
			for(j=0;j<uniqueShareHoldings;j++) {
				if (shareHoldersPerStage[i]==uniqueShareHolding[j]) {found=true}
			}
		
			if (!found) {
				uniqueShareHolding.push(shareHoldersPerStage[i]);
				uniqueShareHoldings++;
			}		
		}
		rows = uniqueShareHoldings;
		uniqueShareHolding.sort(sortNumber);
		
		// assign pie to a row
		for(i=0;i<stage;i++){
			for(j=0;j<uniqueShareHoldings;j++){
				if(shareHoldersPerStage[i]==uniqueShareHolding[j]){pieRow[i]=j;}
			}			
		}
		
		var rowHeight = new Array(rows);
		for(i=0;i<rows;i++){rowHeight[i]=-1;}
		for(i=0;i<stage;i++){
			if (rowHeight[pieRow[i]] < Math.pow(equityValue[i],0.5)) {
				rowHeight[pieRow[i]] = Math.pow(equityValue[i],0.5);				
			}		
		}
		
		sumRowHeight=0;
		for(i=0;i<rows;i++) {sumRowHeight+=rowHeight[i];}
		for(i=0;i<rows;i++) {rowHeight[i]=Math.round(rowHeight[i]*canv_height/sumRowHeight);}
		
		var ctop,cleft, pleft,ptop,pheight,pwidth,minR;
		var r,maxRowR,maxColR,prevX,prevY,line,curX,curY;
		
		ctop=15; cleft=20;
		
		
		for(i=0; i<stage; i++) {stageRadius[i]=Math.min(rowHeight[pieRow[i]],columnWidth[pieColumn[i]]);}
		// make sure each valuation has the same value
		
		for(i=0; i<stage; i++) {
			// what is the minimum radius for this valuation
			minR=stageRadius[i];
			for(j=0;j<stage;j++) {
				if (equityValue[i]==equityValue[j]) {minR=Math.min(minR,stageRadius[j]);}
			}
			stageRadius[i]=Math.max(minR,15);
		}
		
		pleft=cleft;
		
		for(i=0; i<stage; i++) {
				
			r =	stageRadius[i];
			pheight = r;
			pwidth =  r;				

			ptop = ctop;
			for(j=0;j<pieRow[i];j++){
				ptop+=rowHeight[j];
			}

			pleft = cleft;
			for(j=0;j<pieColumn[i];j++){
				pleft+=columnWidth[j];
			}
			
			// whats the largest radius in this row?
			maxRowR=-1;maxColR=-1;
			for(j=0;j<stage;j++){
				if(pieRow[j]==pieRow[i]) {
					maxRowR = Math.max(maxRowR,Math.min(rowHeight[pieRow[j]],columnWidth[pieColumn[j]]));					
				}
				if (pieColumn[j]==pieColumn[i]) {
					maxColR = Math.max(maxColR,Math.min(rowHeight[pieRow[j]],columnWidth[pieColumn[j]]));
				}
			}

			pie = document.getElementById('pie' + i);					
			pie.style.left = pleft +(maxColR-r)/2 + 'px'; 
			pie.style.top  = ptop + (maxRowR-r)/2 + 'px';		
			pie.height=pheight; pie.width=pwidth;
			pie.style.visibility='visible';

			curX = pleft+(maxColR-r)/2+pwidth/2;
			curY = ptop+(maxRowR-r)/2+pheight/2;
			
			if (i>0) {
				j=i-1;
				line = document.getElementById('pieline' + j);						

				if (curX==prevX){
					line.height=Math.floor(Math.abs(curY-prevY));
					line.width=3;
				} else {
					line.height=3;
					line.width=Math.floor(curX-prevX);					
				}
								
				line.style.left = prevX + 'px'; 
				if (prevY <= curY) {
					line.style.top  = prevY-3 + 'px';
				} else {
					line.style.top  = curY-3 + 'px';
				}
				
				line.style.visibility='visible';
			}
			
			prevX= curX;
			prevY= curY;
			
		}
		
		showData(stage)
	
	}
	
	function showData(stage) {
		var invIdx;
		for(var i=0; i<investors.length;i++) {			
			invIdx=investors[i][4]; 
			document.getElementById('dispShareHolder-' + invIdx).innerHTML= equityData[stage-1][i];		
		}	

		document.getElementById('dispStageNumber').innerHTML = stage;
		if (equityDescription[stage-1].length>0) {
			document.getElementById('dispDescription').innerHTML = equityDescription[stage-1];
		} else {
			document.getElementById('dispDescription').innerHTML = '<i>none</i>';
		}
		document.getElementById('dispValue').innerHTML= curSymbol + value2str(equityValue[stage-1]);	
		
		if (useDate) {
			if (dateRes==1) {
				document.getElementById('dispYear').innerHTML = equityDate[stage-1].getFullYear();
			}
			if (dateRes==2) {
				document.getElementById('dispYear').innerHTML = MMMyyyy(equityDate[stage-1]);
			}
			if (dateRes==3) {
				document.getElementById('dispYear').innerHTML = ddMMMyyyy(equityDate[stage-1]);
			}
			
		}
	}
	
	function value2str(v) {
		
		var s, th, mi, bi;
		th = Math.pow(10,3);
		mi = Math.pow(10,6);
		bi = Math.pow(10,9);
		
		if (valUnits==3) {
			v = parseFloat(v) * Math.pow(10,3);
		} else if (valUnits==6) {
			v = parseFloat(v) * Math.pow(10,6);
		}
				
		if (th>v) {s=v;}
		if ((mi>v) & (v>=th)) {v=v/th; s = v + ' thousand';}
		if ((bi>v) & (v>=mi)) {v=v/mi; s = v + ' million';}
		if (v>=bi) {v=v/bi; s = v + ' billion';} 	    
 	    		
		return s;
		
	}
	

	function clearPies() {
		for(i=0; i<equityData.length; i++) {							
			pie = document.getElementById('pie' + i);									
			pie.style.visibility='hidden';
		}
		for(i=0; i<(equityData.length-1); i++) {							
			pie = document.getElementById('pieline' + i);									
			pie.style.visibility='hidden';
		}
		
	}


	function drawInvestorTable() {
		
		var i, j, newRows, columns=3, r, c, inv, newimg;
		var now = new Date();
		var t = document.getElementById('investorTable');
		
		while (t.rows.length>0) {t.deleteRow(0);}
		
		newRows = Math.ceil(investors.length/columns);
			
		for(i=0;i<newRows;i++) {
			r = t.insertRow(i);			
			for(j=0; j<3; j++) {
				
				inv = j*newRows+i;
				
				if (inv<investors.length) {
					
					c = r.insertCell(3*j+0);
					c.width=10; c.align='center';			
					newimg = document.createElement('img');					
					if (local) {
						newimg.setAttribute('src', 'imageSwatchLocal.php?type=' + investors[inv][2] + '&typeIdx=' + investors[inv][3] + '&clock=' + now.getTime());					
					} else {
						newimg.setAttribute('src', 'imageSwatch.php?CID=' + CID + '&IID=' + investors[inv][0] + '&clock=' + now.getTime());					
					}
					c.appendChild(newimg);
				
					c = r.insertCell(3*j+1);
					c.width=120; c.align='left'; c.innerHTML = investors[inv][1];
					
					c = r.insertCell(3*j+2); 
					c.id = 'dispShareHolder-' + investors[inv][4];
					c.width=50; 
					c.className='rightinvesterborder';
					
				
				} else {
					c = r.insertCell(3*j+0); c.width=10; c.innerHTML='&nbsp;'
					c = r.insertCell(3*j+1); c.width=120; c.innerHTML='&nbsp;'
					c = r.insertCell(3*j+2); c.width=50; c.innerHTML='&nbsp;'
				}				
			}
		}				
	}


	function drawEditForm(data, newStage) {
		
		var i,r,c,v;
		
		// Initialise array for storing if investors are removed by the user
		investorRemoved = new Array(investors.length); 
		for(i=0; i<investors.length; i++) {investorRemoved[i]=false;}

		
		var t = document.getElementById('tbEditShareHolders');
		while ((t.rows.length)>0) {t.deleteRow(0);}
		
		
		data=data-1;
		
		if (!useDate) {
			document.getElementById('daterow').style.display = 'none';
		} else {
			
			if (dateRes>1) {
				document.getElementById('sMonth').style.display = 'inline';
			} else {
				document.getElementById('sMonth').style.display = 'none';
				document.getElementById('sMonth').value=1;
			}

			if (dateRes>2) {
				document.getElementById('sDay').style.display = 'inline';
			} else {
				document.getElementById('sDay').style.display = 'none';
				document.getElementById('sDay').value=1;
			}
			
		}
		
		if ((data>=0) & (data<equityData.length)) {
		
			document.getElementById('txtValue').value = equityValue[data];						
			document.getElementById('sDay').value = formatDate(equityDate[data],'dd');
			document.getElementById('sMonth').value = formatDate(equityDate[data],'M');
			document.getElementById('sYear').value = formatDate(equityDate[data],'yyyy');



			document.getElementById('sTypeG').checked = (equityType[data]==1);
			document.getElementById('sTypePre').checked = (equityType[data]==2);
			document.getElementById('sTypePost').checked = (equityType[data]==3);

			if (newStage) {
				document.getElementById('txtStageDesciption').value = '';
			} else {
				document.getElementById('txtStageDesciption').value = equityDescription[data];
			}
		}
		
		var x=document.getElementById('tbEditShareHolders').insertRow(0);
		var c1=x.insertCell(0); c1.width=65; c1.align='left'; c1.innerHTML = '<b>Name</b>';
		var c2=x.insertCell(1); c2.width=10; c2.align='left'; c2.innerHTML = '&nbsp;';
		var c3=x.insertCell(2); c3.width=70; c3.align='left'; c3.innerHTML = '<b>Equity</b>';
		var c4=x.insertCell(3); c4.width=70; c4.align='left'; c4.innerHTML = '';
		var c5=x.insertCell(4); c5.width=70; c5.align='left'; c5.innerHTML = '';

		
		for(i=0; i<investors.length; i++) {

			v='';			
			if ((data>=0) & (data<equityData.length)) {
				v = equityData[data][i];
			}			
			drawInvestorRow(i, investors[i][4], false, investors[i][1], v, investors[i][2])			
		}
		
		displayCalcTotal();
		
		
		
	}

	function stageAdd() {				
		editStage=drawableStages+1;
		drawEditForm(drawableStages, true);		
		document.getElementById('tbEditTitle').innerHTML='New Stage ' + editStage;
		document.getElementById('stageEdit').style.visibility='visible';
	}
	
	function stageEdit() {
		editStage=visableStage;
		drawEditForm(visableStage, false);
		document.getElementById('tbEditTitle').innerHTML='Edit Stage ' + editStage;
		document.getElementById('stageEdit').style.visibility='visible';		
	}
	
	function stageEditFormSave() {	
		//note 'saveInvestors' will recall this function when done, with addedInvestors=0;
		
		//validate input
		if (!(inputValid())) {
			return;			 
		}
		
		
		// Check that share holder percentages add upto 100
		if (valMeasure==0) {
			if (calcTotal()!=100) {
				flashCount=0;
				calcValueFlash();
				return;
			}			
		}
		
		
		if (editedInvestors) {
			removeInvestors();
			updateInvestorsLocal();
			if(!local){updateInvestorsRemote()};			
		} else {
			updateStageLocal();
			if(!local){updateStageRemote()};
		}			
	}
	
	function stageEditCancel() {	
		editMode=0
		document.getElementById('stageEdit').style.visibility='hidden';		
	}
	
	function inputValid() {
		if (isNaN(parseFloat(document.getElementById('txtValue').value))) {
			alert('Value ' + document.getElementById('txtValue').value + ' is not a valid number.');
			return false;
		}
		
		for(var i=0; i<investors.length;i++) {			
			if (document.getElementById('txtShareHolder-' + investors[i][4])) {
			v = document.getElementById('txtShareHolder-' + investors[i][4]).value;
			if (v.length>0) {	
				 if (isNaN(parseFloat(v))) {
					 alert('Equity value ' + v + ' is not a valid number.');
					 return false;
				 }
			}				
			}
		}
		return true;
		
	}
	
	function updateStageLocal() {

		var type = 1;
		var shChange; 
		var shChanged;
		var newVal;
		if (document.getElementById('sTypeG').checked) {type=1;}
		if (document.getElementById('sTypePre').checked) {type=2;}		
		if (document.getElementById('sTypePost').checked) {type=3;}		


		if (useDate) {
			var d = new Date(document.getElementById('sYear').value, document.getElementById('sMonth').value-1, document.getElementById('sDay').value, 0,0,0,0);
		} else {
			
			if (editStage-2 >= 0) {			
				if (type==3) {
					d = equityDate[editStage-2];
				} else {
					d = new Date(equityDate[editStage-2]);
					d.setDate(d.getDate() + 1);
				}
			} else {
				d = new Date(1971,0,1,0,0,0,0);
			}
			
		}
		
		var v;
		

		if (editStage>drawableStages) {			
		
		
			equityDate.push(d);
			equityValue.push(parseFloat(document.getElementById('txtValue').value));	
			equityData.push(new Array(investors.length));			
			equityDescription.push(document.getElementById('txtStageDesciption').value);
			equityType.push(type);

			for(var i=0; i<investors.length;i++) {			
				v = document.getElementById('txtShareHolder-' + investors[i][4]).value;
				if (v.length>0) {
					 newVal = parseFloat(v);
				} else {
					newVal=0;
				}				
				equityData[editStage-1][i] = newVal;				
			}				
			
		} else {
			
			equityDate[editStage-1]=d;
			equityValue[editStage-1]=parseFloat(document.getElementById('txtValue').value);			
			equityDescription[editStage-1]=document.getElementById('txtStageDesciption').value;						
			equityType[editStage-1] = type;
			
			shChange = new Array(investors.length);
			shChanged = false;
			for(var i=0; i<investors.length;i++) {			
				v = document.getElementById('txtShareHolder-' + investors[i][4]).value;
				if (v.length>0) {
					 newVal = parseFloat(v);
				} else {
					newVal=0;
				}
				shChange[i] = newVal - parseFloat(equityData[editStage-1][i]);
				if (shChange[i]!=0) {shChanged=true;}
				equityData[editStage-1][i] = newVal;
			}	
			
			
			
			if ((editStage<drawableStages)&(shChanged)) {				
				if (confirm('Propagate changes through to subsequent stages?')) {
					propagateEquity(editStage, equityData.length, shChange);
					propagated=true;
				}				
			}			
			
		}

		if (local) {
			
			if (equityData.length > drawableStages) {
				handleStageAddSaveComplete();
			} else {
				handleStageEditSaveComplete();
			}
			stageEditCancel();
		}

		
	}
	
	function updateStageRemote() {


		var type = 1;
		if (document.getElementById('sTypeG').checked) {type=1;}
		if (document.getElementById('sTypePre').checked) {type=2;}		
		if (document.getElementById('sTypePost').checked) {type=3;}		

		var url = 'stageUpdateInline.php?CID=' + CID + '&SNumber=' + editStage + '&SHN=' + investors.length;
		url = url + '&SDesc=' + document.getElementById('txtStageDesciption').value;
		url = url + '&sType=' + type;
						
		for(var i=0; i<investors.length;i++) {			
			url = url + '&SHID' + i + '=' + investors[i][0];
			url = url + '&SHValue' + i + '=' + equityData[editStage-1][i];
		}	
		
		url = url + '&SValue=' + equityValue[editStage-1];			
		url = url + '&Date=' + formatDate(equityDate[editStage-1],'yyyy-MM-dd');	

		if (propagated) {
			var t=equityData.length;
			url = url + '&prop=' + t;
			for(var i=1; i<=equityData.length; i++) {				
				for(var j=0; j<investors.length;j++) {							
						url = url + '&SHV' + i + '-' + j + '=' + equityData[i-1][j];
				}				
			}
		}
		propagated=false;

		//window.location = url;

		http.open("GET", url, true); 
		http.onreadystatechange = handleUpdateStageRemote; 
		http.send(null);				
	}
	
	function propagateEquity(editStage, endStage, shChange) {
		
		var currentChange;
		var i;
		var j;
		
		var pctOwn = new Array(investors.length)
		var pctOwnOrig = new Array(investors.length)
		var sumPctOwn=0;
		var sumEquity;
		var sumEquityT;
		var sumTotal;
		if (valMeasure==0) {
			// Ownership in percentages
		
			// work out the pecentage change
			ii = editStage-1;
			
			// what was the original ownership of these investors
			sumTotal=0;
			for(j=0; j<investors.length;j++) {	
				pctOwnOrig[j]=0;
				if (shChange[j]!=0) {pctOwnOrig[j]=equityData[ii][j]-shChange[j];sumTotal+=pctOwnOrig[j];}
			}
			
			for(j=0; j<investors.length;j++) {
				if (shChange[j]!=0) {pctOwnOrig[j]=pctOwnOrig[j]/sumTotal;}
			}
			
			
			sumPctOwn=0; sumTotal=0;
			for(j=0; j<investors.length;j++) {				
				pctOwn[j]=0;
				//if (equityData[ii][j]>0) {pctOwn[j] = equityData[ii][j]/100;}
				if (equityData[ii][j]>0) {pctOwn[j] = equityData[ii][j]; sumPctOwn+=pctOwn[j];}
				sumTotal += equityData[ii][j]; 
			}								
			for(j=0; j<investors.length;j++) {pctOwn[j] = (sumTotal/100)*pctOwn[j]/sumPctOwn;}								

			var temp;
			for(i=editStage; i<endStage; i++) {				
				
				// if the relative ownership between the shareholders that we are propagating changes  
				// then we can no longer propagate.
				temp=0;
				for(j=0; j<investors.length; j++) { if (shChange[j]!=0) {temp+=equityData[i][j];}}				
				for(j=0; j<investors.length; j++) { 
					if (shChange[j]!=0) {
						if ( (equityData[i][j]/temp) != pctOwnOrig[j] ) {return;}
					}
				}
				
				sumEquity = 0; sumEquityT=0;
				for(j=0; j<investors.length;j++) {				
					if (pctOwn[j]>0) {sumEquity += equityData[i][j];}		
					if ((equityData[ii][j]==0)&(shChange[j]<0)) {sumEquity += equityData[i][j];}
					sumEquityT += equityData[i][j];
				}								
				sumEquity+=100-sumEquityT;
				for(j=0; j<investors.length;j++) {
					if (pctOwn[j]>0) {equityData[i][j] = pctOwn[j]*sumEquity;}				
					equityData[i][j] = Math.round(equityData[i][j]*100)/100;
					if ((equityData[ii][j]==0)&(shChange[j]<0)) {equityData[i][j] = 0;}
				}				
			}

		} else {
			// Ownership in shares
			for(var i=editStage; i<endStage; i++) {				
				for(var j=0; j<investors.length;j++) {							
					if (shChange[j]!=0) {						
						currentChange = 0;
						if (i>editStage) { currentChange = equityData[i][j]-equityData[i-1][j]+shChange[j]; }
						equityData[i][j] += shChange[j]+currentChange;					
					}					
				}				
			}
			
		}
		
	}
	
	function handleUpdateStageRemote() {
		if (http.readyState == 4) {
			if (http.status == 200) {
				if (equityData.length > drawableStages) {
					handleStageAddSaveComplete();
				} else {
					handleStageEditSaveComplete();
				}
			} else {
				alert("The remote procedure ended with the following error code: " + http.status);			  
			}
		} else {
			
		}
		
		stageEditCancel();	
	}
	
	function handleStageAddSaveComplete() {
					
		var stage = visableStage;
		var imgElement;
		
		var newpie = document.createElement('img');
		newpie.setAttribute('id', 'pie' + stage);
		if (local) {
			var src='imagePieLocal.php?slices=' + investors.length;
			for(var i=0; i<investors.length; i++) {
				src = src + '&sliceVal' + i + '=' + equityData[stage][investors[i][4]-1];
				src = src + '&sliceType' + i + '=' + investors[i][2];
				src = src + '&sliceTypeIdx' + i +  '=' + investors[i][3];
			}
			newpie.setAttribute('src', src);
		}else{
			newpie.setAttribute('src', 'imagePie.php?CID=' + CID + '&SNumber=' + (stage+1));
		}
		document.getElementById('background').appendChild(newpie);
		

		imgElement = document.getElementById('pie' + stage);
		imgElement.style.position='absolute';
		imgElement.style.left='0px';
		imgElement.style.top='0px';
		imgElement.style.visibility = 'hidden';
		imgElement.style.zIndex = 3;

		var newpieline = document.createElement('img');
		newpieline.setAttribute('id', 'pieline' + (stage-1));
		newpieline.setAttribute('src', 'img/bdot.gif');

		document.getElementById('background').appendChild(newpieline);
		

		imgElement = document.getElementById('pieline' + (stage-1));
		imgElement.style.position='absolute';
		imgElement.style.left='0px';
		imgElement.style.top='0px';
		imgElement.style.visibility = 'hidden';
		imgElement.style.zIndex = 2;
		
		drawableStages++;
		showNextStage();					
	}
	

	function handleStageEditSaveComplete() { 

		var i,j;
		var stage = editStage;
		var now = new Date();
		document.getElementById('pie' + (stage-1)).style.visibility='hidden';		

		
		if (local) {
			for(i=0; i<drawableStages;i++) {
				var src='imagePieLocal.php?slices=' + investors.length;
				for(var j=0; j<investors.length; j++) {
					src = src + '&sliceVal' + j + '=' + equityData[i][investors[j][4]-1];
					src = src + '&sliceType' + j + '=' + investors[j][2];
					src = src + '&sliceTypeIdx' + j +  '=' + investors[j][3];
				}			
				document.getElementById('pie' + i).src = src + '&clock=' + now.getTime();
			}
			
		}else{
			for(i=0; i<drawableStages;i++) {
				document.getElementById('pie' + i).src = 'imagePie.php?CID=' + CID + '&SNumber=' + (i+1) + '&clock=' + now.getTime();		
			}
			
		}
		
		
		
		placePies(stage);
		
	}

	
	function stageDelete() {
	
		if (confirm('Remove current stage?')) {
			
			
			var stage = visableStage - 1;			
			equityDate.pop();
			equityValue.pop();
			equityData.pop();
			
			document.getElementById('background').removeChild(document.getElementById('pie' + stage));
			
			if (stage>0) {
				document.getElementById('background').removeChild(document.getElementById('pieline' + (stage-1)));
				placePies(stage);
			}
			
			
			if (!local) {
				var url = 'stageDeleteInline.php?CID=' + CID + '&SNumber=' + visableStage;				
				http.open("GET", url, true); 
				http.onreadystatechange = handleStageDeleteComplete; 
				http.send(null);			
			}
			
			visableStage--;
			drawableStages--;			

		}
	}
	
	
	
	function handleStageDeleteComplete() {
	
		if (http.readyState == 4) {
			
			if (http.status == 200) {
				//TODO: Check db commit		
			} else {
				alert("The remote procedure ended with the following error code: " + http.status);			  
			}
			
		} else {

		}		

	}


	function addInvestor() {
		
		editedInvestors=true;

		// make all investors editable so they can be moved around.
		editInvestor();

		investors.push(new Array(5));
		investors[investors.length-1][0]=-1;
		investors[investors.length-1][1]='';
		investors[investors.length-1][2]=-1;
		investors[investors.length-1][3]=-1;
		investors[investors.length-1][4]=investors.length;
		
		
		drawInvestorRow(investors.length-1, investors[investors.length-1][4], true, '','',-1);
		
		for(var i=0; i<equityData.length; i++) {
			equityData[i].push(0);
		}
		
		investorRemoved.push(0);
		investorRemoved[investorRemoved.length-1]=false;				
	}
	
	function editInvestor() {

		var i, v, n;
		
		editedInvestors=true;		

		for(i=0; i<investors.length; i++) {			
			v=document.getElementById('txtShareHolder-' + investors[i][4]).value;
			
			n=investors[i][1];
			if (document.getElementById('txtShareHolderName-' + investors[i][4])) {
				n=document.getElementById('txtShareHolderName-' + investors[i][4]).value;
			}
			
			document.getElementById('tbEditShareHolders').deleteRow(i+1);	
			drawInvestorRow(i, investors[i][4], true, n, v, investors[i][2])
		}
		
	}

	
	function drawInvestorRow(rowIdx, invIdx, editable, shName, shValue, shType) {
		
		// shift up one from header.		
		var x=document.getElementById('tbEditShareHolders').insertRow(rowIdx+1);
		var c1=x.insertCell(0); c1.width=65;
		var c2=x.insertCell(1); c2.width=10;
		var c3=x.insertCell(2); c3.width=70;
		var c4=x.insertCell(3); c4.width=70;
		var c5=x.insertCell(4); c5.width=70;
			
		c3.innerHTML="<input type='text' style='width:80px' onkeyup='Javascript:displayCalcTotal();' ID='txtShareHolder-" + invIdx  +"' value='" + shValue + "'>";
		
		if (editable) {		
			c1.innerHTML="<input type='text' style='width:80px' ID='txtShareHolderName-" + invIdx  +"' value='" + shName + "'>";
			c4.innerHTML=buildTypeSelect(invIdx,shType);
			c5.innerHTML= "<a href='#' onClick='Javascript:removeInvestorDisplay(" + invIdx + ");'><img src='img/remove.png' alt='Remove Shareholder'></a>";
			c5.innerHTML=c5.innerHTML+"&nbsp;<a href='#' onClick='Javascript:moveInvestor(" + invIdx + ",-1);'><img src='img/arrowup.png' alt='Move Up'></a>";
			c5.innerHTML=c5.innerHTML+"&nbsp;<a href='#' onClick='Javascript:moveInvestor(" + invIdx + ",1);'><img src='img/arrowdown.png' alt='Move Down'></a>";
		} else {
			c1.innerHTML= shName;
			c4.intnerHTML = "&nbsp;";
			c5.intnerHTML = "&nbsp;";
		}
		
		
	}
	
	function displayCalcTotal() {
		
		if (valMeasure==0) {
			var total = calcTotal();
		
			if (!isNaN(total)) {				
				document.getElementById('statusdisp').innerHTML = 'Allocated shares: ' + total + '%';
				if (total!=100) {
					document.getElementById('statusdisp').style.color = "#B00008";
				} else {
					document.getElementById('statusdisp').style.color = "#000000";
				}
			} else {
				document.getElementById('statusdisp').innerHTML = 'Allocated shares: --%';
			}
		}
		
	}
	
	var flashCount=0; 
	
	function calcValueFlash() {

		if (flashCount%2==0) {
			document.getElementById('statusdisp').style.backgroundColor = '#B00008';
			document.getElementById('statusdisp').style.color = '#ffffff';
			
		} else {
			document.getElementById('statusdisp').style.backgroundColor = '#FFFFFF';		
			document.getElementById('statusdisp').style.color = '#B00008';
		}

	

		if (flashCount<5) { 
			flashCount++;
			setTimeout('calcValueFlash()', 100); 
		} else {
			flashCount=0;
		}
			
	}
	
	function calcTotal() {
		
		var v, i,total=0,offset=0;
		
		for(i=0; i<investors.length; i++) {
			if (!investorRemoved[i]) {
			//if (document.getElementById('txtShareHolder-' + investors[i][4])) {
				v = document.getElementById('txtShareHolder-' + (investors[i][4]-offset)).value
				if (v.length>0) {total += parseFloat(v);}
			} else {
				offset+=1;
			}

		}
		
		return total;

	}

	function removeInvestorDisplay(idx) {

		var j, rowIdx, shName, shType, shValue;
		
		investorRemoved[idx-1] = true;
		
		// add one due to header
		document.getElementById('tbEditShareHolders').deleteRow(idx-1+1);		
		
		var rowCount = document.getElementById('tbEditShareHolders').rows.length;
		
		for(j=idx; j<(rowCount);j++) {						
		
			// add one due to header
			rowIdx = j-1;
			
			c=document.getElementById('tbEditShareHolders').rows[rowIdx+1].cells[0];
			shName = c.childNodes[0].value;
			c=document.getElementById('tbEditShareHolders').rows[rowIdx+1].cells[2];
			shValue = c.childNodes[0].value;			
			c=document.getElementById('tbEditShareHolders').rows[rowIdx+1].cells[3];
			shType = c.childNodes[0].value;
						
			document.getElementById('tbEditShareHolders').deleteRow(rowIdx+1);	
			drawInvestorRow(rowIdx, investors[rowIdx][4], true, shName, shValue, shType)
		}
		
		displayCalcTotal();
	}
	
	function removeInvestors() {
		
		var i,k,j,base,idx;
		var stageInvested;
		base=0;
		
		for (i=0; i<investors.length; i++) {
			if (investorRemoved[i]) {
				
				idx = i+1;
				
				for(j=0; j<investors.length;j++) {
					if ((investors[idx-1][2]==investors[j][2]) & (investors[idx-1][3]<investors[j][3])) {
						investors[j][3]=investors[j][3]-1;
					}
					
					if (investors[idx-1][4]<investors[j][4]) {
						investors[j][4]=investors[j][4]-1;
					}
				}
				
				// find when the investor first invested
				var shChange = new Array(investors.length);
				for(j=0; j<investors.length; j++) {shChange[j]=0;}
						
				for(j=0; j<equityData.length; j++) {
					if (equityData[j][idx-1]>0) {
						stageInvested=j+1;
						shChange[idx-1] = 0 - parseFloat(equityData[j][idx-1]);
						equityData[j][idx-1] = 0;
						j = equityData.length+1;
					}			
				}
				// update percentages of first stage with investor removed
				var sumOld=-shChange[idx-1];
				for(j=0; j<investors.length; j++) {sumOld+=equityData[stageInvested-1][j];}
				var sumNew = sumOld + shChange[idx-1];		
				for(j=0; j<investors.length; j++) {
					equityData[stageInvested-1][j] = (sumOld/sumNew) * equityData[stageInvested-1][j];
				}
				// propagate changes through to subsequent stages
				propagateEquity(stageInvested, editStage-1, shChange);
				propagated=true;
				
				investors.splice(idx-1,1);
				for(j=0; j<equityData.length; j++) {equityData[j].splice(idx-1,1);}
			
			}
		}
		
	}
	
	
	

	function updateInvestorsLocal() {
		
		var i,j,c,e;
		var tmp;
		
		for(i=0; i<investors.length; i++) {
			e = document.getElementById('txtShareHolderName-' + investors[i][4]);
			if (e!=null) {investors[i][1]=e.value;}
			
			e = document.getElementById('selShareHolderType-' + investors[i][4]);
			if (e!=null) {
				tmp = investors[i][2];
				investors[i][2]=parseInt(e.value);
				if (tmp!=investors[i][2]) {investors[i][3]=-1}
			}

			if (investors[i][3]==-1) {
				c=0;
				for(j=0; j<investors.length; j++) {					
					if (investors[j][2]==investors[i][2]) {
						if (investors[j][3]>c) {c=investors[j][3];}
					}
					
				}
				investors[i][3]=c+1;
			}
		}
		
		if (local) {
			drawInvestorTable();			
			updateStageLocal();
		}

	}

	function updateInvestorsRemote() {
		
		var url,i;
		url = "shareHoldersUpdateInline.php?CID="+ CID + "&Investors=" + investors.length;
		
		for(i=0; i<investors.length; i++) {
			url = url + "&InvID"+ i + "=" + investors[i][0] + "&";
			url = url + "InvName"+ i + "=" + investors[i][1] + "&";
			url = url + "InvType"+ i + "=" + investors[i][2] + "&";
			url = url + "InvTypeIdx"+ i + "=" + investors[i][3] + "&";
			url = url + "InvIdx"+ i + "=" + investors[i][4];			
		}	

		//window.location = url;

		http.open("GET", url, true); 
		http.onreadystatechange = parseUpdateInvestors; 
		http.send(null);		
	}
		
		
	function moveInvestor(invIdx,direction) {
		
		var rowIdx1,rowIdx2,invIdx1,indIdx2,shName1,shName2,shValue1,shValue2,shType1,shType2;
		var t,i;
		
		if (invIdx+direction<0) {return;}
		if (invIdx+direction>investors.length) {return;}
		
		invIdx1=invIdx;
		invIdx2=invIdx+direction;
		
		rowIdx1=invIdx1-1; rowIdx2=invIdx2-1;
		
		shName1=document.getElementById('txtShareHolderName-' + invIdx1).value;
 		shName2=document.getElementById('txtShareHolderName-' + invIdx2).value;

		shType1=document.getElementById('selShareHolderType-' + invIdx1).value;
 		shType2=document.getElementById('selShareHolderType-' + invIdx2).value;

		shValue1=document.getElementById('txtShareHolder-' + invIdx1).value;
 		shValue2=document.getElementById('txtShareHolder-' + invIdx2).value;

		// swap investor info (except the idx which is in the last cell)
		for(i=0; i<(investors[invIdx1-1].length0-1); i++) {
			t=investors[invIdx1-1][i];
			investors[invIdx1-1][i]=investors[invIdx2-1][i]
			investors[invIdx2-1][i]=t;
		}
		
		// swap within equity data
		for(i=0; i<equityData.length; i++) {
			t=equityData[i][invIdx1-1];
			equityData[i][invIdx1-1]=equityData[i][invIdx2-1];
			equityData[i][invIdx2-1]=t;
		}

		t = invIdx1; invIdx1=invIdx2; invIdx2=t;
						
		if (rowIdx1<rowIdx2) {
			document.getElementById('tbEditShareHolders').deleteRow(rowIdx2+1);	
			document.getElementById('tbEditShareHolders').deleteRow(rowIdx1+1);	
						
			drawInvestorRow(rowIdx1, invIdx2, true, shName2, shValue2, shType2);
			drawInvestorRow(rowIdx2, invIdx1, true, shName1, shValue1, shType1);
		} else  {					
			document.getElementById('tbEditShareHolders').deleteRow(rowIdx1+1);	
			document.getElementById('tbEditShareHolders').deleteRow(rowIdx2+1);			
			
			drawInvestorRow(rowIdx2, invIdx1, true, shName1, shValue1, shType1);
			drawInvestorRow(rowIdx1, invIdx2, true, shName2, shValue2, shType2);
		}

		
		
	}
		
	function parseUpdateInvestors() {
		
		if (http.readyState == 4) {
			if (http.status == 200) {
				// oInvestors is the XML node called 'products'
				var oInvestors = http.responseXML.documentElement;
				
				// retrieve an array of all its 'item' childs
				var tItems = xmlChildNodes(oInvestors,'investor');
				
				investors = new Array(tItems.length);
				
				for (var i = 0; i < tItems.length; ++i)
				{
					var attrib = xmlAttributes(tItems[i]);
					
					investors[i]=new Array(5);
					investors[i][0]=parseInt(attrib['invid']);
					investors[i][1]=attrib['name'];
					investors[i][2]=parseInt(attrib['invType']);
					investors[i][3]=parseInt(attrib['invTypeIdx']);				
					investors[i][4]=parseInt(attrib['InvIdx']);					
				}
				
				updateStageLocal();
				if(!local) {updateStageRemote();}											
			} else {
				alert("The remote procedure ended with the following error code: " + http.status);			  
			}
		} else {

		}				
		
		if (!local) {
			drawInvestorTable();
		}

	}


	function buildTypeSelect(i,sel) {
		var i, s, seltxt;
		s = "<select ID='selShareHolderType-" + i + "'>";
		
		for(j=0;  j<investorTypes.length; j++) {
			seltxt = "";
			if (investorTypes[j][0]==sel) {seltxt = " selected ";}
			s=s+"<option value='"+investorTypes[j][0]+"'" + seltxt + ">" + investorTypes[j][1] + "</option>";
				
		}
		
		s = s + "</select>";
		return s;
	}

	function sortNumber(a, b)
	{
		return b - a
	}



	function getHTTPObject() {
		
		var xmlHttp;
		
		if (window.XMLHttpRequest){
			// If IE7, Mozilla, Safari, etc: Use native object
			xmlHttp = new XMLHttpRequest()
 	  	} else {
			if (window.ActiveXObject){
          		// ...otherwise, use the ActiveX control for IE5.x and IE6
          		xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			}
		}
	  
	  	return xmlHttp;
	}
	
	var http = getHTTPObject(); // We create the HTTP Object
	
	
    
	function LZ(x) {
    	return (x >= 10 || x < 0 ? "" : "0") + x;
	}


    function ddMMMyyyy(Ob) {
		var DA = new String("JanFebMarAprMayJunJulAugSepOctNovDec");
        with (Ob) {
            var M3 = 3 * getMonth();
            return LZ(getDate()) + "-" + DA.substring(M3, M3 + 3) + "-" + getFullYear();
        }
    }
	
    function MMMyyyy(Ob) {
		var DA = new String("JanFebMarAprMayJunJulAugSepOctNovDec");
        with (Ob) {
            var M3 = 3 * getMonth();
            return DA.substring(M3, M3 + 3) + "-" + getFullYear();
        }
    }

	
	function getDateString(y_obj,m_obj,d_obj) {
     var y = y_obj.options[y_obj.selectedIndex].value;
     var m = m_obj.options[m_obj.selectedIndex].value;
     var d = d_obj.options[d_obj.selectedIndex].value;
     if (y=="" || m=="") { return null; }
     if (d=="") { d=1; }
     return str= y+'-'+m+'-'+d;
     }
	 
	 
	 


