﻿/*************************************************************************
*
* ADOBE CONFIDENTIAL
* ___________________
*
*  Copyright 2008 Adobe Systems Incorporated
*  All Rights Reserved.
*
* NOTICE:  All information contained herein is, and remains
* the property of Adobe Systems Incorporated and its suppliers,
* if any.  The intellectual and technical concepts contained
* herein are proprietary to Adobe Systems Incorporated and its
* suppliers and may be covered by U.S. and Foreign Patents,
* patents in process, and are protected by trade secret or copyright law.
* Dissemination of this information or reproduction of this material
* is strictly forbidden unless prior written permission is obtained
* from Adobe Systems Incorporated.
*
* $DateTime: 2008/04/10 13:35:00 $
*
* Adobe Output Module 2.0
*
* MediaGallery Originally Written by Quality Process Incorporated, Enhanced by
* Adobe System China. Contact Sheet written by Adobe System China.
* 
*
**************************************************************************/

AOM.CS.PDFMaker = function(document) {
	//this.controllerObj = controllerObj;
	
	this.errorMsg = undefined;
	this.errorNo = undefined;
	this.document = document;
	
	//init
}


AOM.CS.PDFMaker.prototype.destroy = function() {
	//this.controllerObj = undefined;
	this.errorMsg = undefined;
	this.errorNo = undefined;
}


AOM.CS.PDFMaker.prototype.alertMsg = function(msg) {
	alert(AOM.localize(msg));
}

AOM.CS.PDFMaker.prototype.confirmMsg = function(msg) {
	return confirm(AOM.localize(msg));
}



AOM.CS.PDFMaker.prototype.initPageLayoutValues = function() {
	var userInput = AOM.userInput(this.document);
	
	var toUnit = AOM.CSConstant.UNIT_PIXELS;
	var fromUnit = userInput.get("pageUnit");
	
	this.dimension = [
		userInput.getMeasuredValue("pageWidth", fromUnit, toUnit), 
		userInput.getMeasuredValue("pageHeight", fromUnit, toUnit)
	];
	
	this.arrange = [userInput.get("pageColumns"), userInput.get("pageRows")];
	
	this.margins = [
		userInput.getMeasuredValue("topMargin", fromUnit, toUnit), 
		userInput.getMeasuredValue("bottomMargin", fromUnit, toUnit), 
		userInput.getMeasuredValue("leftMargin", fromUnit, toUnit), 
		userInput.getMeasuredValue("rightMargin", fromUnit, toUnit),
	];
	
	this.spacings = [
		userInput.getMeasuredValue("verticalSpacing", fromUnit, toUnit),
		userInput.getMeasuredValue("horizontalSpacing", fromUnit, toUnit), 
	];
}

