Layer Comps to Files + Delete hidden layers

Anyone, especially newbies, asking for help with Photoshop Scripting and Photoshop Automation - as opposed to those contributing to discussion about an aspect of Photoshop Scripting

Moderators: Tom, Kukurykus

Limey

Layer Comps to Files + Delete hidden layers

Post by Limey »

Hi All,
I build a lot of composites simply by turning on and off layers and as I go through the variations I make my layer comps. when done it's a simple Layer Comps To Files and everything is done. Well, I was able to get rid of the annoying prefix that usually gets added to the new file name, so that's one hurdle out of the way.

The thing I am trying to do now is to prevent all of the hidden layers going across into the new files. In other words before it saves the file it would Delete All Hidden Layers. The files it ends up saving are basically duplicates of the main template and that's a huge file. I am having to run all of the saved files through an action that deletes the hidden layers after the fact.

Below is the modified script I am using that allows the prefix to be turned off (check box) when saving layer comps to files.


Many thanks,

Limey a.k.a Paul


Code: Select all// Copyright 2007.  Adobe Systems, Incorporated.  All rights reserved.
// This script will apply each comp and then export to a file
// Written by Naoki Hada
// ZStrings and auto layout by Tom Ruark
// PNG support by Jeffrey Tranberry

/*
@@@BUILDINFO@@@ Layer Comps To Files.jsx 1.0.0.20
*/

/*

// BEGIN__HARVEST_EXCEPTION_ZSTRING

<javascriptresource>
<name>$$$/JavaScripts/LayerCompsToFiles/Menu=Layer Comps to Files...</name>
<category>layercomps</category>
<enableinfo>true</enableinfo>
<eventid>cf34b502-2013-4d07-8431-1dfd634ee0cd</eventid>
<terminology><![CDATA[<< /Version 1
                         /Events <<
                          /cf34b502-2013-4d07-8431-1dfd634ee0cd [($$$/JavaScripts/LayerCompsToFiles/Action=Layer Comps to Files) /noDirectParam <<
                          >>]
                         >>
                      >> ]]></terminology>
</javascriptresource>

// END__HARVEST_EXCEPTION_ZSTRING

*/

// enable double clicking from the Macintosh Finder or the Windows Explorer
#target photoshop

// debug level: 0-2 (0:disable, 1:break on error, 2:break at beginning)
// $.level = 0;
// debugger; // launch debugger on next line

// on localized builds we pull the $$$/Strings from a .dat file, see documentation for more details
$.localize = true;

//=================================================================
// Globals
//=================================================================

// UI strings to be localized
var strTitle = localize("$$$/JavaScripts/LayerCompsToFiles/Title=Layer Comps To Files");
var strButtonRun = localize("$$$/JavaScripts/LayerCompsToFiles/Run=Run");
var strButtonCancel = localize("$$$/JavaScripts/LayerCompsToFiles/Cancel=Cancel");
var strHelpText = localize("$$$/JavaScripts/LayerCompsToFiles/Help=Please specify the format and location for saving each layer comp as a file.");
var strLabelDestination = localize("$$$/JavaScripts/LayerCompsToFiles/Destination=Destination:");
var strButtonBrowse = localize("$$$/JavaScripts/LayerCompsToFiles/Browse=&Browse...");
var strLabelFileNamePrefix = localize("$$$/JavaScripts/LayerCompsToFiles/FileNamePrefix=File Name Prefix:");
var strCheckboxSelectionOnly = localize("$$$/JavaScripts/LayerCompsToFiles/SelectedOnly=&Selected Layer Comps Only");
var strLabelFileType = localize("$$$/JavaScripts/LayerCompsToFiles/FileType=File Type:");
var strCheckboxIncludeICCProfile = localize("$$$/JavaScripts/LayerCompsToFiles/IncludeICC=&Include ICC Profile");
var strJPEGOptions = localize("$$$/JavaScripts/LayerCompsToFiles/JPEGOptions=JPEG Options:");
var strLabelQuality = localize("$$$/JavaScripts/LayerCompsToFiles/Quality=Quality:");
var strPSDOptions = localize("$$$/JavaScripts/LayerCompsToFiles/PSDOptions=PSD Options:");
var strCheckboxMaximizeCompatibility = localize("$$$/JavaScripts/LayerCompsToFiles/Maximize=&Maximize Compatibility");
var strTIFFOptions = localize("$$$/JavaScripts/LayerCompsToFiles/TIFFOptions=TIFF Options:");
var strLabelImageCompression = localize("$$$/JavaScripts/LayerCompsToFiles/ImageCompression=Image Compression:");
var strNone = localize("$$$/JavaScripts/LayerCompsToFiles/None=None");
var strPDFOptions = localize("$$$/JavaScripts/LayerCompsToFiles/PDFOptions=PDF Options:");
var strLabelEncoding = localize("$$$/JavaScripts/LayerCompsToFiles/Encoding=Encoding:");
var strTargaOptions = localize("$$$/JavaScripts/LayerCompsToFiles/TargaOptions=Targa Options:");
var strLabelDepth = localize("$$$/JavaScripts/LayerCompsToFiles/Depth=Depth:");
var strRadiobutton16bit = localize("$$$/JavaScripts/LayerCompsToFiles/Bit16=16bit");
var strRadiobutton24bit = localize("$$$/JavaScripts/LayerCompsToFiles/Bit24=24bit");
var strRadiobutton32bit = localize("$$$/JavaScripts/LayerCompsToFiles/Bit32=32bit");
var strBMPOptions = localize("$$$/JavaScripts/LayerCompsToFiles/BMPOptions=BMP Options:");
var strAlertSpecifyDestination = localize("$$$/JavaScripts/LayerCompsToFiles/SpecifyDestination=Please specify destination.");
var strAlertDestinationNotExist = localize("$$$/JavaScripts/LayerCompsToFiles/DestionationDoesNotExist=Destination does not exist.");
var strTitleSelectDestination = localize("$$$/JavaScripts/LayerCompsToFiles/SelectDestination=Select Destination");
var strAlertDocumentMustBeOpened = localize("$$$/JavaScripts/LayerCompsToFiles/OneDocument=You must have a document open to export!");
var strAlertNoLayerCompsFound = localize("$$$/JavaScripts/LayerCompsToFiles/NoComps=No layer comps found in document!");
var strAlertWasSuccessful = localize("$$$/JavaScripts/LayerCompsToFiles/Success= was successful.");
var strUnexpectedError = localize("$$$/JavaScripts/LayerCompsToFiles/Unexpectedd=Unexpected error");
var strMessage = localize("$$$/JavaScripts/LayerCompsToFiles/Message=Layer Comps To Files action settings");
var   stretQuality = localize( "$$$/locale_specific/JavaScripts/LayerCompsToFiles/ETQualityLength=30" );
var   stretDestination = localize( "$$$/locale_specific/JavaScripts/LayerCompsToFiles/ETDestinationLength=160" );
var   strddFileType = localize( "$$$/locale_specific/JavaScripts/LayerCompsToFiles/DDFileType=100" );
var   strpnlOptions = localize( "$$$/locale_specific/JavaScripts/LayerCompsToFiles/PNLOptions=100" );
var   strCreateFolder = localize( "$$$/JavaScripts/LayerCompsToFiles/CreateFolder=The folder does not exist. Do you wish to create it?\r" );
var   strCouldNotCreate = localize( "$$$/JavaScripts/LayerCompsToFiles/CouldNotCreate=The folder could not be created." );
var strPNG8Options = localize("$$$/JavaScripts/ExportLayersToFiles/PNG8Options=PNG-8 Options:");
var strCheckboxPNGTransparency = localize("$$$/JavaScripts/ExportLayersToFiles/Transparency=Transparency");
var strCheckboxPNGInterlaced = localize("$$$/JavaScripts/ExportLayersToFiles/Interlaced=Interlaced");
var strPNG24Options = localize("$$$/JavaScripts/ExportLayersToFiles/PNG24Options=PNG-24 Options:");
var strCheckboxSillyNumbering = "Remove silly numbering";

// the drop down list indexes for file type
var bmpIndex = 0;
var jpegIndex = 1;
var pdfIndex = 2;
var psdIndex = 3;
var targaIndex = 4;
var tiffIndex = 5;
var png8Index = 6;
var png24Index = 7;

// the drop down list indexes for tiff compression
var compNoneIndex = 0;
var compLZWIndex = 1;
var compZIPIndex = 2;
var compJPEGIndex = 3;

// ok and cancel button
var runButtonID = 1;
var cancelButtonID = 2;


///////////////////////////////////////////////////////////////////////////////
// Dispatch
///////////////////////////////////////////////////////////////////////////////


main();



