Fireworks does not export layers to files

I'm trying to do a very simple task in Fireworks and for some reason it will not work. I have a document with one Page and one State and 30 Layers. All I need to to do is export each Layer to a File. According to Adobe's own documentation all I should need to do is select Export > Layers to Files. However, no matter how many times I try this all it does is export the first layer. This is one of the most simple task imaginable and yet it doesn't work, which I find unacceptable for a piece of software that costs as much as Fireworks does. Has anyone else had this problem? Is there some secrect undocumented trick I'm not aware of?
Any help would be appreciated. My company is ready to purchase 50 copies of Fireworks for our UX team, but if this is how the app behaves I'm going to recommend going with another program that works as advertised.

I have multiple layers. I made the mistake you're referring to when I first started using Fireworks so that was the first thing I checked. I noticed some other things in FW acting wonky, so I installed the latest update and rebooted my machine and everything seems to be working fine now. Thanks for the quick reply.

Similar Messages

  • Exported my video from Elements 12 but Powerpoint does not recognise the video file. How can we do it?

    Exported my video from Elements 12 - format mp4 but Powerpoint does NOT recognise the video file. Why?

    .wpl appears to be a Windows Media Player playlist. I can find no conversion software for that, and Windows Media Player is not available for Mac anymore.
    If you can persuade him to download iTunes and create the playlist as mp3 in a iTunes playlist, or even just burn the base mp3 files to CD as a data disc, that's about the only solutions I can suggest.

  • Adobe story does not export lines of dialogue that are amrked with (CONT'D) into a csv file.

    For some reason Adobe story does not export lines of dialogue that are marked with (CONT’D) into a csv file. The rest of the dialogue exports fine, bit the bits that are marked with (CONT’D) do not show up in the dialogue column !. Can this be changed with some settings or is this a bug? The script was imported from an FDX file. If anyone has a fix for this, please, let me know.
    Thenk you.

    Thanks for reporting this issue.
    This is indeed a bug.
    Just to get correct data in csv, a workaround for this issue could be to replace word 'CONT'D' with a place-holder word, perform an export-to-csv and then change it back.
    1. Press Ctrl+F in script to open Find/Replace
    2. Replace word 'CONT'D' with a placeholder word, say 'TEMPCONTD'
    3. Export the script to csv
    4. Now replace the placeholder word with 'CONT'D'

  • How batch export layers to files png in cc

    I am having trouble with an export layers to files script i am wanting to batch export layer to png and this script i have seems to be the one i want although every time i run the script i get this error message "could not complete the action  since the destination folder doesn't exist" the script required me to hard code my destination path the path i require is "C:/Users/Tim/Desktop/Backdrops/png/" I am not completely sure why its stating it does not exist any help would be greatly appreciated. i have tried to contact the creator but the post it was on was very old.
    // enable double clicking from the Macintosh Finder or the Windows Explorer
    #target photoshop
    //=================================================================
    // Globals
    //=================================================================
    var exportPath = "/Users/pedr/Documents/Work/Clients/Pathways/Learning_Hub/Source/Comics/export";
    exportPath = exportPath + '/layers';
    // UI strings to be localized
    var strTitle = localize("$$$/JavaScripts/X2L/Title=X2L");
    var strButtonRun = localize("$$$/JavaScripts/X2L/Run=Run");
    var strButtonCancel = localize("$$$/JavaScripts/X2L/Cancel=Cancel");
    var strHelpText = localize("$$$/JavaScripts/X2L/Help=Please specify the format and location for saving each layer as a file.");
    var strLabelDestination = localize("$$$/JavaScripts/X2L/Destination=Destination:");
    var strButtonBrowse = localize("$$$/JavaScripts/X2L/Browse=&Browse...");
    var strLabelFileNamePrefix = localize("$$$/JavaScripts/X2L/FileNamePrefix=File Name Prefix:");
    var strCheckboxVisibleOnly = localize("$$$/JavaScripts/X2L/VisibleOnly=&Visible Layers Only");
    var strLabelFileType = localize("$$$/JavaScripts/X2L/FileType=File Type:");
    var strCheckboxIncludeICCProfile = localize("$$$/JavaScripts/X2L/IncludeICC=&Include ICC Profile");
    var strJPEGOptions = localize("$$$/JavaScripts/X2L/JPEGOptions=JPEG Options:");
    var strLabelQuality = localize("$$$/JavaScripts/X2L/Quality=Quality:");
    var strCheckboxMaximizeCompatibility = localize("$$$/JavaScripts/X2L/Maximize=&Maximize Compatibility");
    var strTIFFOptions = localize("$$$/JavaScripts/X2L/TIFFOptions=TIFF Options:");
    var strLabelImageCompression = localize("$$$/JavaScripts/X2L/ImageCompression=Image Compression:");
    var strNone = localize("$$$/JavaScripts/X2L/None=None");
    var strPDFOptions = localize("$$$/JavaScripts/X2L/PDFOptions=PDF Options:");
    var strLabelEncoding = localize("$$$/JavaScripts/X2L/Encoding=Encoding:");
    var strTargaOptions = localize("$$$/JavaScripts/X2L/TargaOptions=Targa Options:");
    var strLabelDepth = localize("$$$/JavaScripts/X2L/Depth=Depth:");
    var strRadiobutton16bit = localize("$$$/JavaScripts/X2L/Bit16=16bit");
    var strRadiobutton24bit = localize("$$$/JavaScripts/X2L/Bit24=24bit");
    var strRadiobutton32bit = localize("$$$/JavaScripts/X2L/Bit32=32bit");
    var strBMPOptions = localize("$$$/JavaScripts/X2L/BMPOptions=BMP Options:");
    var strAlertSpecifyDestination = localize("$$$/JavaScripts/X2L/SpecifyDestination=Please specify destination.");
    var strAlertDestinationNotExist = localize("$$$/JavaScripts/X2L/DestionationDoesNotExist=Destination does not exist.");
    var strTitleSelectDestination = localize("$$$/JavaScripts/X2L/SelectDestination=Select Destination");
    var strAlertDocumentMustBeOpened = localize("$$$/JavaScripts/X2L/OneDocument=You must have a document open to export!");
    var strAlertNeedMultipleLayers = localize("$$$/JavaScripts/X2L/NoLayers=You need a document with multiple layers to export!");
    var strAlertWasSuccessful = localize("$$$/JavaScripts/X2L/Success= was successful.");
    var strUnexpectedError = localize("$$$/JavaScripts/X2L/Unexpected=Unexpected error");
    var strMessage = localize("$$$/JavaScripts/X2L/Message=X2L");
    var stretQuality = localize( "$$$/locale_specific/JavaScripts/X2L/ETQualityLength=30" );
    var stretDestination = localize( "$$$/locale_specific/JavaScripts/X2L/ETDestinationLength=160" );
    var strddFileType = localize( "$$$/locale_specific/JavaScripts/X2L/DDFileType=100" );
    var strpnlOptions = localize( "$$$/locale_specific/JavaScripts/X2L/PNLOptions=100" );
    var strPNG8Options = localize("$$$/JavaScripts/X2L/PNG8Options=PNG-8 Options:");
    var strCheckboxPNGTransparency = localize("$$$/JavaScripts/X2L/Transparency=Transparency");
    var strCheckboxPNGInterlaced = localize("$$$/JavaScripts/X2L/Interlaced=Interlaced");
    var strCheckboxPNGTrm = localize("$$$/JavaScripts/X2L/Trim=Trim Layers");
    var strPNG24Options = localize("$$$/JavaScripts/X2L/PNG24Options=PNG-24 Options:");
    // the drop down list indexes for file type
    var png24Index = 7;
    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 {
        catch(e) {
            // it's ok if we don't have any options, continue with defaults
        try {
            var docName = app.activeDocument.name;  // save the app.activeDocument name before duplicate.
            var layerCount = app.documents[docName].layers.length;
            var layerSetsCount = app.documents[docName].layerSets.length;
            if ((layerCount <= 1)&&(layerSetsCount <= 0)) {
                if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                    alert( strAlertNeedMultipleLayers );
                return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
            } else {
                var rememberMaximize;
                var needMaximize = exportInfo.psdMaxComp ? QueryStateType.ALWAYS : QueryStateType.NEVER;
                app.activeDocument = app.documents[docName];
                var duppedDocument = app.activeDocument.duplicate();
                duppedDocument.activeLayer = duppedDocument.layers[duppedDocument.layers.length-1]; // for removing
                setInvisibleAllArtLayers(duppedDocument);
                exportChildren(duppedDocument, app.documents[docName], exportInfo, duppedDocument, exportInfo.fileNamePrefix);
                duppedDocument.close( SaveOptions.DONOTSAVECHANGES );
                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) {
      return;
    // 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() {
    // 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(exportPath);
        exportInfo.fileNamePrefix = new String("untitled_");
        exportInfo.visibleOnly = false;
        exportInfo.fileType = png24Index;
        exportInfo.icc = true;
        exportInfo.png24Transparency = true;
        exportInfo.png24Interlaced = false;
        exportInfo.png24Trim = true;
        try {
            exportInfo.destination = Folder(new String(exportPath)).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(exportPath);
            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) {
                saveFile(docRef, fileNameBody, exportInfo, false, true);
                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( exportPath + "C:/Users/Tim/Desktop/Backdrops/png/"  + fileNameBody + ".png") );
                    var id26 = stringIDToTypeID( "SaveForWeb" );
                    desc3.putObject( id7, id26, desc4 );
                executeAction( id6, desc3, DialogModes.NO );
    // 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: setInvisibleAllArtLayers
    // Usage: unlock and make invisible all art layers, recursively
    // Input: document or layerset
    // Return: all art layers are unlocked and invisible
    function setInvisibleAllArtLayers(obj) {
        for( var i = 0; i < obj.artLayers.length; i++) {
            obj.artLayers[i].allLocked = false;
            obj.artLayers[i].visible = false;
        for( var i = 0; i < obj.layerSets.length; i++) {
            setInvisibleAllArtLayers(obj.layerSets[i]);
    // Function: removeAllInvisibleArtLayers
    // Usage: remove all the invisible art layers, recursively
    // Input: document or layer set
    // Return: <none>, all layers that were invisible are now gone
    function removeAllInvisibleArtLayers(obj) {
        for( var i = obj.artLayers.length-1; 0 <= i; i--) {
            try {
                if(!obj.artLayers[i].visible) {
                    obj.artLayers[i].remove();
            catch (e) {
        for( var i = obj.layerSets.length-1; 0 <= i; i--) {
            removeAllInvisibleArtLayers(obj.layerSets[i]);
    // Function: removeAllEmptyLayerSets
    // Usage: find all empty layer sets and remove them, recursively
    // Input: document or layer set
    // Return: empty layer sets are now gone
    function removeAllEmptyLayerSets(obj) {
        var foundEmpty = true;
        for( var i = obj.layerSets.length-1; 0 <= i; i--) {
            if( removeAllEmptyLayerSets(obj.layerSets[i])) {
                obj.layerSets[i].remove();
            } else {
                foundEmpty = false;
        if (obj.artLayers.length > 0) {
            foundEmpty = false;
        return foundEmpty;
    // Function: zeroSuppress
    // Usage: return a string padded to digit(s)
    // Input: num to convert, digit count needed
    // Return: string padded to digit length
    function removeAllInvisible(docRef) {
        removeAllInvisibleArtLayers(docRef);
        removeAllEmptyLayerSets(docRef);
    // Function: exportChildren
    // Usage: find all the children in this document to save
    // Input: duplicate document, original document, export info,
    //        reference to document, starting file name
    // Return: <none>, documents are saved accordingly
    function exportChildren(dupObj, orgObj, exportInfo, dupDocRef, fileNamePrefix) {
        for( var i = 0; i < dupObj.artLayers.length; i++) {
            if (exportInfo.visibleOnly) { // visible layer only
                if (!orgObj.artLayers[i].visible) {
                    continue;
            dupObj.artLayers[i].visible = true;
            var layerName = dupObj.artLayers[i].name;  // store layer name before change doc
            var duppedDocumentTmp = dupDocRef.duplicate();
            if ((png24Index == exportInfo.fileType)||(png8Index == exportInfo.fileType)) { // PSD: Keep transparency
                removeAllInvisible(duppedDocumentTmp);
                //PNGFileOptions
                        if (activeDocument.activeLayer.isBackgroundLayer == false) { //is it anything but a background layer?
                            app.activeDocument.trim(TrimType.TRANSPARENT);
            } else { // just flatten
                duppedDocumentTmp.flatten();
            // Edit
            var docName = app.activeDocument.name;
            // For some reason indexOf fails if we include the '-', so we use 'copy' and decrement the index by 1.
            docName = docName.slice(0, docName.indexOf('copy')-1);
            var fileNameBody = (docName+'_'+layerName).toLowerCase();
            fileNameBody = fileNameBody.replace(/[:\/\\*\?\"\<\>\|]/g, "_");  // '/\:*?"<>|' -> '_'
            if (fileNameBody.length > 120) {
                fileNameBody = fileNameBody.substring(0,120);
            saveFile(duppedDocumentTmp, fileNameBody, exportInfo);
            duppedDocumentTmp.close(SaveOptions.DONOTSAVECHANGES);
            dupObj.artLayers[i].visible = false;
        for( var i = 0; i < dupObj.layerSets.length; i++) {
            if (exportInfo.visibleOnly) { // visible layer only
                if (!orgObj.layerSets[i].visible) {
                    continue;
            var fileNameBody = fileNamePrefix;
            fileNameBody += "_" + zeroSuppress(i, 4) + "s";
            exportChildren(dupObj.layerSets[i], orgObj.layerSets[i], exportInfo, dupDocRef, fileNameBody);  // recursive call
    // 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) {
        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[i].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;
    // End X2L.jsx

    I have put the like var exportPath = "~/Desktop/Backdrops/png/";  and have removed the exportPath = exportPath + '/layers';
    but when i run the script it still comes up with the error
    could not complete action since the destination folder does not exist
    if you are using the extendedscript toolkit would be able to run the script and see if you know were the problem is coming from i cant seem to understand why its not seeing the destination.
    thanks for all your help
    // enable double clicking from the Macintosh Finder or the Windows Explorer
    #target photoshop
    //=================================================================
    // Globals
    //=================================================================
    var exportPath = "~/Desktop/Backdrops/png/";
    // UI strings to be localized
    var strTitle = localize("$$$/JavaScripts/X2L/Title=X2L");
    var strButtonRun = localize("$$$/JavaScripts/X2L/Run=Run");
    var strButtonCancel = localize("$$$/JavaScripts/X2L/Cancel=Cancel");
    var strHelpText = localize("$$$/JavaScripts/X2L/Help=Please specify the format and location for saving each layer as a file.");
    var strLabelDestination = localize("$$$/JavaScripts/X2L/Destination=Destination:");
    var strButtonBrowse = localize("$$$/JavaScripts/X2L/Browse=&Browse...");
    var strLabelFileNamePrefix = localize("$$$/JavaScripts/X2L/FileNamePrefix=File Name Prefix:");
    var strCheckboxVisibleOnly = localize("$$$/JavaScripts/X2L/VisibleOnly=&Visible Layers Only");
    var strLabelFileType = localize("$$$/JavaScripts/X2L/FileType=File Type:");
    var strCheckboxIncludeICCProfile = localize("$$$/JavaScripts/X2L/IncludeICC=&Include ICC Profile");
    var strJPEGOptions = localize("$$$/JavaScripts/X2L/JPEGOptions=JPEG Options:");
    var strLabelQuality = localize("$$$/JavaScripts/X2L/Quality=Quality:");
    var strCheckboxMaximizeCompatibility = localize("$$$/JavaScripts/X2L/Maximize=&Maximize Compatibility");
    var strTIFFOptions = localize("$$$/JavaScripts/X2L/TIFFOptions=TIFF Options:");
    var strLabelImageCompression = localize("$$$/JavaScripts/X2L/ImageCompression=Image Compression:");
    var strNone = localize("$$$/JavaScripts/X2L/None=None");
    var strPDFOptions = localize("$$$/JavaScripts/X2L/PDFOptions=PDF Options:");
    var strLabelEncoding = localize("$$$/JavaScripts/X2L/Encoding=Encoding:");
    var strTargaOptions = localize("$$$/JavaScripts/X2L/TargaOptions=Targa Options:");
    var strLabelDepth = localize("$$$/JavaScripts/X2L/Depth=Depth:");
    var strRadiobutton16bit = localize("$$$/JavaScripts/X2L/Bit16=16bit");
    var strRadiobutton24bit = localize("$$$/JavaScripts/X2L/Bit24=24bit");
    var strRadiobutton32bit = localize("$$$/JavaScripts/X2L/Bit32=32bit");
    var strBMPOptions = localize("$$$/JavaScripts/X2L/BMPOptions=BMP Options:");
    var strAlertSpecifyDestination = localize("$$$/JavaScripts/X2L/SpecifyDestination=Please specify destination.");
    var strAlertDestinationNotExist = localize("$$$/JavaScripts/X2L/DestionationDoesNotExist=Destination does not exist.");
    var strTitleSelectDestination = localize("$$$/JavaScripts/X2L/SelectDestination=Select Destination");
    var strAlertDocumentMustBeOpened = localize("$$$/JavaScripts/X2L/OneDocument=You must have a document open to export!");
    var strAlertNeedMultipleLayers = localize("$$$/JavaScripts/X2L/NoLayers=You need a document with multiple layers to export!");
    var strAlertWasSuccessful = localize("$$$/JavaScripts/X2L/Success= was successful.");
    var strUnexpectedError = localize("$$$/JavaScripts/X2L/Unexpected=Unexpected error");
    var strMessage = localize("$$$/JavaScripts/X2L/Message=X2L");
    var stretQuality = localize( "$$$/locale_specific/JavaScripts/X2L/ETQualityLength=30" );
    var stretDestination = localize( "$$$/locale_specific/JavaScripts/X2L/ETDestinationLength=160" );
    var strddFileType = localize( "$$$/locale_specific/JavaScripts/X2L/DDFileType=100" );
    var strpnlOptions = localize( "$$$/locale_specific/JavaScripts/X2L/PNLOptions=100" );
    var strPNG8Options = localize("$$$/JavaScripts/X2L/PNG8Options=PNG-8 Options:");
    var strCheckboxPNGTransparency = localize("$$$/JavaScripts/X2L/Transparency=Transparency");
    var strCheckboxPNGInterlaced = localize("$$$/JavaScripts/X2L/Interlaced=Interlaced");
    var strCheckboxPNGTrm = localize("$$$/JavaScripts/X2L/Trim=Trim Layers");
    var strPNG24Options = localize("$$$/JavaScripts/X2L/PNG24Options=PNG-24 Options:");
    // the drop down list indexes for file type
    var png24Index = 7;
    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 {
        catch(e) {
            // it's ok if we don't have any options, continue with defaults
        try {
            var docName = app.activeDocument.name;  // save the app.activeDocument name before duplicate.
            var layerCount = app.documents[docName].layers.length;
            var layerSetsCount = app.documents[docName].layerSets.length;
            if ((layerCount <= 1)&&(layerSetsCount <= 0)) {
                if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                    alert( strAlertNeedMultipleLayers );
                return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
            } else {
                var rememberMaximize;
                var needMaximize = exportInfo.psdMaxComp ? QueryStateType.ALWAYS : QueryStateType.NEVER;
                app.activeDocument = app.documents[docName];
                var duppedDocument = app.activeDocument.duplicate();
                duppedDocument.activeLayer = duppedDocument.layers[duppedDocument.layers.length-1]; // for removing
                setInvisibleAllArtLayers(duppedDocument);
                exportChildren(duppedDocument, app.documents[docName], exportInfo, duppedDocument, exportInfo.fileNamePrefix);
                duppedDocument.close( SaveOptions.DONOTSAVECHANGES );
                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) {
      return;
    // 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() {
    // 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(exportPath);
        exportInfo.fileNamePrefix = new String("untitled_");
        exportInfo.visibleOnly = false;
        exportInfo.fileType = png24Index;
        exportInfo.icc = true;
        exportInfo.png24Transparency = true;
        exportInfo.png24Interlaced = false;
        exportInfo.png24Trim = true;
        try {
            exportInfo.destination = Folder(new String(exportPath)).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(exportPath);
            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) {
                saveFile(docRef, fileNameBody, exportInfo, false, true);
                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( exportPath + "C:/Users/Tim/Desktop/Backdrops/png/"  + fileNameBody + ".png") );
                    var id26 = stringIDToTypeID( "SaveForWeb" );
                    desc3.putObject( id7, id26, desc4 );
                executeAction( id6, desc3, DialogModes.NO );
    // 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: setInvisibleAllArtLayers
    // Usage: unlock and make invisible all art layers, recursively
    // Input: document or layerset
    // Return: all art layers are unlocked and invisible
    function setInvisibleAllArtLayers(obj) {
        for( var i = 0; i < obj.artLayers.length; i++) {
            obj.artLayers[i].allLocked = false;
            obj.artLayers[i].visible = false;
        for( var i = 0; i < obj.layerSets.length; i++) {
            setInvisibleAllArtLayers(obj.layerSets[i]);
    // Function: removeAllInvisibleArtLayers
    // Usage: remove all the invisible art layers, recursively
    // Input: document or layer set
    // Return: <none>, all layers that were invisible are now gone
    function removeAllInvisibleArtLayers(obj) {
        for( var i = obj.artLayers.length-1; 0 <= i; i--) {
            try {
                if(!obj.artLayers[i].visible) {
                    obj.artLayers[i].remove();
            catch (e) {
        for( var i = obj.layerSets.length-1; 0 <= i; i--) {
            removeAllInvisibleArtLayers(obj.layerSets[i]);
    // Function: removeAllEmptyLayerSets
    // Usage: find all empty layer sets and remove them, recursively
    // Input: document or layer set
    // Return: empty layer sets are now gone
    function removeAllEmptyLayerSets(obj) {
        var foundEmpty = true;
        for( var i = obj.layerSets.length-1; 0 <= i; i--) {
            if( removeAllEmptyLayerSets(obj.layerSets[i])) {
                obj.layerSets[i].remove();
            } else {
                foundEmpty = false;
        if (obj.artLayers.length > 0) {
            foundEmpty = false;
        return foundEmpty;
    // Function: zeroSuppress
    // Usage: return a string padded to digit(s)
    // Input: num to convert, digit count needed
    // Return: string padded to digit length
    function removeAllInvisible(docRef) {
        removeAllInvisibleArtLayers(docRef);
        removeAllEmptyLayerSets(docRef);
    // Function: exportChildren
    // Usage: find all the children in this document to save
    // Input: duplicate document, original document, export info,
    //        reference to document, starting file name
    // Return: <none>, documents are saved accordingly
    function exportChildren(dupObj, orgObj, exportInfo, dupDocRef, fileNamePrefix) {
        for( var i = 0; i < dupObj.artLayers.length; i++) {
            if (exportInfo.visibleOnly) { // visible layer only
                if (!orgObj.artLayers[i].visible) {
                    continue;
            dupObj.artLayers[i].visible = true;
            var layerName = dupObj.artLayers[i].name;  // store layer name before change doc
            var duppedDocumentTmp = dupDocRef.duplicate();
            if ((png24Index == exportInfo.fileType)||(png8Index == exportInfo.fileType)) { // PSD: Keep transparency
                removeAllInvisible(duppedDocumentTmp);
                //PNGFileOptions
                        if (activeDocument.activeLayer.isBackgroundLayer == false) { //is it anything but a background layer?
                            app.activeDocument.trim(TrimType.TRANSPARENT);
            } else { // just flatten
                duppedDocumentTmp.flatten();
            // Edit
            var docName = app.activeDocument.name;
            // For some reason indexOf fails if we include the '-', so we use 'copy' and decrement the index by 1.
            docName = docName.slice(0, docName.indexOf('copy')-1);
            var fileNameBody = (docName+'_'+layerName).toLowerCase();
            fileNameBody = fileNameBody.replace(/[:\/\\*\?\"\<\>\|]/g, "_");  // '/\:*?"<>|' -> '_'
            if (fileNameBody.length > 120) {
                fileNameBody = fileNameBody.substring(0,120);
            saveFile(duppedDocumentTmp, fileNameBody, exportInfo);
            duppedDocumentTmp.close(SaveOptions.DONOTSAVECHANGES);
            dupObj.artLayers[i].visible = false;
        for( var i = 0; i < dupObj.layerSets.length; i++) {
            if (exportInfo.visibleOnly) { // visible layer only
                if (!orgObj.layerSets[i].visible) {
                    continue;
            var fileNameBody = fileNamePrefix;
            fileNameBody += "_" + zeroSuppress(i, 4) + "s";
            exportChildren(dupObj.layerSets[i], orgObj.layerSets[i], exportInfo, dupDocRef, fileNameBody);  // recursive call
    // 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) {
        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[i].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;
    // End X2L.jsx

  • Export layers to file script error in Photoshop CC

    I need help with an issue.  I also asked this in the general forum but was refered here to ask all of you amazingly talented scripting geniuses.
    My issue is with the Export Layers script that comes installed with Photoshop.  I am running Windows 7 64bit - using photoshop version: creative cloud 64bit.
    When i try to run File>Scripts> Export Layers to files I get this error
    Error 22: Windows does not have a constructor. Line: 239 -> dlgMain = new Window ("dialog", strTitle); 
    When i load Photoshop Creative Cloud 32 bit i get a different error message when trying to run the script. 
    Error - 33: Internal error . line:395 ->  dligMain.pnlFileType.pnlOptions.grpJPGOptions = ...
    I can't run the image processor script I also get an error with that. 
    This  is an issue for me as i use this script on a daily basis.  It worked in PSCS6  
    I upgraded, i dont' want to have to load an older  version of photoshop to do this task  
    Thanks
    Carrie 

    I'm afraid no ideas...
    These kind of errors appeared to me too (Mac, CS5/CS6). If memory doesn't fail me - and there were tricks to be applied in your own scripts to workaround the problem - the issue was due to a stack of commands involving Document change (say: switch from document A to document B and then activate the layer X): what happened was that the script's call "activate the layer X" was too quick - i.e. it happened before Photoshop could actually perform the switch. As a result the "activate the Layer X" was executed on the A document instead of the B document and the whole thing broke.
    Mind you, it's just an example I've made up.
    Tab view for some reason worked as expected.
    I would suggest to try with no other documents open, resetting the preferences (launch PS pressing CRTL+ALT+SHIFT) - but this is quite generic, as a recommendation.
    Davide

  • Modding the Export Layers to Files script to preserve .jpg quality

    Please forgive me if I am posting this incorrectly, but as the thread I initially replied to is marked as Answered I started to wonder whether my question would be seen or not so I started this new thread.  My original question is located in the thread http://forums.adobe.com/message/2795719#2795719 because Kari was having a similar issue to mine, but with a different file format.  My original text:
    I am having a similar issue, except that I need to save each layer as a .jpg, and the Export Layers to Files script is compressing the images in some fashion so that a previously seamlessly tiling layer now has a border that ruins the tile.  If I save each layer individually using either the Save As command or Save for Web and Devices with the proper settings (Maximum Quality, Progressive, and Baseline Standard), the resulting images don't acquire this border, so I feel pretty certain it is something in the script that is messing up (changing the compression of) the layers, but I honestly don't know what.  I have tried modifiying the jpeg portion of the script this way, hoping to prevent it from deviating from the usual Save As options:
            case jpegIndex:
                docRef.bitsPerChannel = BitsPerChannelType.EIGHT;
                var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".jpg");
                jpgSaveOptions = new JPEGSaveOptions();
                jpgSaveOptions.embedColorProfile = true;
                jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
                jpgSaveOptions.matte = MatteType.NONE;
                jpgSaveOptions.quality = jpegQuality; // 12
                docRef.saveAs(saveFile, jpgSaveOptions, true, Extension.LOWERCASE);
                break;
    but this doesn't seem to affect whatever setting is being changed.  Layers saved to .jpg this way still acquire the border.  I don't see what line might control whether the image is saved as progressive or not, nor anything to affect the text setting "Maximum" that I use when I successfully save each layer individually.
    I am a complete novice at scripting, so please excuse/explain the obvious mistakes I may be making here.
    I have since installed the script listener plug in and isolated a bit of script for saving the intended way, and hope to insert this snippet into the Export Layers as Files script, but I can tell that some of the lines are extraneous (like where it points to the file path I took), but I don't know what is safe to trim out.  I sincerely appreciate any assistance with this!

    Here is the script that uses scriptlistner to do the jpeg save. Note I changed the name by adding '_mod' to the end to remind you that it has been edited. You can remove the origianl version by moving the file to another folder outside the scripts folder or by adding ~ at the start of the filename.
    I recommend saving this as Export Layers to Files_mod.jsx. If this doesn't work for you we can try using the scriptlistener saveForWeb.
    // Copyright 2007.  Adobe Systems, Incorporated.  All rights reserved.
    // This script will export each layer in the document to a separate file.
    // Written by Naoki Hada
    // ZStrings and auto layout by Tom Ruark
    @@@BUILDINFO@@@ Export Layers To Files.jsx 1.0.0.16
    // BEGIN__HARVEST_EXCEPTION_ZSTRING
    <javascriptresource>
    <name>Export Layers to Files_mod...</name>
    <category>layers</category>
    <enableinfo>true</enableinfo>
    <eventid>6f1c2cf5-4a97-4e32-8f59-f5d7a087adef</eventid>
    <terminology><![CDATA[<< /Version 1
                             /Events <<
                              /6f1c2cf5-4a97-4e32-8f59-f5d7a087adef [Export Layers to Files_mod /noDirectParam <<
                               /message [($$$/Actions/Key/Message=Message) /char]
                               /destination [($$$/Actions/Key/Destination=Destination) /char]
                               /fileNamePrefix [($$$/Actions/Key/FileNamePrefix=Prefix) /char]
                               /visibleOnly [($$$/Actions/Key/CompsObject/UseVisibility=Visibility) /boolean]
                               /fileType  [($$$/Actions/Key/FileType=File Type) /integer]
                               /icc [($$$/Actions/Key/PDFGenericFormat/KeepProfile=Keep Profile) /boolean]
                               /jpegQuality [($$$/Actions/Key/JPEGQuality=JPEG Quality) /char]
                               /psdMaxComp [($$$/Actions/Key/MaximizePSDCompatibility=maximize compatibility for Photoshop files) /boolean]
                               /tiffCompression [($$$/Actions/Key/TiffCompression=TIFF encoding) /char]
                               /tiffJpegQuality [($$$/Actions/Key/TIFFJPEGQuality=TIFF JPEG Quality) /char]
                               /pdfEncoding [($$$/Actions/Key/PDFEncoding=PDF encoding) /char]
                               /pdfJpegQuality [($$$/Actions/Key/PDFJPEGQuality=PDF JPEG Quality) /char]
                               /targaDepth [($$$/Actions/Key/Depth/TargaDepth=Targa depth) /char]
                               /bmpDepth [($$$/Actions/Key/Depth/BMPDepth=BMP depth) /char]
                               /png24Transparency [($$$/Actions/Key/Layer/PNG24PreserveTransparency=PNG 24 Preserve Transparency) /boolean]
                               /png24Interlaced [($$$/Actions/Key/Layer/PNG24Interlaced=PNG 24 Interlaced) /boolean]
                               /png24Trim [($$$/Image/Trim/PNG24=PNG 24 Trim) /boolean]
                               /png8Transparency [($$$/Actions/Key/Layer/PNG8PreserveTransparency=PNG 8 Preserve Transparency) /boolean]
                               /png8Interlaced [($$$/Actions/Key/Layer/PNG8Interlaced=PNG 8 Interlaced) /boolean]
                               /png8Trim [($$$/Image/Trim/PNG8=PNG 8 Trim) /boolean]
                              >>]
                             >>
                          >> ]]></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/ExportLayersToFiles/Title=Export Layers To Files");
    strTitle = "Export Layers To Files"
    var strButtonRun = localize("$$$/JavaScripts/ExportLayersToFiles/Run=Run");
    var strButtonCancel = localize("$$$/JavaScripts/ExportLayersToFiles/Cancel=Cancel");
    var strHelpText = localize("$$$/JavaScripts/ExportLayersToFiles/Help=Please specify the format and location for saving each layer as a file.");
    var strLabelDestination = localize("$$$/JavaScripts/ExportLayersToFiles/Destination=Destination:");
    var strButtonBrowse = localize("$$$/JavaScripts/ExportLayersToFiles/Browse=&Browse...");
    var strLabelFileNamePrefix = localize("$$$/JavaScripts/ExportLayersToFiles/FileNamePrefix=File Name Prefix:");
    var strCheckboxVisibleOnly = localize("$$$/JavaScripts/ExportLayersToFiles/VisibleOnly=&Visible Layers Only");
    var strLabelFileType = localize("$$$/JavaScripts/ExportLayersToFiles/FileType=File Type:");
    var strCheckboxIncludeICCProfile = localize("$$$/JavaScripts/ExportLayersToFiles/IncludeICC=&Include ICC Profile");
    var strJPEGOptions = localize("$$$/JavaScripts/ExportLayersToFiles/JPEGOptions=JPEG Options:");
    var strLabelQuality = localize("$$$/JavaScripts/ExportLayersToFiles/Quality=Quality:");
    var strPSDOptions = localize("$$$/JavaScripts/ExportLayersToFiles/PSDOptions=PSD Options:");
    var strCheckboxMaximizeCompatibility = localize("$$$/JavaScripts/ExportLayersToFiles/Maximize=&Maximize Compatibility");
    var strTIFFOptions = localize("$$$/JavaScripts/ExportLayersToFiles/TIFFOptions=TIFF Options:");
    var strLabelImageCompression = localize("$$$/JavaScripts/ExportLayersToFiles/ImageCompression=Image Compression:");
    var strNone = localize("$$$/JavaScripts/ExportLayersToFiles/None=None");
    var strPDFOptions = localize("$$$/JavaScripts/ExportLayersToFiles/PDFOptions=PDF Options:");
    var strLabelEncoding = localize("$$$/JavaScripts/ExportLayersToFiles/Encoding=Encoding:");
    var strTargaOptions = localize("$$$/JavaScripts/ExportLayersToFiles/TargaOptions=Targa Options:");
    var strLabelDepth = localize("$$$/JavaScripts/ExportLayersToFiles/Depth=Depth:");
    var strRadiobutton16bit = localize("$$$/JavaScripts/ExportLayersToFiles/Bit16=16bit");
    var strRadiobutton24bit = localize("$$$/JavaScripts/ExportLayersToFiles/Bit24=24bit");
    var strRadiobutton32bit = localize("$$$/JavaScripts/ExportLayersToFiles/Bit32=32bit");
    var strBMPOptions = localize("$$$/JavaScripts/ExportLayersToFiles/BMPOptions=BMP Options:");
    var strAlertSpecifyDestination = localize("$$$/JavaScripts/ExportLayersToFiles/SpecifyDestination=Please specify destination.");
    var strAlertDestinationNotExist = localize("$$$/JavaScripts/ExportLayersToFiles/DestionationDoesNotExist=Destination does not exist.");
    var strTitleSelectDestination = localize("$$$/JavaScripts/ExportLayersToFiles/SelectDestination=Select Destination");
    var strAlertDocumentMustBeOpened = localize("$$$/JavaScripts/ExportLayersToFiles/OneDocument=You must have a document open to export!");
    var strAlertNeedMultipleLayers = localize("$$$/JavaScripts/ExportLayersToFiles/NoLayers=You need a document with multiple layers to export!");
    var strAlertWasSuccessful = localize("$$$/JavaScripts/ExportLayersToFiles/Success= was successful.");
    var strUnexpectedError = localize("$$$/JavaScripts/ExportLayersToFiles/Unexpected=Unexpected error");
    var strMessage = localize("$$$/JavaScripts/ExportLayersToFiles/Message=Export Layers To Files action settings");
    var     stretQuality = localize( "$$$/locale_specific/JavaScripts/ExportLayersToFiles/ETQualityLength=30" );
    var     stretDestination = localize( "$$$/locale_specific/JavaScripts/ExportLayersToFiles/ETDestinationLength=160" );
    var     strddFileType = localize( "$$$/locale_specific/JavaScripts/ExportLayersToFiles/DDFileType=100" );
    var     strpnlOptions = localize( "$$$/locale_specific/JavaScripts/ExportLayersToFiles/PNLOptions=100" );
    var strPNG8Options = localize("$$$/JavaScripts/ExportLayersToFiles/PNG8Options=PNG-8 Options:");
    var strCheckboxPNGTransparency = localize("$$$/JavaScripts/ExportLayersToFiles/Transparency=Transparency");
    var strCheckboxPNGInterlaced = localize("$$$/JavaScripts/ExportLayersToFiles/Interlaced=Interlaced");
    var strCheckboxPNGTrm = localize("$$$/JavaScripts/ExportLayersToFiles/Trim=Trim Layers");
    var strPNG24Options = localize("$$$/JavaScripts/ExportLayersToFiles/PNG24Options=PNG-24 Options:");
    // 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("4d633fbb-ed90-480d-8e03-cccb16131a34");
              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 layerCount = app.documents[docName].layers.length;
            var layerSetsCount = app.documents[docName].layerSets.length;
            if ((layerCount <= 1)&&(layerSetsCount <= 0)) {
                if ( DialogModes.NO != app.playbackDisplayDialogs ) {
                    alert( strAlertNeedMultipleLayers );
                  return 'cancel'; // quit, returning 'cancel' (dont localize) makes the actions palette not record our script
            } else {
                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;
                app.activeDocument = app.documents[docName];
                var duppedDocument = app.activeDocument.duplicate();
                duppedDocument.activeLayer = duppedDocument.layers[duppedDocument.layers.length-1]; // for removing
                setInvisibleAllArtLayers(duppedDocument);
                exportChildren(duppedDocument, app.documents[docName], exportInfo, duppedDocument, exportInfo.fileNamePrefix);
                duppedDocument.close( SaveOptions.DONOTSAVECHANGES );
                   var d = objectToDescriptor(exportInfo, strMessage, preProcessExportInfo);
                app.putCustomOptions("4d633fbb-ed90-480d-8e03-cccb16131a34", 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 = dlgMain.graphics.backgroundColor;
         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.cbVisible = dlgMain.grpTopLeft.add("checkbox", undefined, strCheckboxVisibleOnly);
        dlgMain.cbVisible.value = exportInfo.visibleOnly;
         // -- 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();
            dlgMain.cbIcc.show();
              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();
                     dlgMain.cbIcc.hide();
                        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.png8Trm = dlgMain.pnlFileType.pnlOptions.grpPNG8Options.add("checkbox", undefined, strCheckboxPNGTrm.toString());
        dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Trans.value = exportInfo.png8Transparency;
        dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Inter.value = exportInfo.png8Interlaced;
        dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Trm.value = exportInfo.png8Trim;
        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.png24Trm = dlgMain.pnlFileType.pnlOptions.grpPNG24Options.add("checkbox", undefined, strCheckboxPNGTrm.toString());
        dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Trans.value = exportInfo.png24Transparency;
        dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Inter.value = exportInfo.png24Interlaced;
        dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Trm.value = exportInfo.png24Trim;
        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';
         dlgMain.onShow = function() {
              dlgMain.ddFileType.onChange();
        // give the hosting app the focus before showing the dialog
        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.visibleOnly = dlgMain.cbVisible.value;
        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.visibleOnly = false;
        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.png24Trim = true;
        exportInfo.png8Transparency = true;
        exportInfo.png8Interlaced = false;
        exportInfo.png8Trim = true;
        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) {
        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);*/
                var desc= new ActionDescriptor();
                var formatDesc = new ActionDescriptor();
                formatDesc.putInteger( charIDToTypeID( "EQlt" ), exportInfo.jpegQuality );
                formatDesc.putEnumerated( charIDToTypeID( "MttC" ), charIDToTypeID( "MttC" ), charIDToTypeID( "None" ) );
                desc.putObject( charIDToTypeID( "As  " ), charIDToTypeID( "JPEG" ), formatDesc );
                desc.putPath( charIDToTypeID( "In  " ), saveFile );
                desc.putBoolean( charIDToTypeID( "Cpy " ), true );
                executeAction( charIDToTypeID( "save" ), desc4, DialogModes.NO );
                break;
            case psdIndex:
                var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".psd");
                psdSaveOptions = new PhotoshopSaveOptions();
                psdSaveOptions.embedColorProfile = exportInfo.icc;
                psdSaveOptions.maximizeCompatibility = exportInfo.psdMaxComp;
                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 );
                //var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".png");
                //bmpSaveOptions = new BMPSaveOptions();
                //bmpSaveOptions.depth = exportInfo.bmpDepth;
                //docRef.saveAs(saveFile, bmpSaveOptions, true, Extension.LOWERCASE);
                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 );
                //var saveFile = new File(exportInfo.destination + "/" + fileNameBody + ".png");
                //bmpSaveOptions = new BMPSaveOptions();
                //bmpSaveOptions.depth = exportInfo.bmpDepth;
                //docRef.saveAs(saveFile, bmpSaveOptions, true, Extension.LOWERCASE);
                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: setInvisibleAllArtLayers
    // Usage: unlock and make invisible all art layers, recursively
    // Input: document or layerset
    // Return: all art layers are unlocked and invisible
    function setInvisibleAllArtLayers(obj) {
        for( var i = 0; i < obj.artLayers.length; i++) {
            obj.artLayers[i].allLocked = false;
            obj.artLayers[i].visible = false;
        for( var i = 0; i < obj.layerSets.length; i++) {
            setInvisibleAllArtLayers(obj.layerSets[i]);
    // Function: removeAllInvisibleArtLayers
    // Usage: remove all the invisible art layers, recursively
    // Input: document or layer set
    // Return: <none>, all layers that were invisible are now gone
    function removeAllInvisibleArtLayers(obj) {
        for( var i = obj.artLayers.length-1; 0 <= i; i--) {
            try {
                if(!obj.artLayers[i].visible) {
                        obj.artLayers[i].remove();
            catch (e) {
        for( var i = obj.layerSets.length-1; 0 <= i; i--) {
            removeAllInvisibleArtLayers(obj.layerSets[i]);
    // Function: removeAllEmptyLayerSets
    // Usage: find all empty layer sets and remove them, recursively
    // Input: document or layer set
    // Return: empty layer sets are now gone
    function removeAllEmptyLayerSets(obj) {
        var foundEmpty = true;
        for( var i = obj.layerSets.length-1; 0 <= i; i--) {
            if( removeAllEmptyLayerSets(obj.layerSets[i])) {
                obj.layerSets[i].remove();
            } else {
                foundEmpty = false;
        if (obj.artLayers.length > 0) {
              foundEmpty = false;
        return foundEmpty;
    // Function: zeroSuppress
    // Usage: return a string padded to digit(s)
    // Input: num to convert, digit count needed
    // Return: string padded to digit length
    function removeAllInvisible(docRef) {
        removeAllInvisibleArtLayers(docRef);
        removeAllEmptyLayerSets(docRef);
    // Function: exportChildren
    // Usage: find all the children in this document to save
    // Input: duplicate document, original document, export info,
    //        reference to document, starting file name
    // Return: <none>, documents are saved accordingly
    function exportChildren(dupObj, orgObj, exportInfo, dupDocRef, fileNamePrefix) {
        for( var i = 0; i < dupObj.artLayers.length; i++) {
            if (exportInfo.visibleOnly) { // visible layer only
                if (!orgObj.artLayers[i].visible) {
                        continue;
            dupObj.artLayers[i].visible = true;
            var layerName = dupObj.artLayers[i].name;  // store layer name before change doc
            var duppedDocumentTmp = dupDocRef.duplicate();
            if ((psdIndex == exportInfo.fileType)||(png24Index == exportInfo.fileType)||(png8Index == exportInfo.fileType)) { // PSD: Keep transparency
                removeAllInvisible(duppedDocumentTmp);
                //PNGFileOptions
                    if ((png24Index == exportInfo.fileType)||(png8Index == exportInfo.fileType)) { // PNGFileOptions
                        if ((dlgMain.pnlFileType.pnlOptions.grpPNG8Options.png8Trm.value == true)&&(png8Index == exportInfo.fileType)) { //transparancy checked?
                             if (activeDocument.activeLayer.isBackgroundLayer == false) { //is it anything but a background layer?
                                  app.activeDocument.trim(TrimType.TRANSPARENT);
                        if ((dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Trm.value == true)&&(png24Index == exportInfo.fileType)) { //transparancy checked?
                             if (activeDocument.activeLayer.isBackgroundLayer == false) { //is it anything but a background layer?
                                  app.activeDocument.trim(TrimType.TRANSPARENT);
            } else { // just flatten
                duppedDocumentTmp.flatten();
            var fileNameBody = fileNamePrefix;
            fileNameBody += "_" + zeroSuppress(i, 4);
            fileNameBody += "_" + la

  • Performance of Export Layers to Files

    Hi!
    I know of an Export Layers to Files script that comes with Adobe Photoshop CS4 that exports the layers of a Photoshop document as image files. It exports layer by layer with the aid of a loop. It first sets all layers as invisible, except the first layer to be exported. The process continues, by setting the layer in question as visible, keeping others invisible. It works so well for an image composed by some tens of layers, but the processing time increases greatly as the number of layers increases.
    I am developing a similar script solution, but less complex. First, the image files will be .png files. Second, much probably, the target images can have over 200 layers (the script mentioned above is taking from 7 to 18 hours to process such big images) and the processing time should not be a bottleneck.
    So, I need an idea for a solution with these features:
    Short running time, like a few seconds or minutes not hours;
    Implemented preferably within Photoshop, by scripting or something else, but avoiding the use of the SDK resources;
    Is there any Photoshop plug-in provided by a third-party or vendor?
    I am looking forward to an answer. Thanks so much in advance!

    Well if you uninstall cs2, you lose the script. Without going into detail about what I went through with the CS3 install, the obvious answer is, yes that is what I am doing. The dialogue box is jumbled, it is definitely referencing something in the current version cs4 (or cs3 for that matter). I am trying to get a solution that will go forward. The script was totally rewritten for cs3 and it does not have the intelligence of the cs2 script. (ie, using the original documents PATH and FILENAME as a default. It is utterly ridiculous. I was hoping that this could be modified at the code (script) level to give the intelligence back to the script. Any help is appreciated.
    Chris
    this new forum does not give accurate details. I have been posting since 2003.

  • Export Layers To Files - Renaming Script PS CC

    On all previous versions of Photoshop, including CS6 (before the recent update to PS CC), I was able to use the ExtendScript Toolkit to edit the PS preset script that adds naming/numbering sequences to files when running the "Export Layers to Files" script. For PS CS 6, I edited the script to remove the automatic naming/numbering of exported layers by editing the following in ExtendScript Toolkit:
    In ExtendScript Toolkit CS6 open the Export Layers to Files.jsx (applications/adobe photoshop cs6/presets/scripts/export layers to files.jsx)
    on line 1030:
    change:
    fileNameBody += "_" + zeroSuppress(i, 4);
    to:
    //fileNameBody += "_" + zeroSuppress(i, 4);
    on line 1031:
    change:
    fileNameBody += "_" + layerName;
    to:
    fileNameBody += "" + layerName;
    This solved my problem and allowed PS to export my layers to files, keeping the layer name as the filename without adding any naming or numbering sequences to the filename. However with the recent release of Photoshop CC, the script change above does not work. It looks as though there are some new lines of scripting with Photoshop CC and I would love to know what else I need to change to prevent PS CC from renaming files when using the Export Layers to File script. Without the ability to change this, I will have to go through numerous steps in bath rename in Bridge, which when working with 100's of files with different naming structures would totally slow down my workflow. Any ideas on what to update in the Photoshop CC Script to fix this? Thanks so very much!

    Welcome to the forum.
    You would maybe be better served asking in the PhotoShop Scripting Forum
    http://forums.adobe.com/community/photoshop/photoshop_scripting
    Or even here:
    http://www.ps-scripts.com/bb/index.php
    In general, I think there were changes across the board with the scripting in CC that broke things in PS, IL, ID, etc. I have seen it in both the Illustrator and InDesign scripting forums, previous scripts no longer work as before or are broken, features removed, etc. Sad but true.

  • Export layers to files - png

    When I run the Export layers to Files script to save my layers as .pngs, it automatically changes the files to 72 dpi. I need them to stay at 300 dpi, like in the original file. Can anyone help me, how do I change the script in order to do this? Thanks in advance!

    It uses a scriptlistner version of save for web for both png8 and png24. To change the png24 so it uses a normal save and retains the dpi find this line of code  "case png24Index:" It should be about line 840. Comment everything between that line and "break:", about line 890. Then add the following lines.
         pngSaveOptions = new PNGSaveOptions();
         pngSaveOptions.interlaced = dlgMain.pnlFileType.pnlOptions.grpPNG24Options.png24Inter.value;
         app.activeDocument.saveAs( new File( exportInfo.destination + "/" + fileNameBody + ".png") , pngSaveOptions, true, Extension.LOWERCASE );
    I have not tested this, you may also have to add checks for 8bit, no extra layers, no alpha or spot channels, etc. SFW does most of that by default. But by using the saveAs method and setting copy to true I think it will be ok.

  • Export Layers as Files - Please Help on Error Message

    Hi, Not sure if I'm doing the right thing anyway, but I'm trying to export all the layers in one file as separate JPGs. Each layer has its own name and ideally, i would like to save each layer as its layer name.
    When I choose the script 'export layers to files' it flashes on each layer and then eventually comes back with the error 'Specified value greater than maximum allowed value'.
    Does anyone have any idea of what this means? I have no real knowledge of scripting, it was just that this option sounded like it would do exactly what I needed!
    Thanks in advance,
    Gill

    Hi and Welcome to the Community!
    With only that limited information (e.g., no organizer app nor version, no version of the Desktop Software, etc.), all I can think to do is provide this:
    KB12268 Synchronization support for BlackBerry Desktop Software for Windows
    Good luck and let us know!
    Occam's Razor nearly always applies when troubleshooting technology issues!
    If anyone has been helpful to you, please show your appreciation by clicking the button inside of their post. Please click here and read, along with the threads to which it links, for helpful information to guide you as you proceed. I always recommend that you treat your BlackBerry like any other computing device, including using a regular backup schedule...click here for an article with instructions.
    Join our BBM Channels
    BSCF General Channel
    PIN: C0001B7B4   Display/Scan Bar Code
    Knowledge Base Updates
    PIN: C0005A9AA   Display/Scan Bar Code

  • Selected file cannot be linked because its type (video) does not match the original file's type

    I've been using Premiere Elements 9 for a couple of years now, and a few months ago I began having problems importing AVI files created from a BlackMagic Intensity Pro capture card.  (These issues were not previously occurring, and since they surfaced, I have exhausted the various settings for the BlackMagic card, used various software such as BlackMagic's own Media Express as well as the freeware VirtualDub, and still have the following problems.)
    In addition, these AVI files play just fine, in their entirety, using Windows Media Player and in Quicktime.
    The problem (or possibly two, but I suspect they could be related) is that most of the AVI files I attempt to import will either (1) import all video and NO audio, or (2) import ONLY a short segment of audio and video, and the length that Elements imports varies.  Usually only in the range of a minute or two.  The rest of the file is not imported at all.
    After much digging in forums, and testing various settings in trying to figure out the issue, I decided to back up all of my files and completely wipe all hard drives and start over with a fresh installation of Windows and Premiere Elements 9.  I haven't installed much else yet, as I wanted to first find out if the reinstallation improved things with Elements.
    For the first project I created in Elements after the reinstallation, Elements successfully imported an entire AVI that was nearly 2 hours long, audio and video.  This was a file that previously would not import properly into Elements.  This suggested that my earlier installation of Elements must have been corrupted somehow.  At this point I was very hopeful that all was well.
    I proceeded to edit the video as I had wanted, saved the project, and exported it to an MPEG format file.  I had originally wanted to export it as an MOV, but I hadn't yet installed Quicktime, so Elements couldn't do that just yet.  The MPEG export was successful and plays fine.
    However, I then installed Quicktime, and once it was finished, I restarted the PC and reloaded the same project.  This time, Elements claimed the media was offline.  I double-clicked on a segment of the video, and directed Elements to the raw file, but then an error message popped up:  "The selected file cannot be linked because its type (video) does not match the original file's type (audio and video)."  This was the same file I had JUST edited and of which I created an MPEG.
    I tried creating a new project and the "Get Media" function to import the AVI again, but this time only the video imported with NO audio.  (This would explain why the error message said what it did, but not why the audio wasn't imported.)
    What in the world is going on with Elements???  I am baffled since the ONLY task I have done on this machine after a complete reinstallation of both Windows and Elements is edit one AVI.  I find it very hard to believe that just installing Quicktime caused this.
    Some info on my system:
    System:  Asus P6T w/ Intel i7 920 and 12 GB memory
    OS: Windows 7 Ultimate
    Video Software:  Premiere Elements 9
    Capture Card:  BlackMagic Intensity Pro (PCI-e)
    Capture Software:  AVIs recorded with either BlackMagic Media Express or VirtualDub (only prior to the reinstallation, as neither of these programs are currently installed)
    I'm getting to the point with Elements that I might need to just abandon it and find something else that is more reliable.  Anybody have suggestions to help with this, so I won't have to migrate?

    mtnsports
    We think that we need to start off with definiting the properties of these .avi files that you are importing into Premiere Elements 9.0/9.0.1 (assumed that you are working for the required 9.0.1 Update).
    You say that the "avi" was created from a "BlackMagic Intensity Pro capture card". What are the properties of this .avi that you imported into Premiere Elements? Not all .avi are created equal. What is the video and audio compression, frame size, frame rate, interlaced or progressive, pixel aspect ratio, typical duration?
    Based on the properties of the video what have you been setting as the project preset?
    Let us start here.
    More later.
    ATR

  • Acrobat/Indesign does not export correct into the selected output intention (eci_iso_coated_v2_300)

    I use the CS6 suite with Acrobat XI at windows platform.
    When I want to save a file from InDesign as .pdf with output intention eci_iso_coated_v2_300 the result is a .pdf with more than 300% ink coverage.
    I tried to transform the result in Acrobat XI into this standard output intention, but also the result has more than 300 % ink coverage.
    What is the reason of this bug?
    Before with Acrobat X this worked without problems

    Hi Rob,
    I was told the new way to work would be to draw files via Bridge direct into the InDesign file
    and I thought automatically the color would not be changed.
    my colourmanagement setting in bridge for the whole CS6 was  ECI isocoated_V2_300
    The Illustrator file was saved without color profile.
    In this test file I used 3 kinds of black: background of pirate in cmyk 79,34 / 72,78 / 59,38 / 79,88 = ink coverage 291 %
    DÜSSELPIRATEN in “black” (if you would convert this in the file with the cmyk button it would be the same ink-percentage as before
    “e.V.” was set to 100 % k
    I set the preferences for Acrobat from InDesign CS6 as pdf X4 with profile eci isocoatedV2_300 in three ways:
    no color conversion
    convert to profile
    convert to profile keeping existing values
    in all tree files the pirates background has 322 % ink coverage instead of 291 %
    Why does Acrobat convert “black” in the wrong way?  If I click in Illustrator on the 4c button to convert the “black” into 4c it is 291% ink
    Acrobat should come to the same result with all profiles: iso coated V2 and iso coated V2_300
    The same happens also by saving as .pdf X3 or .X1
    The minimum what I expect is, that Acrobat reduces ink coverage for black to 300 %
    I also made test with the new ECI profiles for laminated prints from 2012.
    And with newspaper profiles
    In this case the ink coverage comes below 300 %, but only when I choose convert to profile.
    And then the 100 % k converts to cmyk, what I don’t want to have with text.
    Is there no way to reduce ink coverage below a special percentage without changing Text 100% k
    And is there a bug in Acrobat XI with the ECI IsoCoated_V2_300 Profile? For there is no color reduction below 300 % in all conversion settings.
    I can’t test this with Acrobat X or IX, for my computers with this software don’t run with CS6 64 bit.
    enclosed you find my files
    Kind regards
    Lutz Hanbueckers
    Hanbueckers Werbung GmbH
    Brandsackerstr. 5
    40764 Langenfeld
    P.O. Box 40 02 01
    40242 Düsseldorf
    Tel. +49 02173 1 09 44 - 0
    Fax +49 02173 1 09 44 - 10
    [email protected] <mailto:[email protected]>
    www.hanbueckers.de
    Visit our site
    Steady attractive offers!!!
    HR Düsseldorf B 26 480
    owner Manager: Lutz Hanbueckers
    Von: Rob Day [email protected]
    Gesendet: Samstag, 2. März 2013 04:26
    An: Hanbueckers Werbung
    Betreff: acrobat/Indesign does not export correct into the selected output intention (eci_iso_coated_v2_300)
    Re: acrobat/Indesign does not export correct into the selected output intention (eci_iso_coated_v2_300)
    created by Rob Day <http://forums.adobe.com/people/rob+day> in InDesign - View the full discussion <http://forums.adobe.com/message/5115613#5115613

  • ITunes v8.1 does not export music library in plain text w/proper CR/LFs?

    Just an FYI...I can recreate this every time. Has anyone else tried and seen the same issue with the new v8.1? I never had this issue with the previous iTunes release. Thanks!
    The new iTunes v8.1 released yesterday does not export the music library in plain text with proper CR/LFs.
    To recreate this bug:
    Select Music from your library
    Go to File -> Library -> Export Playlist...
    Save as a Music.txt and view the output file.
    You will see a continuous single line that contains correct tab separations. However, the correct end of the subject headers in addition to each song (which should be it's own line) is missing proper CR/LFs to format the file correctly.

    Seeing it with 8.1 under 10.4.11 too.
    I was really hoping that 8.1 was going to fix the problem with text export mangling accented characters, not to keep that bug and add a major new one on top of it!

  • CS5 Photoshop Scripts Error: Export Layers to Files...

    Hey Folks,
    I'm banging my head against the wall trying to figure out why I can't use the script: Export Layers to Files...
    I am recieving this error messages in my attempt:
    I have ran the Adobe updater and made sure everything is current.
    I restarted my magic toster twice after the update.
    I even tried a basic psd with 2 layers in an effort to determine if it was the working psd file itself... No luck.
    So I am convinced now that there may be a bug.
    Does anyone have any insight or workarounds for this solution?
    Thank you all in advance.
    John

    Jeffrey,
    Thanks for your response.
    It's the original script that shipped stock with CS5.
    Get this...
    I switched from 32 bit mode back into 64 and restarted the program.
    Opened my psd and tried again...
    No error this time, but this is what I get:
    Nothing!
    So racked on this one dude...

  • Is there an updated version to the Export Layers to Files Resolution fix for Photoshop CC?

    My Photoshop CS6 got blown away (another long story) along with my modified Export Layers to Files script. In this file, I had modified the lines specified in the following thread -- http://forums.adobe.com/message/2796594 -- so that the resolution of my PNG files would not be changed. I modified the Photoshop CC script with the same fix and it's not working. Any suggestions?

    http://www.creativepro.com/article/instantly-extract-images-layers-with-adobe-generator-fo r-photoshop-cc
    Maybe this will help you!!!  I was having issues with scripts in CC and through some searching I just discovered this generate update and it works like a DREAM!!!!!!!!!!!!!!    

Maybe you are looking for