AOM.CS.PDFMaker.prototype.initOtherValues = function() {
	var userInput = AOM.userInput(this.document);
		
	//set resolution
	var resolution = userInput.get("pdfPreset");
	var offset = resolution.indexOf("_", 0);
	var resolutionFromUnit = resolution.substring(0, offset);
	var resolutionValue = resolution.substring(offset + 1, resolution.length);
	this.resolution = AOM.CS.Locale.parseFloat(
		AOM.CS.CommonFuncs.unitConvertion(resolutionFromUnit,  AOM.CSConstant.UNIT_INCHES, resolutionValue));
		
	//set backgroundColor
	var bgColor = eval(userInput.get("pageBackgroundColor"));
	for (var i = 0; i < bgColor.length; i++) {
		bgColor[i] = Math.round(bgColor[i] * 255);
	}
	this.bgColor = bgColor;
	
	//set rotateTofit
	this.hasRotateToFit = AOM.CS.CString.strToBoolean(userInput.get("hasRotate"));
		
	//set filename and fileextension
	this.hasFileName = AOM.CS.CString.strToBoolean(userInput.get("hasFileName"));
	this.hasExtension = AOM.CS.CString.strToBoolean(userInput.get("hasExtension"));
	var imagePlacement = userInput.get("imagePlacement");
	if (imagePlacement != undefined && imagePlacement == "column") {
		this.imagePlacement = true;
	} else {
		this.imagePlacement = false;
	}

	//set userPassword and print permission
	this.hasDocPass = AOM.CS.CString.strToBoolean(userInput.get("hasDocPass"));
	this.docPass = userInput.get("docPass");
	this.hasDocOwnerPass = AOM.CS.CString.strToBoolean(userInput.get("hasDocOwnerPass"));
	this.docOwnerPass = userInput.get("docOwnerPass");
	
	var disablePrint = AOM.CS.CString.strToBoolean(userInput.get("disablePrint"));
	if (disablePrint == true) {
		this.hasPrintPermission = false;
	} else {
		this.hasPrintPermission = true;
	}

	//set fullscreen and transition
	this.hasFullScreen = AOM.CS.CString.strToBoolean(userInput.get("hasFullScreen"));
	var transition = userInput.get("transition");
	if(transition=="None") {
		transition = undefined ; 
	} else {
		var direction = userInput.get("direction");
		if (direction != undefined && direction != "undefined") {
			transition += direction;
		}
	}
	this.transition = transition;
	var speed = userInput.get("speed");
	var speedValue;
	if (speed == AOM.CSConstant.SPEED_FAST) {
		speedValue = AOM.CSConstant.SPEED_FAST_VALUE; 
	} else if (speed == AOM.CSConstant.SPEED_MEDIUM) {
		speedValue = AOM.CSConstant.SPEED_MEDIUM_VALUE;
	} else if (speed == AOM.CSConstant.SPEED_SLOW) {
		speedValue = AOM.CSConstant.SPEED_SLOW_VALUE;
	} else {
		speedValue = AOM.CSConstant.SPEED_MEDIUM_VALUE;
	}
	this.speed = speedValue;
	
	this.hasDuration = AOM.CS.CString.strToBoolean(userInput.get("hasAdvance"));
	this.duration = AOM.CS.CString.strToNumber(userInput.get("advanceSeconds"));
	this.hasLoop = AOM.CS.CString.strToBoolean(userInput.get("hasLoop"));
	
	//set font
	this.fontStyle = userInput.get("fileNameFont");
	this.fontFace = userInput.get("fileNameFontFace");
	if (this.hasFileName) {
		this.fontSize = parseInt(userInput.get("fileNameSize"));
	} else {
		this.fontSize = 0;
	}
	var fontColor = eval(userInput.get("fontForegroundColor"));
	for (var i = 0; i < fontColor.length; i++) {
		fontColor[i] = Math.round(fontColor[i] * 255);
	}
	this.fontColor = fontColor;
	
	//add watermark
	var watermarkText = userInput.get("watermarkText");
	if (watermarkText == undefined) {
		this.watermarkText = "";
	} else {
		this.watermarkText = AOM.CS.CString.trim(watermarkText);
	}

	if (this.watermarkText.length > 0) {
		this.watermarkFont = userInput.get("watermarkFont");
		this.watermarkFontFace = userInput.get("watermarkFontFace");
		this.watermarkFontSize = parseInt(userInput.get("watermarkFontSize"));
		var watermarkColor = eval(userInput.get("watermarkColor"));
		for (var i = 0; i < watermarkColor.length; i++) {
			watermarkColor[i] = Math.round(watermarkColor[i] * 255);
		}
		this.watermarkColor = watermarkColor[0] << 16 | watermarkColor[1] << 8 | watermarkColor[2];
		this.watermarkOpacity = userInput.get("watermarkOpacity") / 100;
		this.watermarkHasBackground = AOM.CS.CString.strToBoolean(userInput.get("hasWatermarkBackground"));
	}
	
    this.hasRepeatPerPage = AOM.CS.CString.strToBoolean(userInput.get("hasRepeatPerPage"));
}


AOM.CS.PDFMaker.prototype.checkPageLayout = function() {
	/*
	var gfx = this.controllerObj.graphics;
	
	var minFontSize = this.computeFontMinimizeSize(gfx, this.fontStyle, this.fontSize);
	
	var status = 
		this.checkLayoutValues(this.dimension, this.arrange, this.margins, this.spacings, minFontSize) ;
		
	if (status == AOM.CSConstant.LAYOUT_ROW_OVERSIZE) {
		this.errorMsg = "$$$/ContactSheet/javascript/pdfGenerator/rowOversize=PageLayout Settings Error: total width is oversized.";
		return false;
	} 

	if (status == AOM.CSConstant.LAYOUT_COL_OVERSIZE) {
		this.errorMsg = "$$$/ContactSheet/javascript/pdfGenerator/colOversize=PageLayout Settings Error: total height is oversized.";
		return false;
	} 
	
	return true;
	*/
}