///////////////////////////////////////////////////////////////////////////////
// Functions
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
// Function: main
// Usage: the core routine for this script
// Input: <none>
// Return: <none>
///////////////////////////////////////////////////////////////////////////////
function main() {
   
    if ( app.documents.length <= 0 ) {
        if ( DialogModes.NO != app.playbackDisplayDialogs ) {
            alert( strAlertDocumentMustBeOpened );
        }
       return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
    }

    var exportInfo = new Object();
   
    initExportInfo(exportInfo);
   
    // look for last used params via Photoshop registry, getCustomOptions will throw if none exist
   try {
      var d = app.getCustomOptions("d69fc733-75b4-4d5c-ae8a-c6d6f9a8aa32");
      descriptorToObject(exportInfo, d, strMessage, postProcessExportInfo);
   }
   catch(e) {
      // it's ok if we don't have any options, continue with defaults
   }
   
   // see if I am getting descriptor parameters
    descriptorToObject(exportInfo, app.playbackParameters, strMessage, postProcessExportInfo);
   
    if ( DialogModes.ALL == app.playbackDisplayDialogs ) {
       if (cancelButtonID == settingDialog(exportInfo)) {
          return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
       }
   }

    try {
        var docName = app.activeDocument.name;  // save the app.activeDocument name before duplicate.
        var compsName = new String("none");
        var compsCount = app.activeDocument.layerComps.length;
        if ( compsCount <= 1 ) {
            if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                alert ( strAlertNoLayerCompsFound );
            }
          return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
        } else {
            app.activeDocument = app.documents[docName];
            docRef = app.activeDocument;
   
            var rememberMaximize;
            var needMaximize = exportInfo.psdMaxComp ? QueryStateType.ALWAYS : QueryStateType.NEVER;
            if ( exportInfo.fileType == psdIndex && app.preferences.maximizeCompatibility != needMaximize ) {
                rememberMaximize = app.preferences.maximizeCompatibility;
                app.preferences.maximizeCompatibility = needMaximize;
            }
           
            for ( compsIndex = 0; compsIndex < compsCount; compsIndex++ ) {
                var compRef = docRef.layerComps[ compsIndex ];
                if (exportInfo.selectionOnly && !compRef.selected) continue; // selected only
                compRef.apply();
                var duppedDocument = app.activeDocument.duplicate();
                var fileNameBody = exportInfo.fileNamePrefix;
                // Remove silly numbering choice starting from 01
                if (exportInfo.sillyNumbering == false) fileNameBody += "-" + zeroSuppress(compsIndex+1, 2);    // by l-i-n-k
                // Add composition name with Minus instead of Underscore
                // fileNameBody += "_" + compRef.name;
                fileNameBody = compRef.name;   // by l-i-n-k
                if (null != compRef.comment)    fileNameBody += compRef.comment;
                fileNameBody = fileNameBody.replace(/[:\/\\*\?\"\<\>\|\\\r\\\n]/g, "_");  // '/\:*?"<>|\r\n' -> '_'
                if (fileNameBody.length > 120) fileNameBody = fileNameBody.substring(0,120);
                saveFile(duppedDocument, fileNameBody, exportInfo);
                duppedDocument.close(SaveOptions.DONOTSAVECHANGES);
            }

         var d = objectToDescriptor(exportInfo, strMessage, preProcessExportInfo);
            app.putCustomOptions("d69fc733-75b4-4d5c-ae8a-c6d6f9a8aa32", d);

         var dd = objectToDescriptor(exportInfo, strMessage, preProcessExportInfo);
            app.playbackParameters = dd;

            if ( rememberMaximize != undefined ) {
                app.preferences.maximizeCompatibility = rememberMaximize;
            }
           
            if ( DialogModes.ALL == app.playbackDisplayDialogs ) {
                alert(strTitle + strAlertWasSuccessful);
            }

            app.playbackDisplayDialogs = DialogModes.ALL;

        }
    }
    catch (e) {
        if ( DialogModes.NO != app.playbackDisplayDialogs ) {
            alert(e);
        }
       return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
    }
}


///////////////////////////////////////////////////////////////////////////////
// Function: settingDialog
// Usage: pop the ui and get user settings
// Input: exportInfo object containing our parameters
// Return: on ok, the dialog info is set to the exportInfo object
///////////////////////////////////////////////////////////////////////////////
function settingDialog(exportInfo)
{
    dlgMain = new Window("dialog", strTitle);
   
    // match our dialog background color to the host application
   var brush = dlgMain.graphics.newBrush(dlgMain.graphics.BrushType.THEME_COLOR, "appDialogBackground");
    dlgMain.graphics.backgroundColor = brush;
    dlgMain.graphics.disabledBackgroundColor = brush;

   dlgMain.orientation = 'column';
   dlgMain.alignChildren = 'left';
   
   // -- top of the dialog, first line
    dlgMain.add("statictext", undefined, strLabelDestination);

   // -- two groups, one for left and one for right ok, cancel
   dlgMain.grpTop = dlgMain.add("group");
   dlgMain.grpTop.orientation = 'row';
   dlgMain.grpTop.alignChildren = 'top';
   dlgMain.grpTop.alignment = 'fill';

   // -- group top left
   dlgMain.grpTopLeft = dlgMain.grpTop.add("group");
   dlgMain.grpTopLeft.orientation = 'column';
   dlgMain.grpTopLeft.alignChildren = 'left';
   dlgMain.grpTopLeft.alignment = 'fill';
   
   // -- the second line in the dialog
   dlgMain.grpSecondLine = dlgMain.grpTopLeft.add("group");
   dlgMain.grpSecondLine.orientation = 'row';
   dlgMain.grpSecondLine.alignChildren = 'center';

    dlgMain.etDestination = dlgMain.grpSecondLine.add("edittext", undefined, exportInfo.destination.toString());
    dlgMain.etDestination.preferredSize.width = StrToIntWithDefault( stretDestination, 160 );

    dlgMain.btnBrowse = dlgMain.grpSecondLine.add("button", undefined, strButtonBrowse);
    dlgMain.btnBrowse.onClick = function() {
      var defaultFolder = dlgMain.etDestination.text;
      var testFolder = new Folder(dlgMain.etDestination.text);
      if (!testFolder.exists) defaultFolder = "~";
      var selFolder = Folder.selectDialog(strTitleSelectDestination, defaultFolder);
      if ( selFolder != null ) {
           dlgMain.etDestination.text = selFolder.fsName;
       }
      dlgMain.defaultElement.active = true;
   }

   // -- the third line in the dialog
    dlgMain.grpTopLeft.add("statictext", undefined, strLabelFileNamePrefix);

   // -- the fourth line in the dialog
    dlgMain.etFileNamePrefix = dlgMain.grpTopLeft.add("edittext", undefined, exportInfo.fileNamePrefix.toString());
    dlgMain.etFileNamePrefix.alignment = 'fill';
    dlgMain.etFileNamePrefix.preferredSize.width = StrToIntWithDefault( stretDestination, 160 );

   // -- the fifth line in the dialog
    dlgMain.cbSelection = dlgMain.grpTopLeft.add("checkbox", undefined, strCheckboxSelectionOnly);
    dlgMain.cbSelection.value = exportInfo.selectionOnly;
   
    // -- the fifth and a half line in the dialog
    dlgMain.snSelection = dlgMain.grpTopLeft.add("checkbox", undefined, strCheckboxSillyNumbering);   // by l-i-n-k
    dlgMain.snSelection.value = exportInfo.sillyNumbering;   // by l-i-n-k

   // -- the sixth line is the panel
    dlgMain.pnlFileType = dlgMain.grpTopLeft.add("panel", undefined, strLabelFileType);
   dlgMain.pnlFileType.alignment = 'fill';
   
    // -- now a dropdown list
    dlgMain.ddFileType = dlgMain.pnlFileType.add("dropdownlist");
    dlgMain.ddFileType.preferredSize.width = StrToIntWithDefault( strddFileType, 100 );
    dlgMain.ddFileType.alignment = 'left';

    dlgMain.ddFileType.add("item", "BMP");
    dlgMain.ddFileType.add("item", "JPEG");
    dlgMain.ddFileType.add("item", "PDF");
   dlgMain.ddFileType.add("item", "PSD");
    dlgMain.ddFileType.add("item", "Targa");
    dlgMain.ddFileType.add("item", "TIFF");
    dlgMain.ddFileType.add("item", "PNG-8");
    dlgMain.ddFileType.add("item", "PNG-24");

   dlgMain.ddFileType.onChange = function() {
      hideAllFileTypePanel();
      switch(this.selection.index) {
         case bmpIndex:   
            dlgMain.pnlFileType.pnlOptions.text = strBMPOptions;
            dlgMain.pnlFileType.pnlOptions.grpBMPOptions.show();   
            break;
         case jpegIndex:   
            dlgMain.pnlFileType.pnlOptions.text = strJPEGOptions;
            dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.show();   
            break;
         case tiffIndex:   
            dlgMain.pnlFileType.pnlOptions.text = strTIFFOptions;
            dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.show();   
            break;
         case pdfIndex:   
            dlgMain.pnlFileType.pnlOptions.text = strPDFOptions;
            dlgMain.pnlFileType.pnlOptions.grpPDFOptions.show();   
            break;
         case targaIndex:
            dlgMain.pnlFileType.pnlOptions.text = strTargaOptions;
            dlgMain.pnlFileType.pnlOptions.grpTargaOptions.show();   
            break;
         case png8Index:      
            dlgMain.pnlFileType.pnlOptions.text = strPNG8Options;
            dlgMain.pnlFileType.pnlOptions.grpPNG8Options.show();   
            break;
         case png24Index:      
            dlgMain.pnlFileType.pnlOptions.text = strPNG24Options;
            dlgMain.pnlFileType.pnlOptions.grpPNG24Options.show();   
            break;
         case psdIndex:   
         default:      
            dlgMain.pnlFileType.pnlOptions.text = strPSDOptions;
            dlgMain.pnlFileType.pnlOptions.grpPSDOptions.show();   
            break;
      }
   }
      
    dlgMain.ddFileType.items[exportInfo.fileType].selected = true;

   // -- now after all the radio buttons
    dlgMain.cbIcc = dlgMain.pnlFileType.add("checkbox", undefined, strCheckboxIncludeICCProfile);
    dlgMain.cbIcc.value = exportInfo.icc;
    dlgMain.cbIcc.alignment = 'left';

   // -- now the options panel that changes
    dlgMain.pnlFileType.pnlOptions = dlgMain.pnlFileType.add("panel", undefined, "Options");
    dlgMain.pnlFileType.pnlOptions.alignment = 'fill';
    dlgMain.pnlFileType.pnlOptions.orientation = 'stack';
    dlgMain.pnlFileType.pnlOptions.preferredSize.height = StrToIntWithDefault( strpnlOptions, 100 );

   // PSD options
    dlgMain.pnlFileType.pnlOptions.grpPSDOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPSDOptions.cbMax = dlgMain.pnlFileType.pnlOptions.grpPSDOptions.add("checkbox", undefined, strCheckboxMaximizeCompatibility);
    dlgMain.pnlFileType.pnlOptions.grpPSDOptions.cbMax.value = exportInfo.psdMaxComp;
   dlgMain.pnlFileType.pnlOptions.grpPSDOptions.visible = (exportInfo.fileType == psdIndex);
   
    // PNG8 options
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Trans = dlgMain.pnlFileType.pnlOptions.grpPNG8Options.add("checkbox", undefined, strCheckboxPNGTransparency.toString());
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Inter = dlgMain.pnlFileType.pnlOptions.grpPNG8Options.add("checkbox", undefined, strCheckboxPNGInterlaced.toString());
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Trans.value = exportInfo.png8Transparency;
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Inter.value = exportInfo.png8Interlaced;
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.visible = (exportInfo.fileType == png8Index);
   
    // PNG24 options
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Trans = dlgMain.pnlFileType.pnlOptions.grpPNG24Options.add("checkbox", undefined, strCheckboxPNGTransparency.toString());
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Inter = dlgMain.pnlFileType.pnlOptions.grpPNG24Options.add("checkbox", undefined, strCheckboxPNGInterlaced.toString());
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Trans.value = exportInfo.png24Transparency;
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Inter.value = exportInfo.png24Interlaced;
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.visible = (exportInfo.fileType == png24Index);
   
   // JPEG options
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.add("statictext", undefined, strLabelQuality);
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.etQuality = dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.add("edittext", undefined, exportInfo.jpegQuality.toString());
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.etQuality.preferredSize.width = StrToIntWithDefault( stretQuality, 30 );
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.visible = (exportInfo.fileType == jpegIndex);

   // TIFF options
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.orientation = 'column';
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.visible = (exportInfo.fileType == tiffIndex);
   
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.alignment = 'left';
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.add("statictext", undefined, strLabelImageCompression);
   

    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.add("dropdownlist");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.add("item", strNone);
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.add("item", "LZW");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.add("item", "ZIP");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.add("item", "JPEG");
   
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.onChange = function() {
      if (this.selection.index == compJPEGIndex) {
         dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.stQuality.enabled = true;
         dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.enabled = true;
      } else {
         dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.stQuality.enabled = false;
         dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.enabled = false;
      }
    }

   dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.alignment = 'left';
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.stQuality = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.add("statictext", undefined, strLabelQuality);
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.add("edittext", undefined, exportInfo.tiffJpegQuality.toString());
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.preferredSize.width = StrToIntWithDefault( stretQuality, 30 );
   dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.graphics.disabledBackgroundColor = brush;

   var index;
    switch (exportInfo.tiffCompression) {
      case TIFFEncoding.NONE:     index = compNoneIndex; break;
        case TIFFEncoding.TIFFLZW:  index = compLZWIndex; break;
        case TIFFEncoding.TIFFZIP:  index = compZIPIndex; break;
        case TIFFEncoding.JPEG:     index = compJPEGIndex; break;
        default: index = compNoneIndex;    break;
    }

    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.items[index].selected = true;

   if (TIFFEncoding.JPEG != exportInfo.tiffCompression) { // if not JPEG
      dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.stQuality.enabled = false;
      dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.enabled = false;
    }
   

   // PDF options
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.orientation = 'column';
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.visible = (exportInfo.fileType == pdfIndex);

    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.alignment = 'left';
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.add("statictext", undefined, strLabelEncoding);

    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbZip = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.add("radiobutton", undefined, "ZIP");
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbZip.onClick = function() {
      dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.stQuality.enabled = false;   
      dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.enabled = false;   
   }

    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbJpeg = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.add("radiobutton", undefined, "JPEG");
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbJpeg.onClick = function() {
      dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.stQuality.enabled = true;   
      dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.enabled = true;   
   }
   
   dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.alignment = 'left';
   
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.stQuality = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.add("statictext", undefined, strLabelQuality);

    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.add("edittext", undefined, exportInfo.pdfJpegQuality.toString());
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.preferredSize.width = StrToIntWithDefault( stretQuality, 30 );
   dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.graphics.disabledBackgroundColor = brush;

    switch (exportInfo.pdfEncoding) {
        case PDFEncoding.PDFZIP:
         dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbZip.value  = true;    break;
        case PDFEncoding.JPEG:
        default:
         dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbJpeg.value = true;    break;
    }
   
    if (PDFEncoding.JPEG != exportInfo.pdfEncoding) {
        dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.stQuality.enabled = false;
        dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.enabled = false;
    }

   // Targa options
   dlgMain.pnlFileType.pnlOptions.grpTargaOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.add("statictext", undefined, strLabelDepth);
    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.visible = (exportInfo.fileType == targaIndex);

    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb16bit = dlgMain.pnlFileType.pnlOptions.grpTargaOptions.add( "radiobutton", undefined, strRadiobutton16bit);
    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb24bit = dlgMain.pnlFileType.pnlOptions.grpTargaOptions.add( "radiobutton", undefined, strRadiobutton24bit);
    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb32bit = dlgMain.pnlFileType.pnlOptions.grpTargaOptions.add( "radiobutton", undefined, strRadiobutton32bit);

    switch (exportInfo.targaDepth) {
        case TargaBitsPerPixels.SIXTEEN:     dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb16bit.value = true;   break;
        case TargaBitsPerPixels.TWENTYFOUR:  dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb24bit.value = true;   break;
        case TargaBitsPerPixels.THIRTYTWO:   dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb32bit.value = true;   break;
        default: dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb24bit.value = true;   break;
    }


   // BMP options
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.add("statictext", undefined, strLabelDepth);
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.visible = (exportInfo.fileType == bmpIndex);

    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb16bit = dlgMain.pnlFileType.pnlOptions.grpBMPOptions.add( "radiobutton", undefined, strRadiobutton16bit);
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb24bit = dlgMain.pnlFileType.pnlOptions.grpBMPOptions.add( "radiobutton", undefined, strRadiobutton24bit);
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb32bit = dlgMain.pnlFileType.pnlOptions.grpBMPOptions.add( "radiobutton", undefined, strRadiobutton32bit);

    switch (exportInfo.bmpDepth) {
        case BMPDepthType.SIXTEEN:   dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb16bit.value = true;   break;
        case BMPDepthType.TWENTYFOUR:dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb24bit.value = true;   break;
        case BMPDepthType.THIRTYTWO: dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb32bit.value = true;   break;
        default: dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb24bit.value = true;   break;
    }

   // the right side of the dialog, the ok and cancel buttons
   dlgMain.grpTopRight = dlgMain.grpTop.add("group");
   dlgMain.grpTopRight.orientation = 'column';
   dlgMain.grpTopRight.alignChildren = 'fill';
   
   dlgMain.btnRun = dlgMain.grpTopRight.add("button", undefined, strButtonRun );
    dlgMain.btnRun.onClick = function() {
      // check if the setting is properly
      var destination = dlgMain.etDestination.text;
      if (destination.length == 0) {
           alert(strAlertSpecifyDestination);
         return;
      }
      var testFolder = new Folder(destination);
      if (!testFolder.exists) {
           alert(strAlertDestinationNotExist);
         return;
      }
   
      dlgMain.close(runButtonID);
   }

   dlgMain.btnCancel = dlgMain.grpTopRight.add("button", undefined, strButtonCancel );
    dlgMain.btnCancel.onClick = function() {
      dlgMain.close(cancelButtonID);
   }

   dlgMain.defaultElement = dlgMain.btnRun;
   dlgMain.cancelElement = dlgMain.btnCancel;

      // the bottom of the dialog
   dlgMain.grpBottom = dlgMain.add("group");
   dlgMain.grpBottom.orientation = 'column';
   dlgMain.grpBottom.alignChildren = 'left';
   dlgMain.grpBottom.alignment = 'fill';
   
    dlgMain.pnlHelp = dlgMain.grpBottom.add("panel");
    dlgMain.pnlHelp.alignment = 'fill';

    dlgMain.etHelp = dlgMain.pnlHelp.add("statictext", undefined, strHelpText, {multiline:true});
    dlgMain.etHelp.alignment = 'fill';

   // do not allow anything except for numbers 0-9
   dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.addEventListener ('keydown', NumericEditKeyboardHandler);

   // do not allow anything except for numbers 0-9
   dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.addEventListener ('keydown', NumericEditKeyboardHandler);

   // do not allow anything except for numbers 0-9
   dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.etQuality.addEventListener ('keydown', NumericEditKeyboardHandler);

    dlgMain.onShow = function() {
       dlgMain.ddFileType.onChange();
    }

    // in case we double clicked the file
    app.bringToFront();

    dlgMain.center();
   
    var result = dlgMain.show();
   
    if (cancelButtonID == result) {
      return result;  // close to quit
   }
   
    // get setting from dialog
    exportInfo.destination = dlgMain.etDestination.text;
    exportInfo.fileNamePrefix = dlgMain.etFileNamePrefix.text;
    exportInfo.selectionOnly = dlgMain.cbSelection.value;
    exportInfo.sillyNumbering = dlgMain.snSelection.value;   // by l-i-n-k
    exportInfo.fileType = dlgMain.ddFileType.selection.index;
    exportInfo.icc = dlgMain.cbIcc.value;
    exportInfo.jpegQuality = dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.etQuality.text;
    exportInfo.psdMaxComp = dlgMain.pnlFileType.pnlOptions.grpPSDOptions.cbMax.value;
    index = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.selection.index;
    if (index == compNoneIndex) {
      exportInfo.tiffCompression = TIFFEncoding.NONE;
   }
    if (index == compLZWIndex) {
      exportInfo.tiffCompression = TIFFEncoding.TIFFLZW;
   }
    if (index == compZIPIndex) {
      exportInfo.tiffCompression = TIFFEncoding.TIFFZIP;
   }
    if (index == compJPEGIndex) {
      exportInfo.tiffCompression = TIFFEncoding.JPEG;
   }
    exportInfo.tiffJpegQuality = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.text;
    if (dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbZip.value) {
      exportInfo.pdfEncoding = PDFEncoding.PDFZIP;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbJpeg.value) {
      exportInfo.pdfEncoding = PDFEncoding.JPEG;
   }
    exportInfo.pdfJpegQuality = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.text;
    if (dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb16bit.value) {
      exportInfo.targaDepth = TargaBitsPerPixels.SIXTEEN;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb24bit.value) {
      exportInfo.targaDepth = TargaBitsPerPixels.TWENTYFOUR;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb32bit.value) {
      exportInfo.targaDepth = TargaBitsPerPixels.THIRTYTWO;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb16bit.value) {
      exportInfo.bmpDepth = BMPDepthType.SIXTEEN;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb24bit.value) {
      exportInfo.bmpDepth = BMPDepthType.TWENTYFOUR;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb32bit.value) {
      exportInfo.bmpDepth = BMPDepthType.THIRTYTWO;
   }

    return result;
}


///////////////////////////////////////////////////////////////////////////////
// Function: hideAllFileTypePanel
// Usage: hide all the panels in the common actions
// Input: <none>, dlgMain is a global for this script
// Return: <none>, all panels are now hidden
///////////////////////////////////////////////////////////////////////////////
function hideAllFileTypePanel() {
    dlgMain.pnlFileType.pnlOptions.grpPSDOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.hide();
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.hide();
}


///////////////////////////////////////////////////////////////////////////////
// Function: initExportInfo
// Usage: create our default parameters
// Input: a new Object
// Return: a new object with params set to default
///////////////////////////////////////////////////////////////////////////////
function initExportInfo(exportInfo)
{
    exportInfo.destination = new String("");
    exportInfo.fileNamePrefix = new String("untitled_");
    exportInfo.selectionOnly = false;
    exportInfo.sillyNumbering = true;   // by l-i-n-k
    exportInfo.fileType = psdIndex;
    exportInfo.icc = true;
    exportInfo.jpegQuality = 8;
    exportInfo.psdMaxComp = true;
    exportInfo.tiffCompression = TIFFEncoding.NONE;
    exportInfo.tiffJpegQuality = 8;
    exportInfo.pdfEncoding = PDFEncoding.JPEG;
    exportInfo.pdfJpegQuality = 8;
    exportInfo.targaDepth = TargaBitsPerPixels.TWENTYFOUR;
    exportInfo.bmpDepth = BMPDepthType.TWENTYFOUR;
    exportInfo.png24Transparency = true;
    exportInfo.png24Interlaced = false;
    exportInfo.png8Transparency = true;
    exportInfo.png8Interlaced = false;

    try {
        exportInfo.destination = Folder(app.activeDocument.fullName.parent).fsName; // destination folder
        var tmp = app.activeDocument.fullName.name;
        exportInfo.fileNamePrefix = decodeURI(tmp.substring(0, tmp.indexOf("."))); // filename body part
    } catch(someError) {
        exportInfo.destination = new String("");
        exportInfo.fileNamePrefix = app.activeDocument.name; // filename body part
    }
}


///////////////////////////////////////////////////////////////////////////////
// Function: saveFile
// Usage: the worker routine, take our params and save the file accordingly
// Input: reference to the document, the name of the output file,
//        export info object containing more information
// Return: <none>, a file on disk
///////////////////////////////////////////////////////////////////////////////
function saveFile( docRef, fileNameBody, exportInfo)
{
   if ( true /* folderExists(exportInfo.destination)*/) {
      switch (exportInfo.fileType) {
         case jpegIndex:
            docRef.bitsPerChannel = BitsPerChannelType.EIGHT;
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".jpg");
            jpgSaveOptions = new JPEGSaveOptions();
            jpgSaveOptions.embedColorProfile = exportInfo.icc;
            jpgSaveOptions.quality = exportInfo.jpegQuality;
            docRef.saveAs(saveFile, jpgSaveOptions, true, Extension.LOWERCASE);
            break;
         case psdIndex:
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".psd");
            psdSaveOptions = new PhotoshopSaveOptions();
            psdSaveOptions.embedColorProfile = exportInfo.icc;
            docRef.saveAs(saveFile, psdSaveOptions, true, Extension.LOWERCASE);
            break;
         case tiffIndex:
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".tif");
            tiffSaveOptions = new TiffSaveOptions();
            tiffSaveOptions.embedColorProfile = exportInfo.icc;
            tiffSaveOptions.imageCompression = exportInfo.tiffCompression;
            if (TIFFEncoding.JPEG == exportInfo.tiffCompression)    tiffSaveOptions.jpegQuality = exportInfo.tiffJpegQuality;
            docRef.saveAs(saveFile, tiffSaveOptions, true, Extension.LOWERCASE);
            break;
         case pdfIndex:
            if (docRef.bitsPerChannel == BitsPerChannelType.THIRTYTWO)
               docRef.bitsPerChannel = BitsPerChannelType.SIXTEEN;
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".pdf");
            pdfSaveOptions = new PDFSaveOptions();
            pdfSaveOptions.embedColorProfile = exportInfo.icc;
            pdfSaveOptions.encoding = exportInfo.pdfEncoding;
            if (PDFEncoding.JPEG == exportInfo.pdfEncoding) pdfSaveOptions.jpegQuality = exportInfo.pdfJpegQuality;
            docRef.saveAs(saveFile, pdfSaveOptions, true, Extension.LOWERCASE);
            break;
         case targaIndex:
            docRef.bitsPerChannel = BitsPerChannelType.EIGHT;
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".tga");
            targaSaveOptions = new TargaSaveOptions();
            targaSaveOptions.resolution = exportInfo.targaDepth;
            docRef.saveAs(saveFile, targaSaveOptions, true, Extension.LOWERCASE);
            break;
         case bmpIndex:
            docRef.bitsPerChannel = BitsPerChannelType.EIGHT;
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".bmp");
            bmpSaveOptions = new BMPSaveOptions();
            bmpSaveOptions.depth = exportInfo.bmpDepth;
            docRef.saveAs(saveFile, bmpSaveOptions, true, Extension.LOWERCASE);
            break;
        case png8Index:
         saveFile(docRef, fileNameBody, exportInfo, dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Inter.value, dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Trans.value);
           function saveFile( docRef, fileNameBody, exportInfo, interlacedValue, transparencyValue) {
            var id5 = charIDToTypeID( "Expr" );
               var desc3 = new ActionDescriptor();
               var id6 = charIDToTypeID( "Usng" );
                  var desc4 = new ActionDescriptor();
                  var id7 = charIDToTypeID( "Op  " );
                  var id8 = charIDToTypeID( "SWOp" );
                  var id9 = charIDToTypeID( "OpSa" );
                  desc4.putEnumerated( id7, id8, id9 );
                  var id10 = charIDToTypeID( "Fmt " );
                  var id11 = charIDToTypeID( "IRFm" );
                  var id12 = charIDToTypeID( "PNG8" );
                  desc4.putEnumerated( id10, id11, id12 );
                  var id13 = charIDToTypeID( "Intr" ); //Interlaced
                  desc4.putBoolean( id13, interlacedValue );
                  var id14 = charIDToTypeID( "RedA" );
                  var id15 = charIDToTypeID( "IRRd" );
                  var id16 = charIDToTypeID( "Prcp" ); //Algorithm
                  desc4.putEnumerated( id14, id15, id16 );
                  var id17 = charIDToTypeID( "RChT" );
                  desc4.putBoolean( id17, false );
                  var id18 = charIDToTypeID( "RChV" );
                  desc4.putBoolean( id18, false );
                  var id19 = charIDToTypeID( "AuRd" );
                  desc4.putBoolean( id19, false );
                  var id20 = charIDToTypeID( "NCol" ); //NO. Of Colors
                  desc4.putInteger( id20, 256 );
                  var id21 = charIDToTypeID( "Dthr" ); //Dither
                  var id22 = charIDToTypeID( "IRDt" );
                  var id23 = charIDToTypeID( "Dfsn" ); //Dither type
                  desc4.putEnumerated( id21, id22, id23 );
                  var id24 = charIDToTypeID( "DthA" );
                  desc4.putInteger( id24, 100 );
                  var id25 = charIDToTypeID( "DChS" );
                  desc4.putInteger( id25, 0 );
                  var id26 = charIDToTypeID( "DCUI" );
                  desc4.putInteger( id26, 0 );
                  var id27 = charIDToTypeID( "DChT" );
                  desc4.putBoolean( id27, false );
                  var id28 = charIDToTypeID( "DChV" );
                  desc4.putBoolean( id28, false );
                  var id29 = charIDToTypeID( "WebS" );
                  desc4.putInteger( id29, 0 );
                  var id30 = charIDToTypeID( "TDth" ); //transparency dither
                  var id31 = charIDToTypeID( "IRDt" );
                  var id32 = charIDToTypeID( "None" );
                  desc4.putEnumerated( id30, id31, id32 );
                  var id33 = charIDToTypeID( "TDtA" );
                  desc4.putInteger( id33, 100 );
                  var id34 = charIDToTypeID( "Trns" ); //Transparency
                  desc4.putBoolean( id34, transparencyValue );
                  var id35 = charIDToTypeID( "Mtt " );
                  desc4.putBoolean( id35, true );       //matte
                  var id36 = charIDToTypeID( "MttR" ); //matte color
                  desc4.putInteger( id36, 255 );
                  var id37 = charIDToTypeID( "MttG" );
                  desc4.putInteger( id37, 255 );
                  var id38 = charIDToTypeID( "MttB" );
                  desc4.putInteger( id38, 255 );
                  var id39 = charIDToTypeID( "SHTM" );
                  desc4.putBoolean( id39, false );
                  var id40 = charIDToTypeID( "SImg" );
                  desc4.putBoolean( id40, true );
                  var id41 = charIDToTypeID( "SSSO" );
                  desc4.putBoolean( id41, false );
                  var id42 = charIDToTypeID( "SSLt" );
                     var list1 = new ActionList();
                  desc4.putList( id42, list1 );
                  var id43 = charIDToTypeID( "DIDr" );
                  desc4.putBoolean( id43, false );
                  var id44 = charIDToTypeID( "In  " );
                  desc4.putPath( id44, new File( exportInfo.destination + "/" + fileNameBody + ".png") );
               var id45 = stringIDToTypeID( "SaveForWeb" );
               desc3.putObject( id6, id45, desc4 );
            executeAction( id5, desc3, DialogModes.NO );
         }
            break;
        case png24Index:
           saveFile(docRef, fileNameBody, exportInfo, dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Inter.value, dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Trans.value);
           function saveFile( docRef, fileNameBody, exportInfo, interlacedValue, transparencyValue) {
         var id6 = charIDToTypeID( "Expr" );
            var desc3 = new ActionDescriptor();
            var id7 = charIDToTypeID( "Usng" );
               var desc4 = new ActionDescriptor();
               var id8 = charIDToTypeID( "Op  " );
               var id9 = charIDToTypeID( "SWOp" );
               var id10 = charIDToTypeID( "OpSa" );
                 desc4.putEnumerated( id8, id9, id10 );
               var id11 = charIDToTypeID( "Fmt " );
               var id12 = charIDToTypeID( "IRFm" );
               var id13 = charIDToTypeID( "PN24" );
               desc4.putEnumerated( id11, id12, id13 );
               var id14 = charIDToTypeID( "Intr" );
               desc4.putBoolean( id14, interlacedValue );
               var id15 = charIDToTypeID( "Trns" );
               desc4.putBoolean( id15, transparencyValue );
               var id16 = charIDToTypeID( "Mtt " );
               desc4.putBoolean( id16, true );
               var id17 = charIDToTypeID( "MttR" );
               desc4.putInteger( id17, 255 );
               var id18 = charIDToTypeID( "MttG" );
               desc4.putInteger( id18, 255 );
               var id19 = charIDToTypeID( "MttB" );
               desc4.putInteger( id19, 255 );
               var id20 = charIDToTypeID( "SHTM" );
               desc4.putBoolean( id20, false );
               var id21 = charIDToTypeID( "SImg" );
               desc4.putBoolean( id21, true );
               var id22 = charIDToTypeID( "SSSO" );
               desc4.putBoolean( id22, false );
               var id23 = charIDToTypeID( "SSLt" );
                  var list1 = new ActionList();
               desc4.putList( id23, list1 );
               var id24 = charIDToTypeID( "DIDr" );
               desc4.putBoolean( id24, false );
               var id25 = charIDToTypeID( "In  " );
               desc4.putPath( id25, new File( exportInfo.destination + "/" + fileNameBody + ".png") );
            var id26 = stringIDToTypeID( "SaveForWeb" );
            desc3.putObject( id7, id26, desc4 );
         executeAction( id6, desc3, DialogModes.NO );
         }
       
            break;
         default:
            if ( DialogModes.NO != app.playbackDisplayDialogs ) {
               alert(strUnexpectedError);
            }
            break;
      }
   }
}


