// +----------------------------------------------------------------------+
// | PageBreak.js                                                         |
// +----------------------------------------------------------------------+
// | Copyright (c) 2007 7i Solutions                                      |
// +----------------------------------------------------------------------+
// | Authors: Clemens Meier                                               |
// +----------------------------------------------------------------------+

function PageBreak(domElement,pageHeight,pageMargin){
	//var calc = 2.833; // px per mm
	var calc = 3.78; // px per mm
	printHeadHeight = document.getElementById('DivPrintingHeader').offsetHeight;
	printFootHeight = document.getElementById('DivPrintingFooter').offsetHeight;
	// alert(navigator.appName);
	document.getElementById(domElement).style.top = (printHeadHeight)+"px";
	document.getElementById(domElement).style.display = "block";
	contentHeight = pageHeight*10*calc-2*pageMargin*10*calc-printHeadHeight-printFootHeight;
	if(browser.isIE){
		contentHeight = contentHeight - 55; //was 50
	}else{
		contentHeight = contentHeight - 30;
	}
	DOMTreeTraverse(document.getElementById(domElement), 1, 0,domElement);
	document.close();
}

function PageBreakHeader(domElement,pageHeight,pageMargin){
	var calc = 3.78; // px per mm
	printHeadHeight = document.getElementById('DivPageHeaderOnce').offsetHeight;
	document.getElementById(domElement).style.display = "block";
	contentHeight = pageHeight*10*calc-2*pageMargin*10*calc;
	DOMTreeTraverse(document.getElementById(domElement),1,printHeadHeight,domElement);
	document.close();
}

var pageBreakDebugString = '';
pageBreakReportListFirstTrPassed = false;

function DOMTreeTraverse(inCurrentElement, depth, treeHeight,domElement){
	var currentElement = inCurrentElement;
  if (currentElement){
	  	var inTreeHeight= treeHeight;
	    var tagName   	= currentElement.tagName;
		var tagHeight 	= currentElement.offsetHeight;
		var tagMargin 	= currentElement.offsetHeight;
		var className 	= currentElement.className;
	    // Traverse the tree

	    var subTreeHeight		= 0;
	    var i 					= 0;
	    for(i=0;i<=currentElement.childNodes.length;i++){
	    	if(currentElement.childNodes[i]){

	    		var returnTreeHeight	= DOMTreeTraverse(currentElement.childNodes[i], depth+1, treeHeight,domElement);
	    		subTreeHeight			= returnTreeHeight-treeHeight;
	    		treeHeight 				= returnTreeHeight;
	    	}
	    }

	    var pageHeight	= treeHeight;
		if (depth==2){
			addDebugInfo(currentElement,depth,treeHeight);
		  if (currentElement.style){
				if (currentElement.className == "pageBreak") {
					treeHeight = 0;
				}
			}
			if (tagHeight && tagName != "pageBreak" && className != "pageBreakForced"){

				if (tagHeight<=contentHeight) {
					if(inTreeHeight==treeHeight)
						treeHeight = treeHeight+tagHeight;
				}

				addDebugInfo(currentElement,depth,treeHeight,' - ch:'+Math.round(contentHeight));
				if (treeHeight>contentHeight && currentElement.className!='ReportList'){
					//page break forced by script
					addDebugInfo(currentElement,depth,treeHeight,' PageBreak forced by script @ depth=2');
					var pageBreak = document.createElement("div");
					pageBreak.className = "pageBreakForced";
					currentElement.parentNode.insertBefore(pageBreak,currentElement);
				}
			}
		}else if(depth==3){
			if(tagHeight && treeHeight && currentElement.className!='ReportList'){
				addDebugInfo(currentElement,depth,treeHeight,' - depth 3');
				treeHeight = treeHeight+tagHeight;  //freezed den browser!!!
				if (treeHeight>contentHeight){
					addDebugInfo(currentElement,depth,treeHeight,' FORCE PAGEBREAK " depth 3');
					var pageBreak 			= document.createElement("div");
					pageBreak.className = "pageBreakForced";
					//markElement(pageBreak,'green');
					if(domElement && currentElement){
						currentElement.parentNode.insertBefore(pageBreak,currentElement);
						treeHeight = 0;
					}

				}
			}
			if(currentElement.className=="ReportList"){
				pageBreakReportListFirstTrPassed=false;
			}
		}else if(depth==5){
			if(currentElement.tagName=='TR'){
				addDebugInfo(currentElement,depth,treeHeight,'DD');
				var tableTag = currentElement.parentNode.parentNode;
				if(tableTag.className=='ReportList' && currentElement.parentNode.tagName=='TBODY'){
					if(tagHeight){
						treeHeight = treeHeight+tagHeight;
						if (treeHeight>contentHeight){
							if(pageBreakReportListFirstTrPassed==false){
								addDebugInfo(currentElement,depth,treeHeight,' PageBreak forced by script @ depth=5 before TABLE');
								tableTag.parentNode.style.pageBreakBefore="always";
							}else{
								addDebugInfo(currentElement,depth,treeHeight,' PageBreak forced by script @ depth=5 before TR');
								currentElement.style.pageBreakBefore="always";
							}
							treeHeight = 0;

							for(var k=0;k<=tableTag.childNodes.length;k++){
								if(tableTag.childNodes[k]){
									if(tableTag.childNodes[k].tagName=='THEAD'){
										treeHeight = tableTag.childNodes[k].offsetHeight+tagHeight;
									}
								}
							}
						}
						pageBreakReportListFirstTrPassed=true;
					}
				}
			}
		}
  	}

	if(depth==1){
	  	//alert(pageBreakDebugString);
	}
  return treeHeight;
}

function markElement(element,color){
	element.style.borderStyle="solid";
	element.style.borderWidth=1;
	element.style.borderColor=color;
	element.style.backgroundColor=color;
}

function addDebugInfo(currentElement,depth,treeHeight,text){
	string = '';
	for(i=0;i<=depth;i++){
		string+=' ';
	}
	string += ' '+Math.round(treeHeight);
	if(currentElement.tagName)
		string += ' t:'+currentElement.tagName;
	if(currentElement.className)
		string += ' c:'+currentElement.className;
	if(currentElement.offsetHeight)
		string += ' h:'+Math.round(currentElement.offsetHeight);
	if(text)
		string += text;
	string += '\n';
	pageBreakDebugString+=string;
}

