//
// Latex Project Public Licence (lppl1.3) applies
// Originally written by Kwanleung Tse
// First Release : 1st July, 2014
// Last Update : 27th September, 2014
//
//
package worker4math.hktex2;

import java.util.ArrayList;
import android.util.SparseArray;

public class Initdraw {

    public static int ii=0;
    public static int showpagenumber=0;
	
	SuperBlock superblock = new SuperBlock();
	Parsedocument parsedocument = new Parsedocument();
	public static SparseArray<ArrayList<Integer>> pageline = new SparseArray<ArrayList<Integer>>();
	public static SparseArray<ArrayList<Integer>> pageline2 = new SparseArray<ArrayList<Integer>>();
	public static Integer pagenumber = -1;
	public static Integer totalline=-1;
	public static float containerwidth2;
	public static float containerheight2;
	public static float height=0;
	
	public  void initdraw(float containerwidth,float containerheight){
		containerwidth2=containerwidth;
		containerheight2=containerheight;
		 float ypos=Header.firstypos+Header.topsidemargin+SuperBlock.superblocklineheight.get(0).get(0)-SuperBlock.superblocklinedepth.get(0).get(0); 
		 float viewportheight=containerheight-Header.topsidemargin-Header.bottomsidemargin;
		 
		 for (int i=0;i<=Header.nthread-1;i++){
			 for (int ii=0;ii<=SuperBlock.superblocklinenumber.get(i);ii++){
				 int index=i*1000+ii;				 
				 for (int iii=0;iii<=SuperBlock.blockatom.get(index).size()-1;iii++){			
					 float t=SuperBlock.blockypos.get(index).get(iii)+ypos;
					 SuperBlock.blockypos.get(index).set(iii, t);	
				 }
			 }

		 ypos=ypos+SuperBlock.ypos.get(i);
		 }
		 
		 pagenumber++;
		 pageline.put(pagenumber, new ArrayList<Integer>());
		 ypos=0.0f; 
		 float adjusty=0.0f;
		 for (int i=0;i<=Header.nthread-1;i++){

			 int i2=i*1000;
			 int tablenumber=1;

			 for (int ii=0;ii<=SuperBlock.superblocklinenumber.get(i);ii++){

				 int index=i2+ii;
				 if (tablenumber <=SuperBlock.tablenumber.get(i) && ii==SuperBlock.tablestartline.get(tablenumber+i2)){
					 float height2=SuperBlock.blockypos.get(index).get(0)-(SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii))+SuperBlock.tableheight.get(i2+tablenumber)-ypos;
					 
					 if (height2>viewportheight && !SuperBlock.pagebreak.get(i).contains(ii)){
						 
// If there is table which does not fit into current page, move the line behind the table ahead.

						 int j=i;
						 int j2=j*1000;
						 int jj=SuperBlock.tableendline.get(tablenumber+j2)+1;
		
						 if(jj>SuperBlock.superblocklinenumber.get(j) 
								 &&(tablenumber+1<=SuperBlock.tablenumber.get(j) && jj !=SuperBlock.tablestartline.get(tablenumber+j2+1))
								 && j<Header.nthread-1){jj=jj-SuperBlock.superblocklinenumber.get(j);j++;j2=j*1000;}		
						 int totalline2=totalline+(SuperBlock.tableendline.get(j2+tablenumber)-SuperBlock.tablestartline.get(i2+tablenumber))+2;

						 if (jj<=SuperBlock.superblocklinenumber.get(j) && (tablenumber+1>SuperBlock.tablenumber.get(j) || jj !=SuperBlock.tablestartline.get(tablenumber+j2+1))){

					 index=j2+jj; 
			
						 if (SuperBlock.blockatom.indexOfKey(index)<0){j++;j2=j*1000;jj=0;index=j2+jj;}
						 while (SuperBlock.blockypos.get(index).size()==0){jj++;index=j2+jj;totalline2++;};						 
						 float height=SuperBlock.blockypos.get(index).get(0)+SuperBlock.superblocklinedepth.get(j).get(jj)-SuperBlock.tableheight.get(i2+tablenumber)-ypos;

						 while(height<viewportheight 
								 && (tablenumber+1>SuperBlock.tablenumber.get(j) || jj !=SuperBlock.tablestartline.get(tablenumber+j2+1))
								 && !(jj== SuperBlock.superblocklinenumber.get(j) && j==Header.nthread-1)
								 && !SuperBlock.pagebreak.get(j).contains(jj)){								
							 
							 pageline.get(pagenumber).add(totalline2);							 
						 if (SuperBlock.blockypos.get(index).size()>0){
							 adjusty=SuperBlock.superblocklineheight.get(j).get(jj)+adjusty;
							 for (int jjj=0;jjj<=SuperBlock.blockatom.get(index).size()-1;jjj++){												 
								 float t=SuperBlock.blockypos.get(index).get(jjj)-ypos-SuperBlock.tableheight.get(i2+tablenumber);
								 SuperBlock.blockypos.get(index).set(jjj, t);									 								 
							 }}			
						 jj++;if(jj>SuperBlock.superblocklinenumber.get(j) && j<Header.nthread-1){j++;jj=0;j2=j*1000;}
						 index=j2+jj;
						 totalline2++;
						 height=SuperBlock.blockypos.get(index).get(0)+SuperBlock.superblocklinedepth.get(j).get(jj)-SuperBlock.tableheight.get(i2+tablenumber)-ypos;
						 } 
						 if(height<viewportheight && (jj== SuperBlock.superblocklinenumber.get(j) && j==Header.nthread-1)){	
							 pageline.get(pagenumber).add(totalline2);							 
						 if (SuperBlock.blockypos.get(index).size()>0){
							 adjusty=SuperBlock.superblocklineheight.get(j).get(jj)+adjusty;
							 for (int jjj=0;jjj<=SuperBlock.blockatom.get(index).size()-1;jjj++){												 
								 float t=SuperBlock.blockypos.get(index).get(jjj)-ypos-SuperBlock.tableheight.get(i2+tablenumber);								 
								 SuperBlock.blockypos.get(index).set(jjj, t);	
							 }}									 
						 } 
						 }
// Now adjust the table						 
							 pagenumber++;									 
							 pageline.put(pagenumber,new ArrayList<Integer>());
						 index=i2+ii; 
								 float t=Header.topsidemargin+SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii);
								 ypos=SuperBlock.blockypos.get(index).get(0)-t;
								 if (((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber==1){ypos=ypos-SuperBlock.titleheight.get(0);}
								 
					  for (ii=SuperBlock.tablestartline.get(i2+tablenumber);ii<=SuperBlock.tableendline.get(i2+tablenumber);ii++){
						  index=i2+ii;
							 totalline++;pageline.get(pagenumber).add(totalline);
						 for (int iii=0;iii<=SuperBlock.blockatom.get(index).size()-1;iii++){			
							 t=SuperBlock.blockypos.get(index).get(iii)-ypos;
							 SuperBlock.blockypos.get(index).set(iii, t);	
						 }						 
					  }
					  totalline=totalline2-1;					  
					  i=j;
					  i2=i*1000;	
					  tablenumber++;
					  if (jj== SuperBlock.superblocklinenumber.get(j) && j==Header.nthread-1) {ii=jj;} else{ii=jj-1;}	
					  index=i2+ii;
					  if (SuperBlock.pagebreak.get(i).contains(ii)){
							 pagenumber++;		
							 if (SuperBlock.pagebreak.get(i).contains(ii) && ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber%2==1){pagenumber++;};
							 pageline.put(pagenumber, new ArrayList<Integer>());
							 t=Header.topsidemargin+SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii);
							 ypos=SuperBlock.blockypos.get(index).get(0)-t;
					  } else {
						  ypos=ypos+adjusty;
						  adjusty=0.0f;
					  }
			
				 } else if (!SuperBlock.pagebreak.get(i).contains(ii)){
					 
//  table can fit into current page.					 
					 totalline++;
					 if (SuperBlock.blockypos.get(index).size()>0){
						 float height=SuperBlock.blockypos.get(index).get(0)+SuperBlock.superblocklinedepth.get(i).get(ii)-ypos;
						 if (height>viewportheight && SuperBlock.pagebreak.get(i).contains(ii)){
							 pagenumber++;		
							
							 if (SuperBlock.pagebreak.get(i).contains(ii) && ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber%2==1){pagenumber++;};
							 pageline.put(pagenumber, new ArrayList<Integer>());
								 float t=Header.topsidemargin+SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii);
								 ypos=SuperBlock.blockypos.get(index).get(0)-t;
								 if (((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber==1){ypos=ypos-SuperBlock.titleheight.get(0);}
						 } 
						 pageline.get(pagenumber).add(totalline);
						 
						 for (int iii=0;iii<=SuperBlock.blockatom.get(index).size()-1;iii++){			
							 float t=SuperBlock.blockypos.get(index).get(iii)-ypos;
							 SuperBlock.blockypos.get(index).set(iii, t);	
						 }}
				 }else { 
// pagebreak, new page for table or graphics					 
					 totalline++;
				 if (SuperBlock.blockypos.get(index).size()>0){
				 float height=SuperBlock.blockypos.get(index).get(0)+SuperBlock.superblocklinedepth.get(i).get(ii)-ypos;

				 if (height>viewportheight || SuperBlock.pagebreak.get(i).contains(ii)){
					 pagenumber++;		
					 if (SuperBlock.pagebreak.get(i).contains(ii) && ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber%2==1){pagenumber++;};
					 pageline.put(pagenumber, new ArrayList<Integer>());
						 float t=Header.topsidemargin+SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii);
						 ypos=SuperBlock.blockypos.get(index).get(0)-t;
						 if (((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber==1){ypos=ypos-SuperBlock.titleheight.get(0)-Header.firstypos;}
				 } 
				 pageline.get(pagenumber).add(totalline);
				 for (int iii=0;iii<=SuperBlock.blockatom.get(index).size()-1;iii++){			
					 float t=SuperBlock.blockypos.get(index).get(iii)-ypos;
					 SuperBlock.blockypos.get(index).set(iii, t);	
				 }}
				 }
				 }  else { 
// Not table nor graphics					 
					 totalline++;
				 if (SuperBlock.blockypos.get(index).size()>0){
				 float height=SuperBlock.blockypos.get(index).get(0)+SuperBlock.superblocklinedepth.get(i).get(ii)-ypos;

				 if (height>viewportheight || SuperBlock.pagebreak.get(i).contains(ii)){					 
					 pagenumber++;		
					 if (SuperBlock.pagebreak.get(i).contains(ii) && ((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber%2==1){pagenumber++;};
					 pageline.put(pagenumber, new ArrayList<Integer>());
						 float t=Header.topsidemargin+SuperBlock.superblocklineheight.get(i).get(ii)-SuperBlock.superblocklinedepth.get(i).get(ii);
						 ypos=SuperBlock.blockypos.get(index).get(0)-t;
						 if (((Header.tablet && Header.tablet_twocolumns) || (!Header.tablet && Header.phone_twocolumns)) && pagenumber==1){ypos=ypos-SuperBlock.titleheight.get(0)-Header.firstypos;}
				 } 
				 pageline.get(pagenumber).add(totalline);
				 for (int iii=0;iii<=SuperBlock.blockatom.get(index).size()-1;iii++){			
					 float t=SuperBlock.blockypos.get(index).get(iii)-ypos;
					 SuperBlock.blockypos.get(index).set(iii, t);	
				 }}
				 }
			 }
		 }
		 return;
	}	
}