///////////////////////////////////////////////////////////////////////////////
// Function: zeroSuppress
// Usage: return a string padded to digit(s)
// Input: num to convert, digit count needed
// Return: string padded to digit length
///////////////////////////////////////////////////////////////////////////////
function zeroSuppress (num, digit)
{
    var tmp = num.toString();
    while (tmp.length < digit) {
      tmp = "0" + tmp;
   }
    return tmp;
}


///////////////////////////////////////////////////////////////////////////////
// Function: objectToDescriptor
// Usage: create an ActionDescriptor from a JavaScript Object
// Input: JavaScript Object (o)
//        object unique string (s)
//        Pre process converter (f)
// Return: ActionDescriptor
// NOTE: Only boolean, string, number and UnitValue are supported, use a pre processor
//       to convert (f) other types to one of these forms.
// REUSE: This routine is used in other scripts. Please update those if you
//        modify. I am not using include or eval statements as I want these
//        scripts self contained.
///////////////////////////////////////////////////////////////////////////////
function objectToDescriptor (o, s, f) {
   if (undefined != f) {
      o = f(o);
   }
   var d = new ActionDescriptor;
   var l = o.reflect.properties.length;
   d.putString( app.charIDToTypeID( 'Msge' ), s );
   for (var i = 0; i < l; i++ ) {
      var k = o.reflect.properties.toString();
      if (k == "__proto__" || k == "__count__" || k == "__class__" || k == "reflect")
         continue;
      var v = o[ k ];
      k = app.stringIDToTypeID(k);
      switch ( typeof(v) ) {
         case "boolean":
            d.putBoolean(k, v);
            break;
         case "string":
            d.putString(k, v);
            break;
         case "number":
            d.putDouble(k, v);
            break;
         default:
         {
            if ( v instanceof UnitValue ) {
               var uc = new Object;
               uc["px"] = charIDToTypeID("#Rlt"); // unitDistance
               uc["%"] = charIDToTypeID("#Prc"); // unitPercent
               d.putUnitDouble(k, uc[v.type], v.value);
            } else {
               throw( new Error("Unsupported type in objectToDescriptor " + typeof(v) ) );
            }
         }
      }
   }
    return d;
}


