Malicious PDF — malware analysis report

Static analysis result for SHA-256 7c1d2b04af257b2b…

MALICIOUS

PDF

3.24 MB Created: 2005-03-08 13:45:18 +05:30
MD5: a3b0b8b623b4d72dd917d976807ae0b9 SHA-1: a840d2774c55ca71900499935bb5c916804cabf8 SHA-256: 7c1d2b04af257b2bab14f4657131189e0efa6d2773773c68bdbc0f9e20a78232
104 Risk Score

Malware Insights

MITRE ATT&CK
T1059.007 JavaScript T1566.001 Spearphishing Attachment T1203 Exploitation for Client Execution

The PDF file contains embedded JavaScript that triggers an alert message prompting the user to download Adobe Reader. This is a common lure to exploit older versions of the reader or to deliver a second-stage payload. The JavaScript also contains functions related to media playback and comments, suggesting a complex interaction within the PDF. The presence of PDF_JS_EXPLOIT_CLUSTER and PDF_XFA heuristics further supports an exploit attempt.

Machine Learning

  • Nyx PDF Classifier suspicious score 0.3469

Heuristics 8

  • JavaScript action low 2 related findings PDF_JAVASCRIPT
    PDF contains a /JavaScript action. Generic JavaScript is common in benign forms; specific dangerous APIs are scored by separate rules.
  • PDF JavaScript exploit cluster critical PDF_JS_EXPLOIT_CLUSTER
    PDF combines an executable JavaScript/action surface with exploit staging indicators such as eval/unescape/fromCharCode, XFA script content, or a related CVE pattern. Benign form JavaScript remains low-severity, but this correlated cluster is high-confidence malicious behavior.
  • Embedded JS stream low PDF_JS
    PDF references a /JS stream. Generic JavaScript is common in benign forms; specific dangerous APIs are scored by separate rules.
  • Embedded file low PDF_EMBEDDED
    PDF embeds a file attachment — could carry an executable or another weaponised document as a nested payload
  • XFA form low PDF_XFA
    PDF uses XML Forms Architecture — can contain script logic
  • AcroForm button with action trigger low PDF_ACROFORM_BUTTON
    PDF contains a /Btn form field together with a SubmitForm/URI/Launch/JS trigger — this is the building block of fake 'Download' or 'Open' button overlays used in PDF phishing lures
  • Object number defined twice with different bodies info PDF_DUPLICATE_OBJ_BODY_INCREMENTAL
    The same indirect object (N G) is defined more than once with different body bytes. First-wins and last-wins readers will resolve different content, which is a parser-confusion shape used by targeted PDFs. Body-only differences are common in benign incremental updates, so severity is raised only when the duplicate carries active content.
  • Embedded URL info EMBEDDED_URL
    One or more URLs were extracted from the document. The URL itself is not a detection — see the per-URL labels for which channel (macro, JS, link annotation, document body, ...) reached each URL.
    URL http://www.w3.org/1999/xhtml In PDF document text
    • http://www.xfa.org/schema/xfa-data/1.0/In PDF document text
    • http://www.adobe.com/products/acrobat/readstep.hIn PDF document text
    • http://www.w3.org/1999/02/22-rdf-syntax-ns#In PDF document text
    • http://ns.adobe.com/xap/1.0/In PDF document text
    • http://ns.adobe.com/xap/1.0/mm/In PDF document text
    • http://purl.org/dc/elements/1.1/In PDF document text
    • http://www.adobe.com/products/acrobat/readstep.htmlReferenced by PDF JavaScript

Extracted artifacts 32

Files carved from inside the sample during analysis.