AOM.CS.PDFMaker.prototype.createPDFGenerator = function(preview) {
	var g = new AOM.PDFGenerator(this.document);
	g.setPageLayout(this.dimension, this.arrange, this.margins, this.spacings);
	g.setFontSize(this.fontSize);
	g.setFontStyle(this.fontStyle, this.fontFace);
	g.setFontColor(this.fontColor[0], this.fontColor[1], this.fontColor[2]);
	
	g.setBackgroundColor(this.bgColor[0], this.bgColor[1], this.bgColor[2]);
	g.setResolution(this.resolution);
	g.setRotateToFit(this.hasRotateToFit);

	if (this.hasFileName) {
		g.setFilename(true);
		g.setFileExtension(this.hasExtension);
	} else {
		g.setFilename(false);
		g.setFileExtension(false);
	}
	
	//TODO 
	if (this.imagePlacement) {
		g.setPlaceByColumn(true);
	}

    if (!preview) {
		if (this.hasDocPass) {
			g.setUserPassword(this.docPass);
		}
		if (this.hasDocOwnerPass) {
			g.setOwnerPassword(this.docOwnerPass);
		}
	
		if (this.hasPrintPermission == false) {
			g.setPrintPermission(this.hasPrintPermission);
		}
	}
    
    g.setFullScreenMode(this.hasFullScreen);
    
	if (this.transition!= undefined) {
		g.setTransitionMode(this.transition, this.speed);
	}

	if (this.hasDuration) {
		g.setPageDuration(this.duration);
	}
	g.setLoop(this.hasLoop);
	
	//add watermark
	if (this.watermarkText.length > 0) {
		g.setWatermark(this.watermarkText, this.watermarkFont, 
							this.watermarkFontFace, this.watermarkFontSize, 
							this.watermarkColor, this.watermarkOpacity,
							this.watermarkHasBackground);
	}
	
	g.setRepeatOnPage(this.hasRepeatPerPage);
	
	return g;
}

AOM.CS.PDFMaker.prototype.hasAutoLayout = function() {
	var isAutoLayout = AOM.CS.CString.strToBoolean(AOM.userInput(this.document).get("hasUseAutoSpacing"));
	
	return isAutoLayout;
}