///////////////////////////////////////////////////////////////////////////////
// Function: descriptorToObject
// Usage: update a JavaScript Object from an ActionDescriptor
// Input: JavaScript Object (o), current object to update (output)
//        Photoshop ActionDescriptor (d), descriptor to pull new params for object from
//        object unique string (s)
//        JavaScript Function (f), post process converter utility to convert
// Return: Nothing, update is applied to passed in JavaScript Object (o)
// NOTE: Only boolean, string, number and UnitValue are supported, use a post processor
//       to convert (f) other types to one of these forms.
// REUSE: This routine is used in other scripts. Please update those if you
//        modify. I am not using include or eval statements as I want these
//        scripts self contained.
///////////////////////////////////////////////////////////////////////////////
function descriptorToObject (o, d, s, f) {
   var l = d.count;
   if (l) {
       var keyMessage = app.charIDToTypeID( 'Msge' );
        if ( d.hasKey(keyMessage) && ( s != d.getString(keyMessage) )) return;
   }
   for (var i = 0; i < l; i++ ) {
      var k = d.getKey(i); // i + 1 ?
      var t = d.getType(k);
      strk = app.typeIDToStringID(k);
      switch (t) {
         case DescValueType.BOOLEANTYPE:
            o[strk] = d.getBoolean(k);
            break;
         case DescValueType.STRINGTYPE:
            o[strk] = d.getString(k);
            break;
         case DescValueType.DOUBLETYPE:
            o[strk] = d.getDouble(k);
            break;
         case DescValueType.UNITDOUBLE:
            {
            var uc = new Object;
            uc[charIDToTypeID("#Rlt")] = "px"; // unitDistance
            uc[charIDToTypeID("#Prc")] = "%"; // unitPercent
            uc[charIDToTypeID("#Pxl")] = "px"; // unitPixels
            var ut = d.getUnitDoubleType(k);
            var uv = d.getUnitDoubleValue(k);
            o[strk] = new UnitValue( uv, uc[ut] );
            }
            break;
         case DescValueType.INTEGERTYPE:
         case DescValueType.ALIASTYPE:
         case DescValueType.CLASSTYPE:
         case DescValueType.ENUMERATEDTYPE:
         case DescValueType.LISTTYPE:
         case DescValueType.OBJECTTYPE:
         case DescValueType.RAWTYPE:
         case DescValueType.REFERENCETYPE:
         default:
            throw( new Error("Unsupported type in descriptorToObject " + t ) );
      }
   }
   if (undefined != f) {
      o = f(o);
   }
}


///////////////////////////////////////////////////////////////////////////////
// Function: preProcessExportInfo
// Usage: convert Photoshop enums to strings for storage
// Input: JavaScript Object of my params for this script
// Return: JavaScript Object with objects converted for storage
///////////////////////////////////////////////////////////////////////////////
function preProcessExportInfo(o) {
   o.tiffCompression = o.tiffCompression.toString();
   o.pdfEncoding = o.pdfEncoding.toString();
   o.targaDepth = o.targaDepth.toString();
   o.bmpDepth = o.bmpDepth.toString();
   return o;
}

///////////////////////////////////////////////////////////////////////////////
// Function: postProcessExportInfo
// Usage: convert strings from storage to Photoshop enums
// Input: JavaScript Object of my params in string form
// Return: JavaScript Object with objects in enum form
///////////////////////////////////////////////////////////////////////////////
function postProcessExportInfo(o) {
   o.tiffCompression = eval(o.tiffCompression);
   o.pdfEncoding = eval(o.pdfEncoding);
   o.targaDepth = eval(o.targaDepth);
   o.bmpDepth = eval(o.bmpDepth);
   return o;
}

///////////////////////////////////////////////////////////////////////////
// Function: StrToIntWithDefault
// Usage: convert a string to a number, first stripping all characters
// Input: string and a default number
// Return: a number
///////////////////////////////////////////////////////////////////////////
function StrToIntWithDefault( s, n ) {
    var onlyNumbers = /[^0-9]/g;
    var t = s.replace( onlyNumbers, "" );
   t = parseInt( t );
   if ( ! isNaN( t ) ) {
        n = t;
    }
    return n;
}

///////////////////////////////////////////////////////////////////////////////
// Function: folderExists
// Usage: see if the string passed in is a valid folder ask to create if not
// Input: string of the folder in question
// Return: true if folder exists or was created successfully
///////////////////////////////////////////////////////////////////////////////
function folderExists( folderAsString ) {
   var f = Folder(folderAsString);
   if (f.exists) return true;
   if (DialogModes.NO == app.playbackDisplayDialogs) return false;
   if (confirm(strCreateFolder + folderAsString)) {
      if (f.create()) {
         return true;
      } else {
         alert(strCouldNotCreate);
      }
   }
   return false;
}

///////////////////////////////////////////////////////////////////////////////
// Function: NumericEditKeyboardHandler
// Usage: Do not allow anything except for numbers 0-9
// Input: ScriptUI keydown event
// Return: <nothing> key is rejected and beep is sounded if invalid
///////////////////////////////////////////////////////////////////////////////
function NumericEditKeyboardHandler (event) {
    try {
        var keyIsOK = KeyIsNumeric (event) ||
                    KeyIsDelete (event) ||
                 KeyIsLRArrow (event) ||
                 KeyIsTabEnterEscape (event);
                
        if (! keyIsOK) {
            //    Bad input: tell ScriptUI not to accept the keydown event
            event.preventDefault();
            /*    Notify user of invalid input: make sure NOT
                to put up an alert dialog or do anything which
                requires user interaction, because that
                interferes with preventing the 'default'
                action for the keydown event */
            app.beep();
        }
    }
    catch (e) {
        ; // alert ("Ack! bug in NumericEditKeyboardHandler: " + e);
    }
}


//    key identifier functions
function KeyHasModifier (event) {
    return event.shiftKey || event.ctrlKey || event.altKey || event.metaKey;
}

function KeyIsNumeric (event) {
    return  (event.keyName >= '0') && (event.keyName <= '9') && ! KeyHasModifier (event);
}

function KeyIsDelete (event) {
    //    Shift-delete is ok
    return ((event.keyName == 'Backspace') || (event.keyName == 'Delete')) && ! (event.ctrlKey);
}

function KeyIsLRArrow (event) {
    return ((event.keyName == 'Left') || (event.keyName == 'Right')) && ! (event.altKey || event.metaKey);
}

function KeyIsTabEnterEscape (event) {
   return event.keyName == 'Tab' || event.keyName == 'Enter' || event.keyName == 'Escape';
}

// End Layer Comps To Files.jsx

Professional AI Audio Generation within Adobe Premiere Pro - Download Free Plugin here

Mike Hale

Layer Comps to Files + Delete hidden layers

Post by Mike Hale »

I think this should work...

Add this function
Code: Select allfunction deleteHiddenLayers(){
   var desc = new ActionDescriptor();
   var ref = new ActionReference();
   ref.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), stringIDToTypeID( "hidden" ) );
   desc.putReference( charIDToTypeID( "null" ), ref );
   executeAction( charIDToTypeID( "Dlt " ), desc, DialogModes.NO );
}

Then insert a line between 188 and 189 to call the new function.
Limey

Layer Comps to Files + Delete hidden layers

Post by Limey »

Mike, I love the fact that you didn't give me the completed script this time. I had to really think things through and figure out where to put the function (and ended up deciding it didn't really matter) but then I needed to figure out where to put the call for it. At first I just put "deleteHiddenLayers" and forgot the () so needles to say it didn't work. Then Extendscript toolkit suggested it with () so I thought what the heck! It worked

It's great! It's so fast too. Ok, so now that that's done. I remembered what I forgot to add. Ok, I know, I'm greedy ain't I?

All those darn layer comps are going over with the saved files. There's often over 100 at a time. Not sure if it would be easier to search the web (PS-Scripts) for a script to select all layer comps and delete them after saving (run it as an action) or whether it can be built into the new and improved Layer Comps TO Files script.

Any thoughts on this?

Paul

P.S You Rock!
Mike Hale

Layer Comps to Files + Delete hidden layers

Post by Mike Hale »

Sorry, I didn't think you would have any trouble adding the function. Glad you got it working.

Add this line just before the remove hidden line you just added. Make sure it's after the doc dupe layer or you will remove them from your main document.
Code: Select allwhile(activeDocument.layerComps.length>0){activeDocument.layerComps[0].remove()};
Limey

Layer Comps to Files + Delete hidden layers

Post by Limey »

Fantastic! Thanks Mike. I told you I am still in the learning mode but every achievement just spurs me on to learn more. I understand the principal of functions better having done this.
Please don't be sorry because It just encouraged me to figure out what to do on my own. It's very basic and simple stuff to most that post on here I'm sure but I'm still taking baby steps. I'm hoping to be running around before too long or at least walking about without holding on.
Next step is working out the code for myself and that's a steeper learning curve that where to place a function call.

This modification to Adobe's standard Comps to Files will help a lot in streamlining my work flow.

As always Mike, Thanks!

Paul
Mike Hale

Layer Comps to Files + Delete hidden layers

Post by Mike Hale »

To help with your next step here is how I determined how to modify the script.

Because the function I wanted to add was in the function myVariable() and didn't use any external variables I put it at the bottom. Then I did a quick scan looking for 'save' or 'export' without really following what the script was doing. When I found the lineCode: Select allsaveFile(duppedDocument, fileNameBody, exportInfo);I read up until I found the dupe line. Because the code between those two lines just create the filename used to save I knew I could put the call anywhere between those two lines to change the output without effecting the rest of the script.
Limey

Layer Comps to Files + Delete hidden layers

Post by Limey »