FilenameKindSourceSize
embedded_file
c6c895dd1668be1b2bd23558f05629e164c2a7a7d2971721f70dbd4a022bbf31
pdf-embedded-file PDF EmbeddedFile object 7 at offset 0x21971 4194304 bytes
javascript_obj0017_000.js
140666ff3484ac0e529b6691046f1ecfe3837958d2a0fdb5286212c50f8c9348
pdf-javascript-stream PDF /JS object 17 at offset 0x28A4 218 bytes
Preview script
First 1,000 lines of the extracted script
function AddComment()
{
	var addCommentTextField = this.getField("AddCommentTextField");
	addCommentTextField.setFocus();
	player.pause();

	if (!editCommentFlag && !addCommentFlag)
	{
		DoComment();
	}
}
javascript_obj0019_001.js
18232c2b8268bb4fcff21c22f073415427d2c8430f2d79309ef6d9535002f319
pdf-javascript-stream PDF /JS object 19 at offset 0x29F5 73 bytes
Preview script
First 1,000 lines of the extracted script
function CleanUp()
{
	this.getField("CommentList").clearItems();
}
javascript_obj0028_002.js
dfbcf5b827e9ac46518857efffd4bd38db062e280b5a9d31ee87bf96f851d7e0
pdf-javascript-stream PDF /JS object 28 at offset 0x2BD5 234 bytes
Preview script
First 1,000 lines of the extracted script
function FlashRunningTimecode(time)
{
	// console.println("FlashRunningTimeCode: " + GetTimeCodeString(time));
    var runningTimecode = this.getField("RunningTimecode");
    runningTimecode.value = GetTimeCodeString(time);
}
javascript_obj0029_003.js
c0d3556fdb2d1a78a0a458e0c283ddeb07d5d29bd98febcb2c821bc835e1e61e
pdf-javascript-stream PDF /JS object 29 at offset 0x2D00 166 bytes
Preview script
First 1,000 lines of the extracted script
function GetCommentHeaderRegex()
{
	var regex = /(\[(\w)*?\])?(.*?)(Comment at)?(.*?)(\d)?(\d\d[;:]\d\d[;:]\d\d[;:]\d\d)(.*?)(-)(\s)*/mg;
	return regex;
}
javascript_obj0033_004.js
bd64f6e57e778f52158b69c21bf2c6c95a5dc2c021053adfc850de5a9dece976
pdf-javascript-stream PDF /JS object 33 at offset 0x2E84 139 bytes
Preview script
First 1,000 lines of the extracted script
function GotoTimeCode(time)
{
    player.seek({time: time});   
	player.play();
	player.pause();
	player.seek({time: time});   
}
javascript_obj0036_005.js
ff80b0b69f13bf2fbf5df9b01f19461b4fb821ec6bda73e2c69f231f3c4314a8
pdf-javascript-stream PDF /JS object 36 at offset 0x2FA8 150 bytes
Preview script
First 1,000 lines of the extracted script
function PopulateMainCommentField(value)
{
    var mainCommentField = this.getField("MainCommentField");
    mainCommentField.value = value;
}
javascript_obj0039_006.js
d261db8174c30cae64e5123f9cf388938de35b5ba68d49024ab7e7eef4065e6b
pdf-javascript-stream PDF /JS object 39 at offset 0x30CD 140 bytes
Preview script
First 1,000 lines of the extracted script
function SetFocusToCommentField()
{
	console.println("set focus to text field");
	this.getField("AddCommentTextField").setFocus();
}
javascript_obj0040_007.js
74a066b48827abcf696d656faf53d9ca6025a71024c59051c4bcd2e17f94b315
pdf-javascript-stream PDF /JS object 40 at offset 0x3194 95 bytes
Preview script
First 1,000 lines of the extracted script
function TerminateAutomaticCommentDisplay(timeout)
{
    app.clearInterval(timeout);
}
javascript_obj0041_008.js
810cfedc29aa122862ec26a22a79d4f7ca60de8e838d095a4e84145e81854293
pdf-javascript-stream PDF /JS object 41 at offset 0x322A 73 bytes
Preview script
First 1,000 lines of the extracted script
function startPlayer()
{
	player = app.media.openPlayer(args);
}
javascript_obj0306_010.js
61bcf213e53ff9617ee864df9f70f68c4b1f4566c3ea384a94fbcc154a924df2
pdf-javascript-stream PDF /JS object 306 at offset 0x1A70E 45 bytes
Preview script
First 1,000 lines of the extracted script
SaveComment();
app.execMenuItem("Save");
javascript_obj0369_013.js
99da2d0ce4eb85a98600463aaf290d4aa1fa51637b98f567c637e28b2fdc09a3
pdf-javascript-stream PDF /JS object 369 at offset 0x1E851 80 bytes
Preview script
First 1,000 lines of the extracted script
console.println("AddCommentTextField lost focus");
finishedCommentFlag = 1;
javascript_obj0370_014.js
1ec36dfedb833894e2db10a5ccbef19c62e6cfa1240ed9d40fd7611f2c1ce970
pdf-javascript-stream PDF /JS object 370 at offset 0x1E8D1 47 bytes
Preview script
First 1,000 lines of the extracted script
commentDirty = 1;
finishedCommentFlag = 0;
javascript_obj0399_015.js
7b573bcd65de575959297fc2109d74f2d08a1679525780df63caf6ffd4860a71
pdf-javascript-stream PDF /JS object 399 at offset 0x20582 219 bytes
Preview script
First 1,000 lines of the extracted script
if ( intiatedAutomaticCommentDisplayFlag == 1)
{
	TerminateAutomaticCommentDisplay(timeout);
	intiatedAutomaticCommentDisplayFlag = 0;
	console.println("\n terminated recursive automatic comment display");   
}
javascript_obj0400_016.js
ff5952889d6affeb5ea21493215a5e39cbbcdc47f904921764c4ed32ea32a648
pdf-javascript-stream PDF /JS object 400 at offset 0x2069A 742 bytes
Preview script
First 1,000 lines of the extracted script
/*Ubiquity*/
var needsUpdate = 0;
if (app.viewerType == "Exchange" && app.viewerVariation=="Fill-In")
    needsUpdate = 1;