//main function
AOM.CS.PDFMaker.prototype.generatePDF = function(preview) {

	var taskManager = AOM.TaskManager.find("GeneratePDF" + this.document.id);
	if(taskManager != undefined &&
	   (taskManager.state == "running" || taskManager.state == "paused"))
		return;

	var currentUserInput = AOM.userInput(this.document);
	var hasDocPass = AOM.CS.CString.strToBoolean(currentUserInput.get("hasDocPass"));
	var docPass = currentUserInput.get("docPass");
	var hasDocOwnerPass = AOM.CS.CString.strToBoolean(currentUserInput.get("hasDocOwnerPass"));
	var docOwnerPass = currentUserInput.get("docOwnerPass");
	
	if(!preview) {
		if(hasDocPass && (docPass == undefined || docPass.length == 0)) {
			alert(AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/passwordEmpty=Document user password is empty. Please either deselect the 'Open Password' option or enter a password."));
			return false;
		}
		if(hasDocOwnerPass && (docOwnerPass == undefined || docOwnerPass.length == 0)) {
			alert(AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/ownerPasswordEmpty=Document owner password is empty. Please either deselect the 'Permission Password' option or enter a password."));
			return false;
		}
		if (hasDocPass && hasDocOwnerPass && (docPass == docOwnerPass)) {
			alert(AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/passwordsCantBeSame=Document user password and owner password are identical. Please change either 'Document Password' or 'Permission Password'."));
			return false;
		}
	}
	
	//init pagelayout and validate
	if (this.hasAutoLayout()) {
		this.autoLayout();
	} else {
		this.initPageLayoutValues();
	}
	
	//if (this.checkPageLayout() == false) {
		//this.alertMsg(this.errorMsg);
		//return false;
	//}

	//check if select file
	var selections = this.document.selections;
	if (selections.length == 0) {
		this.alertMsg("$$$/ContactSheet/javascript/pdfGenerator/noSelectThumbnail=No item is selected. Please select at least one item and try again.");
		return false;
	}
	
	//init other values
	this.initOtherValues();
	
	this.dumpAll();
	
	//create pdfgenerator
	var g = this.createPDFGenerator(preview);
	
	if (!g.validatePageLayout()) {
		this.alertMsg("$$$/ContactSheet/javascript/pdfGenerator/validatefail=The specified page layout does not provide enough room for image display. \nPlease reduce number of columns, rows, amount of spacings, margins, or font size.");
		return false;
	}
	
	var saveFile = File(AOM.CS.Paths.userData + "preview.pdf");
	if (preview == undefined || !preview) {
    	//call save dialog
		saveFile = File.saveDialog(AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/savebutton=Save..."), "*.pdf");
		
		if (saveFile == null)  return ;
		
		if (File.fs == "Macintosh") {
			var saveFileFullPath = AOM.CS.CString.trim(saveFile.fsName);
			if(saveFileFullPath.search(/\.pdf$/i) < 0) {
				function xtractFile_sans(data){
					var m = data.match(/(.*)[\/\\]([^\/\\]+)$/);
					return {path: m[1], file: m[2]};
				}
				var mypaths = xtractFile_sans(saveFileFullPath);
				var newSaveFileName = mypaths.path + "/" +  AOM.CS.CString.trim(mypaths.file) + ".pdf";
				
				saveFile = new File(newSaveFileName);
			}
		}
	
		if (saveFile.exists == true) {
			var hasConfirm = this.confirmMsg("$$$/ContactSheet/javascript/pdfGenerator/overwriteExistFile=File already exists. Do you want to overwrite it?");
			if (hasConfirm == false) {
				return false;
			}
		}
	}
	
	//var controller = this.controllerObj;
	var pdfMaker = this;
	
	//g.viewPDF = controller.parent.hasViewPdf.value;
	g.viewPDF = AOM.CS.CString.strToBoolean(AOM.userInput(this.document).get("hasViewPdf"));
	g.onStopDetail = function() {
	    return pdfMaker.processStatus(g, g.viewPDF, preview);
    }
	g.onStop = function() { 
		pdfMaker.processAction(g, g.viewPDF, preview);
	}
	
    var count = preview ? Math.min((AOM.userInput(this.document).get("pageRows")*AOM.userInput(this.document).get("pageColumns")), selections.length) : selections.length;
	if (preview) {
		g.setUserPassword(undefined);
		g.setOwnerPassword(undefined);
	}

    g.exportPDF(AOM.CS.CString.trim(saveFile.fsName), 1, 6, count, preview);
	
	return true;
}

AOM.CS.PDFMaker.prototype.processStatus = function(g, viewPDF, previewPDF) {
    var hasError =((g.errorList != undefined) && (g.errorList.length > 0));

	if (g.onStopCode > 0) {
		if(hasError) {
			return AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/selectSomeNoneImageFile=Some of the selected files are not image files.");
		}
		return AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/pdfGenerated=PDF generated successfully.")
	} else if (g.onStopCode == 0) {
		if (hasError) {
			return AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/selectAllNoneImageFile=None of the selected files is image file.");
		} else {
			return AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/noSelectThumbnail=No item is selected. Please select at least one item and try again.");
		}
	} else if (g.onStopCode == -1) {
		return AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/specFileCannotOverwrite=Specified file cannot be overwritten.");
	} else if (g.onStopCode == -2) {
		return AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/specDirectoryNotExist=Specified directory does not exist.");
	} else if (g.onStopCode == -3) {
		return AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/notInvokeSetPageLayoutInAdvance=The function setPageLayout is not invoked in advance.");
	} else if (g.onStopCode == -4) {
		return AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/unknownReason=Generate PDF failed due to unknown reason.");
	} else {
		return AOM.localize("$$$/ContactSheet/javascript/pdfGenerator/unknownReason=Generate PDF failed due to unknown reason.");
	}
}

AOM.CS.PDFMaker.prototype.processAction = function(g, viewPDF, previewPDF) {
	if (g.onStopCode > 0) {
		if (viewPDF && !previewPDF) {
			var t = new Thumbnail(File(g.filename));
			t.open();
		}
	}
}


AOM.CS.PDFMaker.prototype.dumpPageLayout = function() {
	AOM.CS.Log.writeError("dimension:" + this.dimension + ",arrange:" + this.arrange + ",margins:" + this.margins + ",spacing:" + this.spacings);
	AOM.CS.Log.writeError("fontSize:" + this.fontSize + ",fontStyle:" + this.fontStyle + "," + this.fontFace + ",fontColor:" + this.fontColor);
}


AOM.CS.PDFMaker.prototype.dumpAll = function() {
	this.dumpPageLayout();
	
	AOM.CS.Log.writeError("backgroundColor" + this.bgColor);
	AOM.CS.Log.writeError("resolutionValue = " + this.resolution);
	AOM.CS.Log.writeError("hasRotate:" + (this.hasRotateToFit == true) + ", hasRepeatPerPage=" + this.hasRepeatPerPage);
	AOM.CS.Log.writeError("hasFileName:" + (this.hasFileName == true) + ",	hasExtension:" + (this.hasExtension == true) + ", imagePlacement:" +this.imagePlacement);
	AOM.CS.Log.writeError("hasDocPass:" + this.hasDocPass + ",docpass=" + this.docPass + ",printpermission:" + this.hasPrintPermission);
	AOM.CS.Log.writeError("hasFullScreen:" + this.hasFullScreen + ",transiton:" + this.transition + ",speed=" + this.speed );
	AOM.CS.Log.writeError(",hasAdvance=" + this.hasDuration + ",duration=" + this.duration + ", hasLoop=" +this.hasLoop);
	if (this.watermarkText.length == 0) {
		AOM.CS.Log.writeError("watermark = no watermark effect.");
	} else {
		AOM.CS.Log.writeError(",watermarkText=" + this.watermarkText + ", watermarkFont=" + this.watermarkFont + ",face=" + this.watermarkFontFace + ",size=" +this.watermarkFontSize);
		AOM.CS.Log.writeError(",watermarkColor=" +this.watermarkColor + ",watermarkOpacity=" + this.watermarkOpacity + ",hasBg=" + this.watermarkHasBackground);
	}
}


AOM.CS.PDFMaker.prototype.checkLayoutValues = function(dimension, arrange, margins, spacings, minFontSize) {
	//compute row length . suport passed parameters are correct
	var width = dimension[0];
	var height = dimension[1];
	var topMargin = margins[0];
	var bottomMargin = margins[1];
	var leftMargin = margins[2];
	var rightMargin = margins[3];
	var cols = arrange[0];
	var rows = arrange[1];
	var rowSpace = spacings[0];
	var colSpace = spacings[1];

	var minWidth = leftMargin + cols * minFontSize.width + (cols - 1) * rowSpace + rightMargin;
	//var minHeight = topMargin + 2 * rows * minFontSize.height + (rows - 1) * colSpace + bottomMargin;
	var minHeight = topMargin + rows * minFontSize.height + rows * minFontSize.width + (rows - 1) * colSpace + bottomMargin;

	AOM.CS.Log.writeError("width=" + width + ",height=" + height + ",minWidth=" + minWidth+ ",minHeigth=" + minHeight);
	AOM.CS.Log.writeError("minWidth =" +  leftMargin + "+" + cols + "*" + minFontSize.width + "+ (" + cols  + "- 1) * " + rowSpace + "+" + rightMargin);
	AOM.CS.Log.writeError("minHeight = " + topMargin + "+" + rows + " * " + minFontSize.height + " +" +  rows  + "*" +  minFontSize.width + " + ( " + rows  + "- 1) * " +  colSpace + "+" + bottomMargin);
	
	if (minWidth > width) {
		return AOM.CSConstant.LAYOUT_ROW_OVERSIZE;
	} 
	
	if (minHeight > height) {
		return AOM.CSConstant.LAYOUT_COL_OVERSIZE;
	}

	return AOM.CSConstant.LAYOUT_OK;
}


AOM.CS.PDFMaker.prototype.computeFontMinimizeSize = function(gfx, fontName, fontSize) {
	var currentFont = ScriptUI.newFont (fontName,ScriptUI.FontStyle.REGULAR, fontSize);
	var minFontSize = gfx.measureString("aaaaa", currentFont);
	
	return minFontSize;
}


AOM.CS.PDFMaker.prototype.autoLayout = function() {
	//process autoLayout
	var userInput = AOM.userInput(this.document);
	
	//if template is not custom, use default value.
	var currentTemplate = userInput.get("template");
	if (currentTemplate != AOM.CSConstant.CUSTOM) {
		this.initPageLayoutValues();
		return true;
	} 
	
	//template is custom
	var toUnit = AOM.CSConstant.UNIT_PIXELS;
	var dimensionFromUnit = userInput.get("pageUnit");
	
	var width = userInput.getMeasuredValue("pageWidth", dimensionFromUnit, toUnit);
	var height = userInput.getMeasuredValue("pageHeight", dimensionFromUnit, toUnit);
	var rows = Number(userInput.get("pageRows"));
	var cols = Number(userInput.get("pageColumns"));
	
	var ht = (width >= height ? 7 : 9);               //imagewidth   to   hspace
	var htP = 1.2; 		 										 //hmargin to hspace
	
	var hspace = Math.floor(width / ( htP*2 + ht*cols + cols - 1));
	var hmargin = Math.floor((width*htP) / ( htP*2 + ht*cols + cols - 1 ));
	
	var vt =  (height >= width ? 7 : 9);
	var vtP = 1.2;
	var vspace = Math.floor(height / ( vtP*2 + vt*rows + rows - 1 ));
	var vmargin = Math.floor((height*vtP) / ( vtP*2 + vt*rows + rows - 1 ));
	
	this.dimension = [width, height];
	this.arrange = [cols, rows];
	this.margins = [vmargin, vmargin, hmargin, hmargin];
	this.spacings = [vspace, hspace];
	
	this.dumpPageLayout();
	
	return true;
}