That's exactly what I did! I looked for the save and read up to the dupe. So if a function uses external variables, the placement of that function is more critical?
I ran scriptlistener on the Delete hidden files and compared what was in the log to your code to see what parts you used. Trying to reverse engineer it so to speak to see how you got what you needed and what parts were not required. Next I am going to see if I can do some very basic tasks in Photoshop, listen and convert to code. That I hope will clear things up for me.

Question: For some reason everything works fine at one moment and then other times it's giving me this error and the script won't run. Got any idea what might cause it? It has something to do with the dialog box. This was happening before the delete layer comps was added. Actually, now I can't open it at all.

Error 519: Server interface error ''
- Server interface error 'No component returned from CreateWidget'
Line: 250
-> dlgMain.add("statictext", undefined, strLabelDestination);

Here is the full code of the script as I am running it now. Does it work for you?

Code: Select all// Copyright 2007.  Adobe Systems, Incorporated.  All rights reserved.
// This script will apply each comp and then export to a file
// Written by Naoki Hada
// ZStrings and auto layout by Tom Ruark
// PNG support by Jeffrey Tranberry

/*
@@@BUILDINFO@@@ Layer Comps To Files.jsx 1.0.0.20
*/

/*

// BEGIN__HARVEST_EXCEPTION_ZSTRING

<javascriptresource>
<name>$$$/JavaScripts/LayerCompsToFiles/Menu=Layer Comps to Files...</name>
<category>layercomps</category>
<enableinfo>true</enableinfo>
<eventid>cf34b502-2013-4d07-8431-1dfd634ee0cd</eventid>
<terminology><![CDATA[<< /Version 1
                         /Events <<
                          /cf34b502-2013-4d07-8431-1dfd634ee0cd [($$$/JavaScripts/LayerCompsToFiles/Action=Layer Comps to Files) /noDirectParam <<
                          >>]
                         >>
                      >> ]]></terminology>
</javascriptresource>

// END__HARVEST_EXCEPTION_ZSTRING

*/

// enable double clicking from the Macintosh Finder or the Windows Explorer
#target photoshop

// debug level: 0-2 (0:disable, 1:break on error, 2:break at beginning)
// $.level = 0;
// debugger; // launch debugger on next line

// on localized builds we pull the $$$/Strings from a .dat file, see documentation for more details
$.localize = true;

//=================================================================
// Globals
//=================================================================

// UI strings to be localized
var strTitle = localize("$$$/JavaScripts/LayerCompsToFiles/Title=Layer Comps To Files");
var strButtonRun = localize("$$$/JavaScripts/LayerCompsToFiles/Run=Run");
var strButtonCancel = localize("$$$/JavaScripts/LayerCompsToFiles/Cancel=Cancel");
var strHelpText = localize("$$$/JavaScripts/LayerCompsToFiles/Help=Please specify the format and location for saving each layer comp as a file.");
var strLabelDestination = localize("$$$/JavaScripts/LayerCompsToFiles/Destination=Destination:");
var strButtonBrowse = localize("$$$/JavaScripts/LayerCompsToFiles/Browse=&Browse...");
var strLabelFileNamePrefix = localize("$$$/JavaScripts/LayerCompsToFiles/FileNamePrefix=File Name Prefix:");
var strCheckboxSelectionOnly = localize("$$$/JavaScripts/LayerCompsToFiles/SelectedOnly=&Selected Layer Comps Only");
var strLabelFileType = localize("$$$/JavaScripts/LayerCompsToFiles/FileType=File Type:");
var strCheckboxIncludeICCProfile = localize("$$$/JavaScripts/LayerCompsToFiles/IncludeICC=&Include ICC Profile");
var strJPEGOptions = localize("$$$/JavaScripts/LayerCompsToFiles/JPEGOptions=JPEG Options:");
var strLabelQuality = localize("$$$/JavaScripts/LayerCompsToFiles/Quality=Quality:");
var strPSDOptions = localize("$$$/JavaScripts/LayerCompsToFiles/PSDOptions=PSD Options:");
var strCheckboxMaximizeCompatibility = localize("$$$/JavaScripts/LayerCompsToFiles/Maximize=&Maximize Compatibility");
var strTIFFOptions = localize("$$$/JavaScripts/LayerCompsToFiles/TIFFOptions=TIFF Options:");
var strLabelImageCompression = localize("$$$/JavaScripts/LayerCompsToFiles/ImageCompression=Image Compression:");
var strNone = localize("$$$/JavaScripts/LayerCompsToFiles/None=None");
var strPDFOptions = localize("$$$/JavaScripts/LayerCompsToFiles/PDFOptions=PDF Options:");
var strLabelEncoding = localize("$$$/JavaScripts/LayerCompsToFiles/Encoding=Encoding:");
var strTargaOptions = localize("$$$/JavaScripts/LayerCompsToFiles/TargaOptions=Targa Options:");
var strLabelDepth = localize("$$$/JavaScripts/LayerCompsToFiles/Depth=Depth:");
var strRadiobutton16bit = localize("$$$/JavaScripts/LayerCompsToFiles/Bit16=16bit");
var strRadiobutton24bit = localize("$$$/JavaScripts/LayerCompsToFiles/Bit24=24bit");
var strRadiobutton32bit = localize("$$$/JavaScripts/LayerCompsToFiles/Bit32=32bit");
var strBMPOptions = localize("$$$/JavaScripts/LayerCompsToFiles/BMPOptions=BMP Options:");
var strAlertSpecifyDestination = localize("$$$/JavaScripts/LayerCompsToFiles/SpecifyDestination=Please specify destination.");
var strAlertDestinationNotExist = localize("$$$/JavaScripts/LayerCompsToFiles/DestionationDoesNotExist=Destination does not exist.");
var strTitleSelectDestination = localize("$$$/JavaScripts/LayerCompsToFiles/SelectDestination=Select Destination");
var strAlertDocumentMustBeOpened = localize("$$$/JavaScripts/LayerCompsToFiles/OneDocument=You must have a document open to export!");
var strAlertNoLayerCompsFound = localize("$$$/JavaScripts/LayerCompsToFiles/NoComps=No layer comps found in document!");
var strAlertWasSuccessful = localize("$$$/JavaScripts/LayerCompsToFiles/Success= was successful.");
var strUnexpectedError = localize("$$$/JavaScripts/LayerCompsToFiles/Unexpectedd=Unexpected error");
var strMessage = localize("$$$/JavaScripts/LayerCompsToFiles/Message=Layer Comps To Files action settings");
var   stretQuality = localize( "$$$/locale_specific/JavaScripts/LayerCompsToFiles/ETQualityLength=30" );
var   stretDestination = localize( "$$$/locale_specific/JavaScripts/LayerCompsToFiles/ETDestinationLength=160" );
var   strddFileType = localize( "$$$/locale_specific/JavaScripts/LayerCompsToFiles/DDFileType=100" );
var   strpnlOptions = localize( "$$$/locale_specific/JavaScripts/LayerCompsToFiles/PNLOptions=100" );
var   strCreateFolder = localize( "$$$/JavaScripts/LayerCompsToFiles/CreateFolder=The folder does not exist. Do you wish to create it?\r" );
var   strCouldNotCreate = localize( "$$$/JavaScripts/LayerCompsToFiles/CouldNotCreate=The folder could not be created." );
var strPNG8Options = localize("$$$/JavaScripts/ExportLayersToFiles/PNG8Options=PNG-8 Options:");
var strCheckboxPNGTransparency = localize("$$$/JavaScripts/ExportLayersToFiles/Transparency=Transparency");
var strCheckboxPNGInterlaced = localize("$$$/JavaScripts/ExportLayersToFiles/Interlaced=Interlaced");
var strPNG24Options = localize("$$$/JavaScripts/ExportLayersToFiles/PNG24Options=PNG-24 Options:");
var strCheckboxSillyNumbering = "Remove silly numbering";

// the drop down list indexes for file type
var bmpIndex = 0;
var jpegIndex = 1;
var pdfIndex = 2;
var psdIndex = 3;
var targaIndex = 4;
var tiffIndex = 5;
var png8Index = 6;
var png24Index = 7;

// the drop down list indexes for tiff compression
var compNoneIndex = 0;
var compLZWIndex = 1;
var compZIPIndex = 2;
var compJPEGIndex = 3;

// ok and cancel button
var runButtonID = 1;
var cancelButtonID = 2;


///////////////////////////////////////////////////////////////////////////////
// Dispatch
///////////////////////////////////////////////////////////////////////////////


main();