else if (app.viewerType == "Reader")
{
    if (app.viewerVersion >= 6.0)
        needsUpdate = 0;
    else
        needsUpdate = 1;
}
if (needsUpdate)
{
    var ans = app.alert("To use all the features of this document,\nyou must use Adobe Reader 6.0 or later\nor Acrobat 6.0 or later.\n\nBecause you have an older version, or\nAcrobat Approval, some features will not work.\n\nClick OK to download the latest version of\nthe free Adobe Reader, which will enable\nthe additional features of this document.\n", 1, 1);
    if (ans == 1)
        this.getURL("http://www.adobe.com/products/acrobat/readstep.html", false);
}
javascript_obj0042_017.js
f260d502a9405d58607e2b39972b80c772177e462dd1a316f3b227d39f1d0e00
pdf-javascript-stream PDF /JS object 42 at offset 0x32AA 3544 bytes
Preview script
First 1,000 lines of the extracted script
function SaveComment()
{
	try
	{
		if (addCommentFlag == 1)
		{
				// Set the names of comments.
			var timeCodeTextFieldName = "timeCodeTextField" + numComments;
			var textAnnotFieldName = "textAnnotField" + numComments;
				
				// Get the reviewer's name.
			var enclosedReviewerName = GetEnclosedReviewerName();

				// Get handles to various fields.
			var addCommentTextField = this.getField("AddCommentTextField");
			if (addCommentTextField.value != "")
			{
				var reviewerNameTextField = this.getField("ReviewerNameTextField");
				var list = this.getField("CommentList");

					// Add two annots, time code ones are not visible to the user.
				timeCodeTextFieldArray[numComments] = this.addAnnot({
						page: 0,
						type: "Text",
						point: [400,720],
						name: timeCodeTextFieldName,
						author: timeCodeTextFieldName,
						contents: "",
						readOnly: true,
						hidden: true,
						noView: false
				});
				textAnnotField[numComments] = this.addAnnot({
						page: 0,
						type: "Text",
						point: [720,400],
						name: textAnnotFieldName,
						author: reviewerNameTextField.valueAsString,
						contents: "",
						readOnly: true,
						noView: true
				});
				
					// Set the values
				textAnnotField[numComments].contents = AppendStartTagToComment(addCommentTextField.valueAsString, addCommentTextFieldTimeCode);
				timeCodeArray[numComments] = Math.floor((addCommentTextFieldTimeCode + 0.0001) * frameRate);
				timeCodeTextFieldArray[numComments].contents = Math.floor((addCommentTextFieldTimeCode + 0.0001) * frameRate);
				
					//insert comment into combobox
				var insertPositionInCommentList = FindLocationInCommentList( Math.floor((addCommentTextFieldTimeCode + 0.0001) * frameRate));
				var firstFew = GetFirstFewCharsFromComment(textAnnotField[numComments].contents);
				addCommentFlag = 0;		// important to put it here to take care of reentrancy
				list.insertItemAt(GetTimeCodeString(addCommentTextFieldTimeCode) + firstFew, Math.floor((addCommentTextFieldTimeCode + 0.0001) * frameRate), insertPositionInCommentList);

				numComments++;
				numCommentsField.value = numComments;
				
				addCommentTextField.readonly = true;
				isDirtyFlag = 1;
			}
			// AddCommentFlag is always unset after saveComment
			console.println("addcommentflag set to 0 in save comment");
			addCommentFlag = 0;
			commentDirty = 0;
		}
		else
		if(editCommentFlag ==1)
		{
			var addCommentTextField = this.getField("AddCommentTextField");
			var textFieldIndex = FindLocationInTimeCodeArray(Math.floor((addCommentTextFieldTimeCode + 0.0001) * frameRate));
			
			var header = textAnnotField[textFieldIndex].contents.match(GetCommentHeaderRegex())[0];

			textAnnotField[textFieldIndex].contents = header + addCommentTextField.valueAsString;

			editCommentFlag = 0;	//important to put it here to take care of reentrancy
			addCommentTextField.readonly = true;

			var list = this.getField("CommentList");
			var positionNum = FindLocationInCommentList(Math.floor((addCommentTextFieldTimeCode + 0.0001) * frameRate));
			list.deleteItemAt(positionNum);
			
			var firstFew = GetFirstFewCharsFromComment(textAnnotField[textFieldIndex].contents);
			list.insertItemAt(GetTimeCodeString(addCommentTextFieldTimeCode) + firstFew,Math.floor((addCommentTextFieldTimeCode + 0.0001) * frameRate), positionNum);
			isDirtyFlag = 1;
			commentDirty = 0;			
		}
	}
	catch(e)
	{
		console.println(e.extMessage);
	}
}
javascript_obj0043_018.js
f77e2edcf33d85ca9b0b0983a489fe3e2bebd7455fe7b53b3eba560530d2e438
pdf-javascript-stream PDF /JS object 43 at offset 0x36CB 747 bytes
Preview script
First 1,000 lines of the extracted script
function PutCommentToStagingArea(comment)
{
    var addCommentTextField = this.getField("AddCommentTextField");
    var stagingAreaCommentHeaderField = this.getField("StagingAreaCommentHeaderField");

    if( comment != "")
    {
        var regex = GetCommentHeaderRegex();
        var matchedText = regex.exec(comment);
        //console.println(matchedText[0]);
        var truncatedComment = comment.replace( regex , '');
    
        addCommentTextField.value = truncatedComment;
        addCommentTextField.readOnly = true;
        
        stagingAreaCommentHeaderField.value = matchedText[0];
    }
    else
    {
         addCommentTextField.value = "";
         stagingAreaCommentHeaderField.value = "";
    }
}
javascript_obj0044_019.js
44ed9cf0e476e0ebb40fc38ca9459056beba58ac8f84c49722d4e46c861389ce
pdf-javascript-stream PDF /JS object 44 at offset 0x382B 785 bytes
Preview script
First 1,000 lines of the extracted script
function OnSelChangeCombo()
{	
	console.println("OnSelChangeCombo");
	if (!event.willCommit && event.changeEx != "")
	{
		var frameNumber = event.changeEx;
		console.println("OnSelChangeCombo and !willCommit");
		
		SaveComment();
		console.println("OnSelChangeCombo and !willCommit and saved comment");
		editCommentFlag = 0;
		addCommentFlag = 0;
		
		var positionNum = FindLocationInTimeCodeArray(frameNumber);
		// console.println(positionNum);
		console.println(frameNumber);
		PutCommentToStagingArea(textAnnotField[positionNum].contents);		
		addCommentTextFieldTimeCode = frameNumber / frameRate;
		var timecode = parseFloat(frameNumber / frameRate);
		console.println("timecode" + timecode);
		GotoTimeCode(timecode + 0.01);
		// EditComment();
	}
}
javascript_obj0045_020.js
2dde17b958cbcbf48ccecabfc53fd4bd1098ecf7c8325bce9baaa8f789e93776
pdf-javascript-stream PDF /JS object 45 at offset 0x39CE 5305 bytes
Preview script
First 1,000 lines of the extracted script
/*******************************************************************/
/*                                                                 */
/*                      ADOBE CONFIDENTIAL                         */
/*                   _ _ _ _ _ _ _ _ _ _ _ _ _                     */
/*                                                                 */
/* Copyright 2004 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.                                                   */
/*                                                                 */
/*******************************************************************/