///////////////////////////////////////////////////////////////////////////////
// Functions
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
// Function: main
// Usage: the core routine for this script
// Input: <none>
// Return: <none>
///////////////////////////////////////////////////////////////////////////////
function main() {
   
    if ( app.documents.length <= 0 ) {
        if ( DialogModes.NO != app.playbackDisplayDialogs ) {
            alert( strAlertDocumentMustBeOpened );
        }
       return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
    }

    var exportInfo = new Object();
   
    initExportInfo(exportInfo);
   
    // look for last used params via Photoshop registry, getCustomOptions will throw if none exist
   try {
      var d = app.getCustomOptions("d69fc733-75b4-4d5c-ae8a-c6d6f9a8aa32");
      descriptorToObject(exportInfo, d, strMessage, postProcessExportInfo);
   }
   catch(e) {
      // it's ok if we don't have any options, continue with defaults
   }
   
   // see if I am getting descriptor parameters
    descriptorToObject(exportInfo, app.playbackParameters, strMessage, postProcessExportInfo);
   
    if ( DialogModes.ALL == app.playbackDisplayDialogs ) {
       if (cancelButtonID == settingDialog(exportInfo)) {
          return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
       }
   }

    try {
        var docName = app.activeDocument.name;  // save the app.activeDocument name before duplicate.
        var compsName = new String("none");
        var compsCount = app.activeDocument.layerComps.length;
        if ( compsCount <= 1 ) {
            if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                alert ( strAlertNoLayerCompsFound );
            }
          return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
        } else {
            app.activeDocument = app.documents[docName];
            docRef = app.activeDocument;
   
            var rememberMaximize;
            var needMaximize = exportInfo.psdMaxComp ? QueryStateType.ALWAYS : QueryStateType.NEVER;
            if ( exportInfo.fileType == psdIndex && app.preferences.maximizeCompatibility != needMaximize ) {
                rememberMaximize = app.preferences.maximizeCompatibility;
                app.preferences.maximizeCompatibility = needMaximize;
            }
           
            for ( compsIndex = 0; compsIndex < compsCount; compsIndex++ ) {
                var compRef = docRef.layerComps[ compsIndex ];
                if (exportInfo.selectionOnly && !compRef.selected) continue; // selected only
                compRef.apply();
                var duppedDocument = app.activeDocument.duplicate();
                var fileNameBody = exportInfo.fileNamePrefix;
                // Remove silly numbering choice starting from 01
                if (exportInfo.sillyNumbering == false) fileNameBody += "-" + zeroSuppress(compsIndex+1, 2);    // by l-i-n-k
                // Add composition name with Minus instead of Underscore
                // fileNameBody += "_" + compRef.name;
                fileNameBody = compRef.name;   // by l-i-n-k
                if (null != compRef.comment)    fileNameBody += compRef.comment;
                fileNameBody = fileNameBody.replace(/[:\/\\*\?\"\<\>\|\\\r\\\n]/g, "_");  // '/\:*?"<>|\r\n' -> '_'
                if (fileNameBody.length > 120) fileNameBody = fileNameBody.substring(0,120);
                while(activeDocument.layerComps.length>0){activeDocument.layerComps[0].remove()};
                deleteHiddenLayers ()
                saveFile(duppedDocument, fileNameBody, exportInfo);
                duppedDocument.close(SaveOptions.DONOTSAVECHANGES);
            }

         var d = objectToDescriptor(exportInfo, strMessage, preProcessExportInfo);
            app.putCustomOptions("d69fc733-75b4-4d5c-ae8a-c6d6f9a8aa32", d);

         var dd = objectToDescriptor(exportInfo, strMessage, preProcessExportInfo);
            app.playbackParameters = dd;

            if ( rememberMaximize != undefined ) {
                app.preferences.maximizeCompatibility = rememberMaximize;
            }
           
            if ( DialogModes.ALL == app.playbackDisplayDialogs ) {
                alert(strTitle + strAlertWasSuccessful);
            }

            app.playbackDisplayDialogs = DialogModes.ALL;

        }
    }
    catch (e) {
        if ( DialogModes.NO != app.playbackDisplayDialogs ) {
            alert(e);
        }
       return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
    }
}


///////////////////////////////////////////////////////////////////////////////
// Function: settingDialog
// Usage: pop the ui and get user settings
// Input: exportInfo object containing our parameters
// Return: on ok, the dialog info is set to the exportInfo object
///////////////////////////////////////////////////////////////////////////////
function settingDialog(exportInfo)
{
    dlgMain = new Window("dialog", strTitle);
   
    // match our dialog background color to the host application
   var brush = dlgMain.graphics.newBrush(dlgMain.graphics.BrushType.THEME_COLOR, "appDialogBackground");
    dlgMain.graphics.backgroundColor = brush;
    dlgMain.graphics.disabledBackgroundColor = brush;

   dlgMain.orientation = 'column';
   dlgMain.alignChildren = 'left';
   
   // -- top of the dialog, first line
    dlgMain.add("statictext", undefined, strLabelDestination);

   // -- two groups, one for left and one for right ok, cancel
   dlgMain.grpTop = dlgMain.add("group");
   dlgMain.grpTop.orientation = 'row';
   dlgMain.grpTop.alignChildren = 'top';
   dlgMain.grpTop.alignment = 'fill';

   // -- group top left
   dlgMain.grpTopLeft = dlgMain.grpTop.add("group");
   dlgMain.grpTopLeft.orientation = 'column';
   dlgMain.grpTopLeft.alignChildren = 'left';
   dlgMain.grpTopLeft.alignment = 'fill';
   
   // -- the second line in the dialog
   dlgMain.grpSecondLine = dlgMain.grpTopLeft.add("group");
   dlgMain.grpSecondLine.orientation = 'row';
   dlgMain.grpSecondLine.alignChildren = 'center';

    dlgMain.etDestination = dlgMain.grpSecondLine.add("edittext", undefined, exportInfo.destination.toString());
    dlgMain.etDestination.preferredSize.width = StrToIntWithDefault( stretDestination, 160 );

    dlgMain.btnBrowse = dlgMain.grpSecondLine.add("button", undefined, strButtonBrowse);
    dlgMain.btnBrowse.onClick = function() {
      var defaultFolder = dlgMain.etDestination.text;
      var testFolder = new Folder(dlgMain.etDestination.text);
      if (!testFolder.exists) defaultFolder = "~";
      var selFolder = Folder.selectDialog(strTitleSelectDestination, defaultFolder);
      if ( selFolder != null ) {
           dlgMain.etDestination.text = selFolder.fsName;
       }
      dlgMain.defaultElement.active = true;
   }

   // -- the third line in the dialog
    dlgMain.grpTopLeft.add("statictext", undefined, strLabelFileNamePrefix);

   // -- the fourth line in the dialog
    dlgMain.etFileNamePrefix = dlgMain.grpTopLeft.add("edittext", undefined, exportInfo.fileNamePrefix.toString());
    dlgMain.etFileNamePrefix.alignment = 'fill';
    dlgMain.etFileNamePrefix.preferredSize.width = StrToIntWithDefault( stretDestination, 160 );

   // -- the fifth line in the dialog
    dlgMain.cbSelection = dlgMain.grpTopLeft.add("checkbox", undefined, strCheckboxSelectionOnly);
    dlgMain.cbSelection.value = exportInfo.selectionOnly;
   
    // -- the fifth and a half line in the dialog
    dlgMain.snSelection = dlgMain.grpTopLeft.add("checkbox", undefined, strCheckboxSillyNumbering);   // by l-i-n-k
    dlgMain.snSelection.value = exportInfo.sillyNumbering;   // by l-i-n-k

   // -- the sixth line is the panel
    dlgMain.pnlFileType = dlgMain.grpTopLeft.add("panel", undefined, strLabelFileType);
   dlgMain.pnlFileType.alignment = 'fill';
   
    // -- now a dropdown list
    dlgMain.ddFileType = dlgMain.pnlFileType.add("dropdownlist");
    dlgMain.ddFileType.preferredSize.width = StrToIntWithDefault( strddFileType, 100 );
    dlgMain.ddFileType.alignment = 'left';

    dlgMain.ddFileType.add("item", "BMP");
    dlgMain.ddFileType.add("item", "JPEG");
    dlgMain.ddFileType.add("item", "PDF");
   dlgMain.ddFileType.add("item", "PSD");
    dlgMain.ddFileType.add("item", "Targa");
    dlgMain.ddFileType.add("item", "TIFF");
    dlgMain.ddFileType.add("item", "PNG-8");
    dlgMain.ddFileType.add("item", "PNG-24");

   dlgMain.ddFileType.onChange = function() {
      hideAllFileTypePanel();
      switch(this.selection.index) {
         case bmpIndex:   
            dlgMain.pnlFileType.pnlOptions.text = strBMPOptions;
            dlgMain.pnlFileType.pnlOptions.grpBMPOptions.show();   
            break;
         case jpegIndex:   
            dlgMain.pnlFileType.pnlOptions.text = strJPEGOptions;
            dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.show();   
            break;
         case tiffIndex:   
            dlgMain.pnlFileType.pnlOptions.text = strTIFFOptions;
            dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.show();   
            break;
         case pdfIndex:   
            dlgMain.pnlFileType.pnlOptions.text = strPDFOptions;
            dlgMain.pnlFileType.pnlOptions.grpPDFOptions.show();   
            break;
         case targaIndex:
            dlgMain.pnlFileType.pnlOptions.text = strTargaOptions;
            dlgMain.pnlFileType.pnlOptions.grpTargaOptions.show();   
            break;
         case png8Index:      
            dlgMain.pnlFileType.pnlOptions.text = strPNG8Options;
            dlgMain.pnlFileType.pnlOptions.grpPNG8Options.show();   
            break;
         case png24Index:      
            dlgMain.pnlFileType.pnlOptions.text = strPNG24Options;
            dlgMain.pnlFileType.pnlOptions.grpPNG24Options.show();   
            break;
         case psdIndex:   
         default:      
            dlgMain.pnlFileType.pnlOptions.text = strPSDOptions;
            dlgMain.pnlFileType.pnlOptions.grpPSDOptions.show();   
            break;
      }
   }
      
    dlgMain.ddFileType.items[exportInfo.fileType].selected = true;

   // -- now after all the radio buttons
    dlgMain.cbIcc = dlgMain.pnlFileType.add("checkbox", undefined, strCheckboxIncludeICCProfile);
    dlgMain.cbIcc.value = exportInfo.icc;
    dlgMain.cbIcc.alignment = 'left';

   // -- now the options panel that changes
    dlgMain.pnlFileType.pnlOptions = dlgMain.pnlFileType.add("panel", undefined, "Options");
    dlgMain.pnlFileType.pnlOptions.alignment = 'fill';
    dlgMain.pnlFileType.pnlOptions.orientation = 'stack';
    dlgMain.pnlFileType.pnlOptions.preferredSize.height = StrToIntWithDefault( strpnlOptions, 100 );

   // PSD options
    dlgMain.pnlFileType.pnlOptions.grpPSDOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPSDOptions.cbMax = dlgMain.pnlFileType.pnlOptions.grpPSDOptions.add("checkbox", undefined, strCheckboxMaximizeCompatibility);
    dlgMain.pnlFileType.pnlOptions.grpPSDOptions.cbMax.value = exportInfo.psdMaxComp;
   dlgMain.pnlFileType.pnlOptions.grpPSDOptions.visible = (exportInfo.fileType == psdIndex);
   
    // PNG8 options
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Trans = dlgMain.pnlFileType.pnlOptions.grpPNG8Options.add("checkbox", undefined, strCheckboxPNGTransparency.toString());
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Inter = dlgMain.pnlFileType.pnlOptions.grpPNG8Options.add("checkbox", undefined, strCheckboxPNGInterlaced.toString());
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Trans.value = exportInfo.png8Transparency;
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Inter.value = exportInfo.png8Interlaced;
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.visible = (exportInfo.fileType == png8Index);
   
    // PNG24 options
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Trans = dlgMain.pnlFileType.pnlOptions.grpPNG24Options.add("checkbox", undefined, strCheckboxPNGTransparency.toString());
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Inter = dlgMain.pnlFileType.pnlOptions.grpPNG24Options.add("checkbox", undefined, strCheckboxPNGInterlaced.toString());
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Trans.value = exportInfo.png24Transparency;
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Inter.value = exportInfo.png24Interlaced;
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.visible = (exportInfo.fileType == png24Index);
   
   // JPEG options
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.add("statictext", undefined, strLabelQuality);
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.etQuality = dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.add("edittext", undefined, exportInfo.jpegQuality.toString());
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.etQuality.preferredSize.width = StrToIntWithDefault( stretQuality, 30 );
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.visible = (exportInfo.fileType == jpegIndex);

   // TIFF options
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.orientation = 'column';
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.visible = (exportInfo.fileType == tiffIndex);
   
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.alignment = 'left';
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.add("statictext", undefined, strLabelImageCompression);
   

    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.add("dropdownlist");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.add("item", strNone);
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.add("item", "LZW");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.add("item", "ZIP");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.add("item", "JPEG");
   
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.onChange = function() {
      if (this.selection.index == compJPEGIndex) {
         dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.stQuality.enabled = true;
         dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.enabled = true;
      } else {
         dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.stQuality.enabled = false;
         dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.enabled = false;
      }
    }

   dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.alignment = 'left';
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.stQuality = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.add("statictext", undefined, strLabelQuality);
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.add("edittext", undefined, exportInfo.tiffJpegQuality.toString());
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.preferredSize.width = StrToIntWithDefault( stretQuality, 30 );
   dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.graphics.disabledBackgroundColor = brush;

   var index;
    switch (exportInfo.tiffCompression) {
      case TIFFEncoding.NONE:     index = compNoneIndex; break;
        case TIFFEncoding.TIFFLZW:  index = compLZWIndex; break;
        case TIFFEncoding.TIFFZIP:  index = compZIPIndex; break;
        case TIFFEncoding.JPEG:     index = compJPEGIndex; break;
        default: index = compNoneIndex;    break;
    }

    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.items[index].selected = true;

   if (TIFFEncoding.JPEG != exportInfo.tiffCompression) { // if not JPEG
      dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.stQuality.enabled = false;
      dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.enabled = false;
    }
   

   // PDF options
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.orientation = 'column';
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.visible = (exportInfo.fileType == pdfIndex);

    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.alignment = 'left';
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.add("statictext", undefined, strLabelEncoding);

    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbZip = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.add("radiobutton", undefined, "ZIP");
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbZip.onClick = function() {
      dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.stQuality.enabled = false;   
      dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.enabled = false;   
   }

    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbJpeg = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.add("radiobutton", undefined, "JPEG");
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbJpeg.onClick = function() {
      dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.stQuality.enabled = true;   
      dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.enabled = true;   
   }
   
   dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.alignment = 'left';
   
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.stQuality = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.add("statictext", undefined, strLabelQuality);

    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.add("edittext", undefined, exportInfo.pdfJpegQuality.toString());
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.preferredSize.width = StrToIntWithDefault( stretQuality, 30 );
   dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.graphics.disabledBackgroundColor = brush;

    switch (exportInfo.pdfEncoding) {
        case PDFEncoding.PDFZIP:
         dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbZip.value  = true;    break;
        case PDFEncoding.JPEG:
        default:
         dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbJpeg.value = true;    break;
    }
   
    if (PDFEncoding.JPEG != exportInfo.pdfEncoding) {
        dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.stQuality.enabled = false;
        dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.enabled = false;
    }

   // Targa options
   dlgMain.pnlFileType.pnlOptions.grpTargaOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.add("statictext", undefined, strLabelDepth);
    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.visible = (exportInfo.fileType == targaIndex);

    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb16bit = dlgMain.pnlFileType.pnlOptions.grpTargaOptions.add( "radiobutton", undefined, strRadiobutton16bit);
    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb24bit = dlgMain.pnlFileType.pnlOptions.grpTargaOptions.add( "radiobutton", undefined, strRadiobutton24bit);
    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb32bit = dlgMain.pnlFileType.pnlOptions.grpTargaOptions.add( "radiobutton", undefined, strRadiobutton32bit);

    switch (exportInfo.targaDepth) {
        case TargaBitsPerPixels.SIXTEEN:     dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb16bit.value = true;   break;
        case TargaBitsPerPixels.TWENTYFOUR:  dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb24bit.value = true;   break;
        case TargaBitsPerPixels.THIRTYTWO:   dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb32bit.value = true;   break;
        default: dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb24bit.value = true;   break;
    }


   // BMP options
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions = dlgMain.pnlFileType.pnlOptions.add("group");
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.add("statictext", undefined, strLabelDepth);
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.visible = (exportInfo.fileType == bmpIndex);

    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb16bit = dlgMain.pnlFileType.pnlOptions.grpBMPOptions.add( "radiobutton", undefined, strRadiobutton16bit);
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb24bit = dlgMain.pnlFileType.pnlOptions.grpBMPOptions.add( "radiobutton", undefined, strRadiobutton24bit);
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb32bit = dlgMain.pnlFileType.pnlOptions.grpBMPOptions.add( "radiobutton", undefined, strRadiobutton32bit);

    switch (exportInfo.bmpDepth) {
        case BMPDepthType.SIXTEEN:   dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb16bit.value = true;   break;
        case BMPDepthType.TWENTYFOUR:dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb24bit.value = true;   break;
        case BMPDepthType.THIRTYTWO: dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb32bit.value = true;   break;
        default: dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb24bit.value = true;   break;
    }

   // the right side of the dialog, the ok and cancel buttons
   dlgMain.grpTopRight = dlgMain.grpTop.add("group");
   dlgMain.grpTopRight.orientation = 'column';
   dlgMain.grpTopRight.alignChildren = 'fill';
   
   dlgMain.btnRun = dlgMain.grpTopRight.add("button", undefined, strButtonRun );
    dlgMain.btnRun.onClick = function() {
      // check if the setting is properly
      var destination = dlgMain.etDestination.text;
      if (destination.length == 0) {
           alert(strAlertSpecifyDestination);
         return;
      }
      var testFolder = new Folder(destination);
      if (!testFolder.exists) {
           alert(strAlertDestinationNotExist);
         return;
      }
   
      dlgMain.close(runButtonID);
   }

   dlgMain.btnCancel = dlgMain.grpTopRight.add("button", undefined, strButtonCancel );
    dlgMain.btnCancel.onClick = function() {
      dlgMain.close(cancelButtonID);
   }

   dlgMain.defaultElement = dlgMain.btnRun;
   dlgMain.cancelElement = dlgMain.btnCancel;

      // the bottom of the dialog
   dlgMain.grpBottom = dlgMain.add("group");
   dlgMain.grpBottom.orientation = 'column';
   dlgMain.grpBottom.alignChildren = 'left';
   dlgMain.grpBottom.alignment = 'fill';
   
    dlgMain.pnlHelp = dlgMain.grpBottom.add("panel");
    dlgMain.pnlHelp.alignment = 'fill';

    dlgMain.etHelp = dlgMain.pnlHelp.add("statictext", undefined, strHelpText, {multiline:true});
    dlgMain.etHelp.alignment = 'fill';

   // do not allow anything except for numbers 0-9
   dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.addEventListener ('keydown', NumericEditKeyboardHandler);

   // do not allow anything except for numbers 0-9
   dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.addEventListener ('keydown', NumericEditKeyboardHandler);

   // do not allow anything except for numbers 0-9
   dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.etQuality.addEventListener ('keydown', NumericEditKeyboardHandler);

    dlgMain.onShow = function() {
       dlgMain.ddFileType.onChange();
    }

    // in case we double clicked the file
    app.bringToFront();

    dlgMain.center();
   
    var result = dlgMain.show();
   
    if (cancelButtonID == result) {
      return result;  // close to quit
   }
   
    // get setting from dialog
    exportInfo.destination = dlgMain.etDestination.text;
    exportInfo.fileNamePrefix = dlgMain.etFileNamePrefix.text;
    exportInfo.selectionOnly = dlgMain.cbSelection.value;
    exportInfo.sillyNumbering = dlgMain.snSelection.value;   // by l-i-n-k
    exportInfo.fileType = dlgMain.ddFileType.selection.index;
    exportInfo.icc = dlgMain.cbIcc.value;
    exportInfo.jpegQuality = dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.etQuality.text;
    exportInfo.psdMaxComp = dlgMain.pnlFileType.pnlOptions.grpPSDOptions.cbMax.value;
    index = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpCompression.ddCompression.selection.index;
    if (index == compNoneIndex) {
      exportInfo.tiffCompression = TIFFEncoding.NONE;
   }
    if (index == compLZWIndex) {
      exportInfo.tiffCompression = TIFFEncoding.TIFFLZW;
   }
    if (index == compZIPIndex) {
      exportInfo.tiffCompression = TIFFEncoding.TIFFZIP;
   }
    if (index == compJPEGIndex) {
      exportInfo.tiffCompression = TIFFEncoding.JPEG;
   }
    exportInfo.tiffJpegQuality = dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.grpQuality.etQuality.text;
    if (dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbZip.value) {
      exportInfo.pdfEncoding = PDFEncoding.PDFZIP;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpCompression.rbJpeg.value) {
      exportInfo.pdfEncoding = PDFEncoding.JPEG;
   }
    exportInfo.pdfJpegQuality = dlgMain.pnlFileType.pnlOptions.grpPDFOptions.grpQuality.etQuality.text;
    if (dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb16bit.value) {
      exportInfo.targaDepth = TargaBitsPerPixels.SIXTEEN;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb24bit.value) {
      exportInfo.targaDepth = TargaBitsPerPixels.TWENTYFOUR;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpTargaOptions.rb32bit.value) {
      exportInfo.targaDepth = TargaBitsPerPixels.THIRTYTWO;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb16bit.value) {
      exportInfo.bmpDepth = BMPDepthType.SIXTEEN;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb24bit.value) {
      exportInfo.bmpDepth = BMPDepthType.TWENTYFOUR;
   }
    if (dlgMain.pnlFileType.pnlOptions.grpBMPOptions.rb32bit.value) {
      exportInfo.bmpDepth = BMPDepthType.THIRTYTWO;
   }

    return result;
}


///////////////////////////////////////////////////////////////////////////////
// Function: hideAllFileTypePanel
// Usage: hide all the panels in the common actions
// Input: <none>, dlgMain is a global for this script
// Return: <none>, all panels are now hidden
///////////////////////////////////////////////////////////////////////////////
function hideAllFileTypePanel() {
    dlgMain.pnlFileType.pnlOptions.grpPSDOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpJPEGOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpTIFFOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpPDFOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpTargaOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpBMPOptions.hide();
    dlgMain.pnlFileType.pnlOptions.grpPNG8Options.hide();
    dlgMain.pnlFileType.pnlOptions.grpPNG24Options.hide();
}


///////////////////////////////////////////////////////////////////////////////
// Function: initExportInfo
// Usage: create our default parameters
// Input: a new Object
// Return: a new object with params set to default
///////////////////////////////////////////////////////////////////////////////
function initExportInfo(exportInfo)
{
    exportInfo.destination = new String("");
    exportInfo.fileNamePrefix = new String("untitled_");
    exportInfo.selectionOnly = false;
    exportInfo.sillyNumbering = true;   // by l-i-n-k
    exportInfo.fileType = psdIndex;
    exportInfo.icc = true;
    exportInfo.jpegQuality = 8;
    exportInfo.psdMaxComp = true;
    exportInfo.tiffCompression = TIFFEncoding.NONE;
    exportInfo.tiffJpegQuality = 8;
    exportInfo.pdfEncoding = PDFEncoding.JPEG;
    exportInfo.pdfJpegQuality = 8;
    exportInfo.targaDepth = TargaBitsPerPixels.TWENTYFOUR;
    exportInfo.bmpDepth = BMPDepthType.TWENTYFOUR;
    exportInfo.png24Transparency = true;
    exportInfo.png24Interlaced = false;
    exportInfo.png8Transparency = true;
    exportInfo.png8Interlaced = false;

    try {
        exportInfo.destination = Folder(app.activeDocument.fullName.parent).fsName; // destination folder
        var tmp = app.activeDocument.fullName.name;
        exportInfo.fileNamePrefix = decodeURI(tmp.substring(0, tmp.indexOf("."))); // filename body part
    } catch(someError) {
        exportInfo.destination = new String("");
        exportInfo.fileNamePrefix = app.activeDocument.name; // filename body part
    }
}


///////////////////////////////////////////////////////////////////////////////
// Function: saveFile
// Usage: the worker routine, take our params and save the file accordingly
// Input: reference to the document, the name of the output file,
//        export info object containing more information
// Return: <none>, a file on disk
///////////////////////////////////////////////////////////////////////////////
function saveFile( docRef, fileNameBody, exportInfo)
{
   if ( true /* folderExists(exportInfo.destination)*/) {
      switch (exportInfo.fileType) {
         case jpegIndex:
            docRef.bitsPerChannel = BitsPerChannelType.EIGHT;
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".jpg");
            jpgSaveOptions = new JPEGSaveOptions();
            jpgSaveOptions.embedColorProfile = exportInfo.icc;
            jpgSaveOptions.quality = exportInfo.jpegQuality;
            docRef.saveAs(saveFile, jpgSaveOptions, true, Extension.LOWERCASE);
            break;
         case psdIndex:
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".psd");
            psdSaveOptions = new PhotoshopSaveOptions();
            psdSaveOptions.embedColorProfile = exportInfo.icc;
            docRef.saveAs(saveFile, psdSaveOptions, true, Extension.LOWERCASE);
            break;
         case tiffIndex:
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".tif");
            tiffSaveOptions = new TiffSaveOptions();
            tiffSaveOptions.embedColorProfile = exportInfo.icc;
            tiffSaveOptions.imageCompression = exportInfo.tiffCompression;
            if (TIFFEncoding.JPEG == exportInfo.tiffCompression)    tiffSaveOptions.jpegQuality = exportInfo.tiffJpegQuality;
            docRef.saveAs(saveFile, tiffSaveOptions, true, Extension.LOWERCASE);
            break;
         case pdfIndex:
            if (docRef.bitsPerChannel == BitsPerChannelType.THIRTYTWO)
               docRef.bitsPerChannel = BitsPerChannelType.SIXTEEN;
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".pdf");
            pdfSaveOptions = new PDFSaveOptions();
            pdfSaveOptions.embedColorProfile = exportInfo.icc;
            pdfSaveOptions.encoding = exportInfo.pdfEncoding;
            if (PDFEncoding.JPEG == exportInfo.pdfEncoding) pdfSaveOptions.jpegQuality = exportInfo.pdfJpegQuality;
            docRef.saveAs(saveFile, pdfSaveOptions, true, Extension.LOWERCASE);
            break;
         case targaIndex:
            docRef.bitsPerChannel = BitsPerChannelType.EIGHT;
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".tga");
            targaSaveOptions = new TargaSaveOptions();
            targaSaveOptions.resolution = exportInfo.targaDepth;
            docRef.saveAs(saveFile, targaSaveOptions, true, Extension.LOWERCASE);
            break;
         case bmpIndex:
            docRef.bitsPerChannel = BitsPerChannelType.EIGHT;
            var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".bmp");
            bmpSaveOptions = new BMPSaveOptions();
            bmpSaveOptions.depth = exportInfo.bmpDepth;
            docRef.saveAs(saveFile, bmpSaveOptions, true, Extension.LOWERCASE);
            break;
        case png8Index:
         saveFile(docRef, fileNameBody, exportInfo, dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Inter.value, dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Trans.value);
           function saveFile( docRef, fileNameBody, exportInfo, interlacedValue, transparencyValue) {
            var id5 = charIDToTypeID( "Expr" );
               var desc3 = new ActionDescriptor();
               var id6 = charIDToTypeID( "Usng" );
                  var desc4 = new ActionDescriptor();
                  var id7 = charIDToTypeID( "Op  " );
                  var id8 = charIDToTypeID( "SWOp" );
                  var id9 = charIDToTypeID( "OpSa" );
                  desc4.putEnumerated( id7, id8, id9 );
                  var id10 = charIDToTypeID( "Fmt " );
                  var id11 = charIDToTypeID( "IRFm" );
                  var id12 = charIDToTypeID( "PNG8" );
                  desc4.putEnumerated( id10, id11, id12 );
                  var id13 = charIDToTypeID( "Intr" ); //Interlaced
                  desc4.putBoolean( id13, interlacedValue );
                  var id14 = charIDToTypeID( "RedA" );
                  var id15 = charIDToTypeID( "IRRd" );
                  var id16 = charIDToTypeID( "Prcp" ); //Algorithm
                  desc4.putEnumerated( id14, id15, id16 );
                  var id17 = charIDToTypeID( "RChT" );
                  desc4.putBoolean( id17, false );
                  var id18 = charIDToTypeID( "RChV" );
                  desc4.putBoolean( id18, false );
                  var id19 = charIDToTypeID( "AuRd" );
                  desc4.putBoolean( id19, false );
                  var id20 = charIDToTypeID( "NCol" ); //NO. Of Colors
                  desc4.putInteger( id20, 256 );
                  var id21 = charIDToTypeID( "Dthr" ); //Dither
                  var id22 = charIDToTypeID( "IRDt" );
                  var id23 = charIDToTypeID( "Dfsn" ); //Dither type
                  desc4.putEnumerated( id21, id22, id23 );
                  var id24 = charIDToTypeID( "DthA" );
                  desc4.putInteger( id24, 100 );
                  var id25 = charIDToTypeID( "DChS" );
                  desc4.putInteger( id25, 0 );
                  var id26 = charIDToTypeID( "DCUI" );
                  desc4.putInteger( id26, 0 );
                  var id27 = charIDToTypeID( "DChT" );
                  desc4.putBoolean( id27, false );
                  var id28 = charIDToTypeID( "DChV" );
                  desc4.putBoolean( id28, false );
                  var id29 = charIDToTypeID( "WebS" );
                  desc4.putInteger( id29, 0 );
                  var id30 = charIDToTypeID( "TDth" ); //transparency dither
                  var id31 = charIDToTypeID( "IRDt" );
                  var id32 = charIDToTypeID( "None" );
                  desc4.putEnumerated( id30, id31, id32 );
                  var id33 = charIDToTypeID( "TDtA" );
                  desc4.putInteger( id33, 100 );
                  var id34 = charIDToTypeID( "Trns" ); //Transparency
                  desc4.putBoolean( id34, transparencyValue );
                  var id35 = charIDToTypeID( "Mtt " );
                  desc4.putBoolean( id35, true );       //matte
                  var id36 = charIDToTypeID( "MttR" ); //matte color
                  desc4.putInteger( id36, 255 );
                  var id37 = charIDToTypeID( "MttG" );
                  desc4.putInteger( id37, 255 );
                  var id38 = charIDToTypeID( "MttB" );
                  desc4.putInteger( id38, 255 );
                  var id39 = charIDToTypeID( "SHTM" );
                  desc4.putBoolean( id39, false );
                  var id40 = charIDToTypeID( "SImg" );
                  desc4.putBoolean( id40, true );
                  var id41 = charIDToTypeID( "SSSO" );
                  desc4.putBoolean( id41, false );
                  var id42 = charIDToTypeID( "SSLt" );
                     var list1 = new ActionList();
                  desc4.putList( id42, list1 );
                  var id43 = charIDToTypeID( "DIDr" );
                  desc4.putBoolean( id43, false );
                  var id44 = charIDToTypeID( "In  " );
                  desc4.putPath( id44, new File( exportInfo.destination + "/" + fileNameBody + ".png") );
               var id45 = stringIDToTypeID( "SaveForWeb" );
               desc3.putObject( id6, id45, desc4 );
            executeAction( id5, desc3, DialogModes.NO );
         }
            break;
        case png24Index:
           saveFile(docRef, fileNameBody, exportInfo, dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Inter.value, dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Trans.value);
           function saveFile( docRef, fileNameBody, exportInfo, interlacedValue, transparencyValue) {
         var id6 = charIDToTypeID( "Expr" );
            var desc3 = new ActionDescriptor();
            var id7 = charIDToTypeID( "Usng" );
               var desc4 = new ActionDescriptor();
               var id8 = charIDToTypeID( "Op  " );
               var id9 = charIDToTypeID( "SWOp" );
               var id10 = charIDToTypeID( "OpSa" );
                 desc4.putEnumerated( id8, id9, id10 );
               var id11 = charIDToTypeID( "Fmt " );
               var id12 = charIDToTypeID( "IRFm" );
               var id13 = charIDToTypeID( "PN24" );
               desc4.putEnumerated( id11, id12, id13 );
               var id14 = charIDToTypeID( "Intr" );
               desc4.putBoolean( id14, interlacedValue );
               var id15 = charIDToTypeID( "Trns" );
               desc4.putBoolean( id15, transparencyValue );
               var id16 = charIDToTypeID( "Mtt " );
               desc4.putBoolean( id16, true );
               var id17 = charIDToTypeID( "MttR" );
               desc4.putInteger( id17, 255 );
               var id18 = charIDToTypeID( "MttG" );
               desc4.putInteger( id18, 255 );
               var id19 = charIDToTypeID( "MttB" );
               desc4.putInteger( id19, 255 );
               var id20 = charIDToTypeID( "SHTM" );
               desc4.putBoolean( id20, false );
               var id21 = charIDToTypeID( "SImg" );
               desc4.putBoolean( id21, true );
               var id22 = charIDToTypeID( "SSSO" );
               desc4.putBoolean( id22, false );
               var id23 = charIDToTypeID( "SSLt" );
                  var list1 = new ActionList();
               desc4.putList( id23, list1 );
               var id24 = charIDToTypeID( "DIDr" );
               desc4.putBoolean( id24, false );
               var id25 = charIDToTypeID( "In  " );
               desc4.putPath( id25, new File( exportInfo.destination + "/" + fileNameBody + ".png") );
            var id26 = stringIDToTypeID( "SaveForWeb" );
            desc3.putObject( id7, id26, desc4 );
         executeAction( id6, desc3, DialogModes.NO );
         }
       
            break;
         default:
            if ( DialogModes.NO != app.playbackDisplayDialogs ) {
               alert(strUnexpectedError);
            }
            break;
      }
   }
}