/*
**  Adobe patent application tracking # B032, 
**  entitled "Method For Annotating Time Line Based Content In Pdf", 
**  inventors: Grant, Nydam, Gupta, Gupta
*/

var location = 700;
var textField = new Array();
var textAnnotField = new Array();
var numCommentsField = this.getField("NumComments");
var numComments = numCommentsField.value;
var pageN = 1;
var timeout = 0;
var intiatedAutomaticCommentDisplayFlag = 0;

var gotoButtonArray = new Array();
var timeCodeArray = new Array();
var timeCodeTextFieldArray = new Array();

var mainCommentFieldTimeCode = 0.0;

var addCommentTextFieldTimeCode = 0.0;

var addCommentFlag = 0;
var editCommentFlag = 0;
var isDirtyFlag = 0;
var duration = 141.0;

var numCharsInCommentList = 28;

// app.execMenuItem("Annots:CommentsSummaryPane");
// app.execMenuItem("FullScreen");
app.execMenuItem("FitPage");
/*var timeout = InitiateAutomaticCommentDisplay();*/
var playButtonIconIsSetFlag = 1;

var selChangeFromPrevNextCommentButtonsFlag = 0;

// What follows might seems weird but we need to 
// do this becasue Acrobat for some unknown reason 
// only exports comments put through acrobat
// since the following comments are put by Premeire 
// their values were not getting exporter
// [TODO] Find a solution from Acrobat team for this
//  or if it's a bug get it fixed
var returnEMailAddressAnnot = this.getAnnot(0, "returnEmailAddress");
returnEMailAddressAnnot.contents = returnEMailAddressAnnot.contents;