///////////////////////////////////////////////////////////////////////////////
// Function: zeroSuppress
// Usage: return a string padded to digit(s)
// Input: num to convert, digit count needed
// Return: string padded to digit length
///////////////////////////////////////////////////////////////////////////////
function zeroSuppress (num, digit)
{
    var tmp = num.toString();
    while (tmp.length < digit) {
      tmp = "0" + tmp;
   }
    return tmp;
}


///////////////////////////////////////////////////////////////////////////////
// Function: objectToDescriptor
// Usage: create an ActionDescriptor from a JavaScript Object
// Input: JavaScript Object (o)
//        object unique string (s)
//        Pre process converter (f)
// Return: ActionDescriptor
// NOTE: Only boolean, string, number and UnitValue are supported, use a pre processor
//       to convert (f) other types to one of these forms.
// REUSE: This routine is used in other scripts. Please update those if you
//        modify. I am not using include or eval statements as I want these
//        scripts self contained.
///////////////////////////////////////////////////////////////////////////////
function objectToDescriptor (o, s, f) {
   if (undefined != f) {
      o = f(o);
   }
   var d = new ActionDescriptor;
   var l = o.reflect.properties.length;
   d.putString( app.charIDToTypeID( 'Msge' ), s );
   for (var i = 0; i < l; i++ ) {
      var k = o.reflect.properties.toString();
      if (k == "__proto__" || k == "__count__" || k == "__class__" || k == "reflect")
         continue;
      var v = o[ k ];
      k = app.stringIDToTypeID(k);
      switch ( typeof(v) ) {
         case "boolean":
            d.putBoolean(k, v);
            break;
         case "string":
            d.putString(k, v);
            break;
         case "number":
            d.putDouble(k, v);
            break;
         default:
         {
            if ( v instanceof UnitValue ) {
               var uc = new Object;
               uc["px"] = charIDToTypeID("#Rlt"); // unitDistance
               uc["%"] = charIDToTypeID("#Prc"); // unitPercent
               d.putUnitDouble(k, uc[v.type], v.value);
            } else {
               throw( new Error("Unsupported type in objectToDescriptor " + typeof(v) ) );
            }
         }
      }
   }
    return d;
}


///////////////////////////////////////////////////////////////////////////////
// Function: descriptorToObject
// Usage: update a JavaScript Object from an ActionDescriptor
// Input: JavaScript Object (o), current object to update (output)
//        Photoshop ActionDescriptor (d), descriptor to pull new params for object from
//        object unique string (s)
//        JavaScript Function (f), post process converter utility to convert
// Return: Nothing, update is applied to passed in JavaScript Object (o)
// NOTE: Only boolean, string, number and UnitValue are supported, use a post processor
//       to convert (f) other types to one of these forms.
// REUSE: This routine is used in other scripts. Please update those if you
//        modify. I am not using include or eval statements as I want these
//        scripts self contained.
///////////////////////////////////////////////////////////////////////////////
function descriptorToObject (o, d, s, f) {
   var l = d.count;
   if (l) {
       var keyMessage = app.charIDToTypeID( 'Msge' );
        if ( d.hasKey(keyMessage) && ( s != d.getString(keyMessage) )) return;
   }
   for (var i = 0; i < l; i++ ) {
      var k = d.getKey(i); // i + 1 ?
      var t = d.getType(k);
      strk = app.typeIDToStringID(k);
      switch (t) {
         case DescValueType.BOOLEANTYPE:
            o[strk] = d.getBoolean(k);
            break;
         case DescValueType.STRINGTYPE:
            o[strk] = d.getString(k);
            break;
         case DescValueType.DOUBLETYPE:
            o[strk] = d.getDouble(k);
            break;
         case DescValueType.UNITDOUBLE:
            {
            var uc = new Object;
            uc[charIDToTypeID("#Rlt")] = "px"; // unitDistance
            uc[charIDToTypeID("#Prc")] = "%"; // unitPercent
            uc[charIDToTypeID("#Pxl")] = "px"; // unitPixels
            var ut = d.getUnitDoubleType(k);
            var uv = d.getUnitDoubleValue(k);
            o[strk] = new UnitValue( uv, uc[ut] );
            }
            break;
         case DescValueType.INTEGERTYPE:
         case DescValueType.ALIASTYPE:
         case DescValueType.CLASSTYPE:
         case DescValueType.ENUMERATEDTYPE:
         case DescValueType.LISTTYPE:
         case DescValueType.OBJECTTYPE:
         case DescValueType.RAWTYPE:
         case DescValueType.REFERENCETYPE:
         default:
            throw( new Error("Unsupported type in descriptorToObject " + t ) );
      }
   }
   if (undefined != f) {
      o = f(o);
   }
}


///////////////////////////////////////////////////////////////////////////////
// Function: preProcessExportInfo
// Usage: convert Photoshop enums to strings for storage
// Input: JavaScript Object of my params for this script
// Return: JavaScript Object with objects converted for storage
///////////////////////////////////////////////////////////////////////////////
function preProcessExportInfo(o) {
   o.tiffCompression = o.tiffCompression.toString();
   o.pdfEncoding = o.pdfEncoding.toString();
   o.targaDepth = o.targaDepth.toString();
   o.bmpDepth = o.bmpDepth.toString();
   return o;
}

///////////////////////////////////////////////////////////////////////////////
// Function: postProcessExportInfo
// Usage: convert strings from storage to Photoshop enums
// Input: JavaScript Object of my params in string form
// Return: JavaScript Object with objects in enum form
///////////////////////////////////////////////////////////////////////////////
function postProcessExportInfo(o) {
   o.tiffCompression = eval(o.tiffCompression);
   o.pdfEncoding = eval(o.pdfEncoding);
   o.targaDepth = eval(o.targaDepth);
   o.bmpDepth = eval(o.bmpDepth);
   return o;
}

///////////////////////////////////////////////////////////////////////////
// Function: StrToIntWithDefault
// Usage: convert a string to a number, first stripping all characters
// Input: string and a default number
// Return: a number
///////////////////////////////////////////////////////////////////////////
function StrToIntWithDefault( s, n ) {
    var onlyNumbers = /[^0-9]/g;
    var t = s.replace( onlyNumbers, "" );
   t = parseInt( t );
   if ( ! isNaN( t ) ) {
        n = t;
    }
    return n;
}
///////////////////////////////////////////////////////////////////////////////
// Function: deleteHiddenLayers
// Usage: Deletes hidden layers before saving
///////////////////////////////////////////////////////////////////////////////
function deleteHiddenLayers(){
   var desc = new ActionDescriptor();
   var ref = new ActionReference();
   ref.putEnumerated( charIDToTypeID( "Lyr " ), charIDToTypeID( "Ordn" ), stringIDToTypeID( "hidden" ) );
   desc.putReference( charIDToTypeID( "null" ), ref );
   executeAction( charIDToTypeID( "Dlt " ), desc, DialogModes.NO );
}

///////////////////////////////////////////////////////////////////////////////
// Function: folderExists
// Usage: see if the string passed in is a valid folder ask to create if not
// Input: string of the folder in question
// Return: true if folder exists or was created successfully
///////////////////////////////////////////////////////////////////////////////
function folderExists( folderAsString ) {
   var f = Folder(folderAsString);
   if (f.exists) return true;
   if (DialogModes.NO == app.playbackDisplayDialogs) return false;
   if (confirm(strCreateFolder + folderAsString)) {
      if (f.create()) {
         return true;
      } else {
         alert(strCouldNotCreate);
      }
   }
   return false;
}

///////////////////////////////////////////////////////////////////////////////
// Function: NumericEditKeyboardHandler
// Usage: Do not allow anything except for numbers 0-9
// Input: ScriptUI keydown event
// Return: <nothing> key is rejected and beep is sounded if invalid
///////////////////////////////////////////////////////////////////////////////
function NumericEditKeyboardHandler (event) {
    try {
        var keyIsOK = KeyIsNumeric (event) ||
                    KeyIsDelete (event) ||
                 KeyIsLRArrow (event) ||
                 KeyIsTabEnterEscape (event);
                
        if (! keyIsOK) {
            //    Bad input: tell ScriptUI not to accept the keydown event
            event.preventDefault();
            /*    Notify user of invalid input: make sure NOT
                to put up an alert dialog or do anything which
                requires user interaction, because that
                interferes with preventing the 'default'
                action for the keydown event */
            app.beep();
        }
    }
    catch (e) {
        ; // alert ("Ack! bug in NumericEditKeyboardHandler: " + e);
    }
}


//    key identifier functions
function KeyHasModifier (event) {
    return event.shiftKey || event.ctrlKey || event.altKey || event.metaKey;
}

function KeyIsNumeric (event) {
    return  (event.keyName >= '0') && (event.keyName <= '9') && ! KeyHasModifier (event);
}

function KeyIsDelete (event) {
    //    Shift-delete is ok
    return ((event.keyName == 'Backspace') || (event.keyName == 'Delete')) && ! (event.ctrlKey);
}

function KeyIsLRArrow (event) {
    return ((event.keyName == 'Left') || (event.keyName == 'Right')) && ! (event.altKey || event.metaKey);
}

function KeyIsTabEnterEscape (event) {
   return event.keyName == 'Tab' || event.keyName == 'Enter' || event.keyName == 'Escape';
}

// End Layer Comps To Files.jsx


UPDATE: Now it's working perfectly! So for some reason there is an intermittent issue that causes the dialog box not to open and the script to fail. I wonder if it's a system thing rather than the script? Installed the script on my colleague's computer and it runs flawlessly. Perhaps it will settle down for me now I am not playing with it any more.

Thanks,

Paul
Mike Hale

Layer Comps to Files + Delete hidden layers

Post by Mike Hale »

Maybe this will help with function placement...
Code: Select allfunction myFunction(){// placement doesn't matter
    //do something
    // optional return
}Code: Select allvar myArray = [];// needs to be before the function call
myFuntion();// needs to be after myArray is declared and set
function myFunction(){// placement doesn't matter
    //do something
    myArray.push(something);
    // remaining code if needed
}Code: Select allvar myFunction = function(){// needs to be before the function call
   // and the call needs to be after the variable declaration if used
}
var myArray = [];
myFunction();// still needs to be after the variable is set
That is way some recommend that you define all your variables at the top of the script and define your functions before you call them no matter how they are declared.

The Action Manager function I posted is just a cleaned up version of the scriptlistner log wrapped in a function. It really doesn't need to be cleaned up to work, I just like it that way. X has a script in his xtools that will do most of the work for you. It gets the last entry in the log and wraps it in a window so you you have to do to use it is copy/paste. Giving the created function a meaningful name and cleaning up is optional.

That error is from the Photoshop/ScriptUI interaction and it's not related to what the script itself is doing(other than it has a dialog). Happens to me sometimes. Shutting down Photoshop and ESTK(if running) sometimes help. Restarting the system always does for me but if it doesn't it most likely a corrupted installation.
Limey

Layer Comps to Files + Delete hidden layers

Post by Limey »

Thanks Mike! That's a big help. Thanks for the clear explanation of function placement.
I have a few scripts that have trouble running on occasion and I find restarting Photoshop clears it up. For some reason this one was being extra difficult.

I will look for X's script that you spoke of and see what I can do with it. I think learning how things work, understanding the principles and keeping the code clean like you do ultimately will help me to make better scripts later.

Much gratitude,

Paul