var pdfInstructionsAnnot = this.getAnnot(0, "pdfInstructions");
pdfInstructionsAnnot.contents = pdfInstructionsAnnot.contents;

var seqIDAnnot = this.getAnnot(0, "seqID");
seqIDAnnot.contents = seqIDAnnot.contents;

var startTimeAnnot = this.getAnnot(0, "startTime");
startTimeAnnot.contents = startTimeAnnot.contents;

var frameRateAnnot = this.getAnnot(0, "frameRateField");
frameRateAnnot.contents = frameRateAnnot.contents;
var frameRateString = frameRateAnnot.contents;
var frameRate = new String();
if (frameRateString == "NTSC")
{
	frameRate = "29.97";
}
else
{
	frameRate = "25.00";
}

var timeDisplayAnnot = this.getAnnot(0, "timeDisplay");
timeDisplayAnnot.contents = timeDisplayAnnot.contents;
var timeDisplay = timeDisplayAnnot.contents;

CleanUp();
var tempName= "textAnnotField";
for ( var i = 0; i < numComments; i++)
{
    textAnnotField[i] = this.getAnnot( 0 , tempName + i);
    timeCodeTextFieldArray[i] = this.getAnnot(0,"timeCodeTextField" + i); 
	
	if (textAnnotField[i] != null && timeCodeTextFieldArray[i] != null)
	{
		var insertPositionInCommentList = FindLocationInCommentList( timeCodeTextFieldArray[i].con
... (truncated)
javascript_obj0046_021.js
5be6c9abca3f42949e321ebc3ab9183224992c8b7fccb7ee82936aeeba57cc90
pdf-javascript-stream PDF /JS object 46 at offset 0x410E 1496 bytes
Preview script
First 1,000 lines of the extracted script
function GetTimeCodeString( time)
{
    var timeCodeString =  new String();
	var timeDisplayFormat = new String();
	timeDisplayFormat = timeDisplay;

	time += 0.01 * ( 1.0 / frameRate);
	
	if (frameRate == 29.97 && timeDisplayFormat == "DropFrame")
	{
		// [NOTE] pankaj 
		// Be careful here, the logic is complex 
		// partly due to optimizations
		var frames = Math.floor(time * 29.97);
		var tenMinutes = Math.floor(frames / 17982); // 10  * 30 * 60 - 18
		var hours = Math.floor(tenMinutes / 6);
		var afterTenMinFrames = frames - tenMinutes * 17982;
		var lastMinutes = 0;
		if (afterTenMinFrames >= 1800)
		{
			lastMinutes = Math.floor((afterTenMinFrames - 1800) / 1798 ) + 1; // 1798 = 10 * 60 * 30 - 2
		}
		
		var minutes = (tenMinutes - (hours*6)) * 10 + lastMinutes;
		var afterMinFrames = (afterTenMinFrames - lastMinutes*1798);
		
		var seconds = Math.floor(afterMinFrames / 30);
		var lastFrames = afterMinFrames - seconds * 30;

		timeCodeString = util.printf(" %02d;%02d;%02d;%02d ", hours, minutes, seconds, lastFrames);
	}
	else
	{
		var hours = Math.floor( time / 3600);
		var minutes = Math.floor( ( time - (hours*3600)) /60);
		var seconds = Math.floor( time % 60);
		/*var hundredthSecs = Math.floor( (time - Math.floor(time)) * 100); */
		var frames = Math.floor((time - Math.floor(time)) * frameRate);
		timeCodeString = util.printf(" %02d:%02d:%02d:%02d ", hours, minutes, seconds, frames);
	}

    return timeCodeString;
}
javascript_obj0047_022.js
09f5ca347e5a9653212e337e8736dc684c653d92749fb0393e098da202fbcc77
pdf-javascript-stream PDF /JS object 47 at offset 0x438E 273 bytes
Preview script
First 1,000 lines of the extracted script
function GetFirstFewCharsFromComment(inComment)
{
	var tempStr = inComment.replace( GetCommentHeaderRegex() , '');
	var firstFew = tempStr.substring(0,numCharsInCommentList);
	if (tempStr.length > firstFew.length)
	{
		firstFew += "...";
	}
	return firstFew;
}
javascript_obj0048_023.js
6b2a8e4a51569bddf8962a8a928dc650490b47f1603c8cf12d138bae7b2063d5
pdf-javascript-stream PDF /JS object 48 at offset 0x448D 302 bytes
Preview script
First 1,000 lines of the extracted script
function GetEnclosedReviewerName()
{
	// Get the reviewer's name.
	var reviewerNameTextField = this.getField("ReviewerNameTextField");
	var reviewerName = "[" + reviewerNameTextField.valueAsString + "]";
	if( reviewerNameTextField.value == "")
		reviewerName = "";

	return reviewerName;
}
javascript_obj0049_024.js
aad725103e8376908690a702de25290c0c79d219e82c0912f50e8b6af83b36af
pdf-javascript-stream PDF /JS object 49 at offset 0x4580 358 bytes
Preview script
First 1,000 lines of the extracted script
function FlashCommentToMainWindow(time)
{
    if(time != 0)
    {
        var positionNum = FindLocationInTimeCodeArray(Math.floor((time + 0.0001) * frameRate));
		if (positionNum != null)
		{
			PutCommentToStagingArea(textAnnotField[positionNum].contents);
		}       
    }
    else
    {
        PutCommentToStagingArea("");
    }     
}
javascript_obj0050_025.js
0cb03d7d07c66ddbec3c29d7485a522a440f0e4484f2e2e04e526a4e5a9ea178
pdf-javascript-stream PDF /JS object 50 at offset 0x46B0 458 bytes
Preview script
First 1,000 lines of the extracted script
function FindLocationInTimeCodeArray(timeCodeValue)
{
    for ( var i = 0; i < numCommentsField.value; i++)
    {
		if ( typeof timeCodeTextFieldArray[i] != "undefined" && timeCodeTextFieldArray[i] != null)
        {
		    var tempAnnotHandle = this.getAnnot(0,"timeCodeTextField" + i);
            if( tempAnnotHandle != null)
			    if( parseFloat(timeCodeValue) == parseFloat(tempAnnotHandle.contents))
				    return i;
        }
    } 
}
javascript_obj0051_026.js
a042daba7ffdf35e4fefc7e648831dd68f33a78711644af4c573220d3d026fd4
pdf-javascript-stream PDF /JS object 51 at offset 0x47F6 277 bytes
Preview script
First 1,000 lines of the extracted script
function FindLocationInCommentList(time)
{
    var returnVal = 0;
    var l = this.getField("CommentList");
    for ( var i = 0; i < l.numItems; i++)
    {
         if( time > Number(l.getItemAt(i)) )
            returnVal = i + 1;  
    }
    return returnVal;
}
javascript_obj0052_027.js
f692536ec264cfc24e42aae57a09bba58d5dd561caaf381c7db90f146033c7e3
pdf-javascript-stream PDF /JS object 52 at offset 0x48F0 571 bytes
Preview script
First 1,000 lines of the extracted script
function FindCommentMarkerToPlayerTime()
{
    var where = player.where();
    var time = where.time;
    var returnVal  = 0;
    var floatTime = 0;
    for ( var i = 0; i < timeCodeTextFieldArray.length; i++)
    {
       if ( timeCodeTextFieldArray[i] != null)
        {
           floatTime = timeCodeTextFieldArray[i].contents / frameRate;
           floatTime = Number(floatTime);
           if ( time > floatTime)
                if( returnVal < floatTime )
                   returnVal = floatTime;
        }
    }    
    return returnVal;
}
javascript_obj0053_028.js
c7532caf15f36663cba741cb9f9395d71d3abad570ec5cd6d0b1e684e420c3fb
pdf-javascript-stream PDF /JS object 53 at offset 0x4A3A 605 bytes
Preview script
First 1,000 lines of the extracted script
function EditComment()
{
		var time = player.where().time;
		// Comment already exists. Prepare for editing
		editCommentFlag = 1;
		var addCommentTextField = this.getField("AddCommentTextField");
		addCommentTextField.readonly = false;
		addCommentTextField.setFocus();
		//addCommentTextField.value = textAnnotField[positionNum].contents;
		addCommentTextFieldTimeCode = time;							
		// Flash running timecode 
		// We have to synchronize the two time displayed time codes
		var runningTimecode = this.getField("RunningTimecode");
		runningTimecode.value = GetTimeCodeString(time);
}
javascript_obj0054_029.js
0ef975e1d00aa0c28b691c6e99940503499384645cbc3cd6aa0157c91e7f6319
pdf-javascript-stream PDF /JS object 54 at offset 0x4BB4 1766 bytes
Preview script
First 1,000 lines of the extracted script
function DoComment()
{
	// means that pausing didn't prepare for adding or editing a comment
	editCommentFlag = 0;
	addCommentFlag  = 0;
	var time = player.where().time;

	var addCommentTextField = this.getField("AddCommentTextField");
	var stagingAreaCommentHeaderField = this.getField("StagingAreaCommentHeaderField");

	var enclosedReviewerName = GetEnclosedReviewerName();
							
	var truncatedTimeCodeValue = Math.floor((time + 0.0001) * frameRate);
	var positionNum = FindLocationInTimeCodeArray(truncatedTimeCodeValue);

	if (positionNum == null)
	{
		// Prepare for adding a new comment
		addCommentTextField.value = "";
		addCommentTextFieldTimeCode = time;
		
		// [NOTE] ideally we should be doing this last but doing here to take care of some issues with setfocus
		addCommentFlag = 1;	
		finishedCommentFlag = 0;
		addCommentTextField.readonly = false;
		addCommentTextFieldTimeCode = time;
		stagingAreaCommentHeaderField.value = enclosedReviewerName + " " + GetTimeCodeString(time);
		console.println("stagingAreaCommentHeaderField set");

		// Flash running timecode 
		// We have to synchronize the two time codes displayed
		var runningTimecode = this.getField("RunningTimecode");
		runningTimecode.value = GetTimeCodeString(time);			
	}
	else
	{
		// Comment already exists. Prepare for editing
		editCommentFlag = 1;
		finishedCommentFlag = 0;
		addCommentTextField.readonly = false;
		addCommentTextFieldTimeCode = time;
		PutCommentToStagingArea(textAnnotField[positionNum].contents);
		// Flash running timecode 
		// We have to synchronize the two time displayed time codes
		var runningTimecode = this.getField("RunningTimecode");
		runningTimecode.value = GetTimeCodeString(time);			
	}
}
javascript_obj0055_030.js
971d13b4621eaa71b1fdf6468691a91ae362802c0e42d08f83287e9e53e86dc0
pdf-javascript-stream PDF /JS object 55 at offset 0x4E73 2381 bytes
Preview script
First 1,000 lines of the extracted script
function DisplayAutomaticComment()
{
	try
	{
		// remove reentrance by defining a mutex
		if (displayCommentMutex == 0)
		{
			displayCommentMutex = displayCommentMutex + 1;
			// console.println("DisplayCOmmentMutex:" + displayCommentMutex);

	/////////////////ACTUAL CODE//////////////////////////////////////////////////ACTUAL CODE/////////////////////////////////

			if (player.isOpen)
			{
				if (addCommentFlag == 0 && editCommentFlag == 0)
				{
					if (player.isPlaying)
					{
						// flash comments while playing
						var commentTime = FindCommentMarkerToPlayerTime();
						if (commentTime != oldCommentTime)
						{
							FlashCommentToMainWindow(commentTime);
						}			
						
						FlashRunningTimecode(player.where().time);

						oldCommentTime = commentTime;
					}
					else
					{	
						// prepare for adding a comment
						try
						{
							var commentTime = player.where().time;
							if (commentTime != oldCommentTime)
							{
								SetFocusToCommentField();
								FlashRunningTimecode(commentTime);
								DoComment();
								oldCommentTime = commentTime;
							}
						}catch(e)
						{
							console.println(e.extMessage);
						}
					}
				}
				else
				{
					// A comment has been added, save the comment.
					try
					{	
						if(finishedCommentFlag)
						{														
							var commentTime = player.where().time;
							if (commentTime == oldCommentTime)
							{			
								if (commentDirty)
								{
									SaveComment();
									if (!player.isPlaying)
									{

										var addCommentTextField = this.getField("AddCommentTextField");
										addCommentTextField.readonly = false;
										if (addCommentTextField.valueAsString != "")
										{
											editCommentFlag = 1;
										}
										else
										{
											addCommentFlag = 1;
										}
									}
								}
							}
							else
							{
								SaveComment();
							}
						}
					}
					catch(e)
					{
						console.println(e.extMessage);
					}
				}
			}

	/////////////////ACTUAL CODE//////////////////////////////////////////////////ACTUAL CODE/////////////////////////////////
			displayCommentMutex = 0;
		}
		else
		{
			console.println("Mutex interrupted me");
		}
	}
	catch(e)
	{
		console.println(e.extMessage);
	}
}
javascript_obj0056_031.js
e9adb23c66bae7ca9386411d5abffa651ea1e2c9c6aa39fbfdfc506b60cc0504
pdf-javascript-stream PDF /JS object 56 at offset 0x5171 1228 bytes
Preview script
First 1,000 lines of the extracted script
function DeleteComment()
{
	var addCommentTextField = this.getField("AddCommentTextField");
	if (addCommentFlag)
	{
		addCommentTextField.value = "";
		addCommentTextField.setFocus();
	}
	else 
	{
		editCommentFlag = 0;
		addCommentFlag = 0;
		var l = this.getField("CommentList");

		if( l.numItems != 0)
		{
			var nButton = app.alert({nIcon: 1, nType: 2, cMsg: "Do you really want to delete the comment?"});
			if( nButton == 4)    /* reponse is yes */
			{        
				var positionNum = FindLocationInTimeCodeArray(l.value);
				if( typeof textAnnotField[positionNum] != "undefined" )
				{
					textAnnotField[positionNum].destroy();
					textAnnotField[positionNum] = null;
					timeCodeTextFieldArray[positionNum].destroy();
					timeCodeTextFieldArray[positionNum] = null;
				}
				var currIndex = l.currentValueIndices;
				l.deleteItemAt();					
				 
				if( l.numItems != 0)
				{
					if (currIndex > 0)		// select the prev comment
					{
						l.currentValueIndices = currIndex - 1;
					}
					else					// select the next comment
					{
						l.currentValueIndices = currIndex;
					}
				}

				DoComment();
				addCommentTextField.setFocus();			
			}
		}
	}
}
javascript_obj0057_032.js
7516046ae8f7c11e9a166ebed6d247a1f4f363bed33c53337c620474de3301c8
pdf-javascript-stream PDF /JS object 57 at offset 0x53B1 263 bytes
Preview script
First 1,000 lines of the extracted script
function AppendStartTagToComment(comment , timecode)
{
    // Get the reviewer's name.
	var enclosedReviewerName = GetEnclosedReviewerName();
    comment = enclosedReviewerName + " " + GetTimeCodeString(timecode) + " -" + comment ;
    return comment;
}
javascript_obj0365_033.js
45295405e99b9c446fdc6068eb98682231d4f6505734817f094582451379da37
pdf-javascript-stream PDF /JS object 365 at offset 0x1E3A0 1249 bytes
Preview script
First 1,000 lines of the extracted script
SaveComment();
// if( isDirtyFlag == 1)	// always export XFDF, earlier happened only when comments had been added.
{
    // app.alert("You have made changes to the comments since you last saved the comments. Please save the comments.");
    this.exportAsXFDF({ bAnnotations: true, bAllFields: true});
    isDirtyFlag = 0;
}

var returnEmailAddressAnnot = this.getAnnot(0, "returnEmailAddress");
if (returnEmailAddressAnnot.contents != "")
{
	var reviewerName = this.getField("ReviewerNameTextField").valueAsString;
	var body = "Hello.%0A%0DMy comments for the recent Adobe Clip Notes review session are attached to this e-mail. Please import them into the original " + this.getAnnot(0,"appName").contents +" project sequence/composition to view them.%0A%0D%0A%0D Thanks,";
	// [HACK] pankaj 05.13.2005
	// Need to fix this immidiately for UIF hence hardcoding the default name here
	if (reviewerName != "Enter your name here")
	{
		body = body + "%0A%0D" + reviewerName;
	}
	
	var cURLString = "mailto:" + returnEmailAddressAnnot.contents + "?subject=Clip Notes Comments&body=" + body + "&ui=true";
	this.submitForm({
        bAnnotations: true,
		cURL: cURLString,
		cSubmitAs: "XFDF",
        bInclNMKey: true
	});
}