// Functional edits added by Green4ever from Adobe forums.
// http://forums.adobe.com/thread/940934

// Logic behind this script
 
// theScript()
// is a wrapper function to provide functional scope to the entire script
// This function is invoked at the very bottom of the file
 
// main();
// the main function that gathers the initial parameters and launches the dialog box
 
// function mainDialog(docRef, selectedItems, layers, inputs)
// A function that creates a dialog box this function is passed as a parameter to a "factory method"
// called function sfDialogFactory(dialog)
// which is a general purpose utility for creating dialog boxes.
 
// The mainDialog function has a callback function that responds to the "comtinue" button and after some validation
// makes a call to a function called
 
// function doAction(docRef, inputs, options)
// This is where the main behvior of the script is suppose to be defined.
// it is designed to be called AFTER the dialog box return and is the result of the callback inside mainDialog
// The doAction function receives objects that are parameter holders for various inputs and options that come from the
// dialog box presented to the user
 
 
 
function theScript() {
///////////////////////////////////////////////////
// BEGIN THE SCRIPT
//=================================================
 
 
////////////////////////////////////////////////////////////////////////////////
// SCRIPT MAIN PROCESS
////////////////////////////////////////////////////////////////////////////////
// Main Process
// The beginning of the script starts here
// Add main logic routine to this function
 
// Call Main Function to get the ball rolling
var elementsData;
var theDocument = app.activeDocument;
var inputGroup;
main();
 
function main(){
var theSelectedItems = theDocument.selection;
var theLayers = theDocument.layers;
 
    var myDialog = sfDialogFactory(mainDialog(theDocument, theSelectedItems), theLayers);
    var result = myDialog.show();
    if (result == 1){
        newAction();
        alert("Done");
        }
    else{
        alert("Not Done");
        }
}
 
////////////////////////////////////////////////////////////////////////////////
// SCRIPT SUPPORTING FUNCTIONS
////////////////////////////////////////////////////////////////////////////////
// Supporting Functions
// Include functions that offer partial functionality
// These functions are called and acted upon within the mainProcess function
function newAction(){
        
        var formData = getControlValues(inputGroup);    
        var inputs = {};
        var options = {};
       // alert("callback get form data");
      // Do something with formData values here
        var cLen = formData.controls.length;
        var formValues = '';
        for (var c = 0; c < cLen; c++ )
        {
            if (formData.controls[c].name === "inputECONumber") {
                inputs.inputECONumber = formData.controls[c].value;
                // alert(formData.controls[c].name + " | " + formData.controls[c].value);
            }
 
            if (formData.controls[c].name === "inputDocumentName") {
                inputs.inputDocumentName = formData.controls[c].value;
                // alert(formData.controls[c].name + " | " + formData.controls[c].value);
            }
 
            if (formData.controls[c].name === "inputDocumentNumber") {
                inputs.inputDocumentNumber = formData.controls[c].value;
                // alert(formData.controls[c].name + " | " + formData.controls[c].value);
            }
 
            if (formData.controls[c].name === "inputDocumentRevision") {
                inputs.inputDocumentRevision = formData.controls[c].value;
                // alert(formData.controls[c].name + " | " + formData.controls[c].value);
            }
 
            if (formData.controls[c].name === "inputDocumentType") {
                inputs.inputDocumentType = formData.controls[c].value;
                // alert(formData.controls[c].name + " | " + formData.controls[c].value);
            }    
        }//End FOR
    doAction(theDocument, inputs, options);
    }
 
 
function mainDialog(docRef, selectedItems, layers, inputs) {
 
// Main Dialog
// alert("Main Dialog: " + docRef.name);
 
if ( docRef === undefined ) {
  alert("Cannot Execute, please select a document.");
}
 
  var currentData = getMetaData();
 
  var dialogObj = {};
 
  dialogObj.groups = []; // An array of dialog groups
  dialogObj.title = "Update Meta Data";
 
  var groupLabelInfo = {};
  groupLabelInfo.title = "Edit: " + docRef.name;
  
  // Add Elements using JSON shorthand syntax
  groupLabelInfo.elements = [
    {
        "name":"labelECONumber",
        "type":"statictext",
        "value":"Engineering Change Order (ECO) Number",
        "visible":true
    },
    {
        "name":"inputECONumber",
        "type":"edittext",
        "value": currentData.inputECONumber,
        "visible":true
    },
 
    {
        "name":"documentName",
        "type":"statictext",
        "value":"Document Name",
        "visible":true
    },
    {
        "name":"inputDocumentName",
        "type":"edittext",
        "value": currentData.inputDocumentName,
        "visible":true
    },
 
    {
        "name":"documentNumber",
        "type":"statictext",
        "value":"Document Number",
        "visible":true
    },
    {
        "name":"inputDocumentNumber",
        "type":"edittext",
        "value": currentData.inputDocumentNumber,
        "visible":true
    },
 
 
    {
        "name":"documentRevision",
        "type":"statictext",
        "value":"Revision",
        "visible":true
    },
    {
        "name":"inputDocumentRevision",
        "type":"dropdownlist",
        "value": currentData.listRevisions,
        "visible":true,
        "selection":currentData.selectionRevision,
    },
 
    {
        "name":"documentType",
        "type":"statictext",
        "value":"Label Type",
        "visible":true
    },
    {
        "name":"inputDocumentType",
        "type":"dropdownlist",
        "value": currentData.listDocumentTypes,
        "visible":true,
        "selection":currentData.selectionDocumentType,
    },
 
  ];
 
 
  // Add to groups to list
  dialogObj.groups.push(groupLabelInfo);
  return dialogObj;
}
 
function doAction(docRef, inputs, options) {
 
alert("doAction " + docRef.name + " \n INPUTS: \n" + inputs.reflect.properties + "\n\n OPTIONS: \n" + options.reflect.properties);
 
 
// Get the current contents
 
var fooContents = app.activeDocument.textVariables.item ('Foo').variableOptions.contents;
var barContents = app.activeDocument.textVariables.item ('Bar').variableOptions.contents;
 
 
alert("GET textVariable contents \n Foo: \n" + fooContents + "\n\n Bar: \n" + barContents);
 
// Set/Update the contents
// Why does this not seem to work?
 
alert("SET textVariable contents \n Foo: \n" + inputs.inputDocumentName + "\n\n Bar: \n" + inputs.inputDocumentType);
 
app.activeDocument.textVariables.item ('Foo').variableOptions.contents = inputs.inputDocumentName;
app.activeDocument.textVariables.item ('Bar').variableOptions.contents = inputs.inputDocumentType;
 
 
// Script does not seem to reach this point. Why?
alert("END of doAction");
}
 
 
// A Factory function for creating dialog boxes
 
function sfDialogFactory(dialog) {
  
    // A factory method for creating dialog screens
    
    // Dialog Window
    var d = new Window("dialog", dialog.title);
 
    // alert("Number of Inputs" + dialog.inputs.length);
    // alert("Number of Options" + dialog.options.length);
 
    var i; // counter
    var len; // length of array elements
 
    // Generate Groups
    if (dialog.groups.length > 0) {
           
        len = dialog.groups.length;
        for (i = 0; i < len; i++ )
        {
            var currentGroup = dialog.groups[i];
            inputGroup = d.add ("panel", undefined, currentGroup.title);
                inputGroup.alignChildren = ["fill","fill"];
 
            if (currentGroup.elements.length > 0) {
                // Add Elements
                var ii;
                var elemLen = currentGroup.elements.length;
                for (ii = 0; ii < elemLen; ii++ )
                {
                    var currentElement = currentGroup.elements[ii];
 
                    var el = inputGroup.add(currentElement.type, undefined, currentElement.value);
 
                    // Additional properties added for future reflection
                    el.elName = currentElement.name;
                    el.elIndex = ii;
 
                    switch(currentElement.type)
                    {
                        case "statictext":
                            el.visible = currentElement.visible;
                        break;
                        case "edittext":
                            el.visible = currentElement.visible;
                        break;
                        case "dropdownlist":
                            el.visible = currentElement.visible;
                            el.selection = currentElement.selection;
                            el.onChange = currentElement.onChange;
                        break;
                        case "checkbox":
                            el.visible = currentElement.visible;
                            el.value = currentElement.value;
                        break;
                        default:
                        throw new Error('Unknown Dialog Element Type [' + currentElement.type + ']');
                    }
 
                }
            }
        }
    }
 
  // Buttons Group
  var buttonGroup = d.add("group");
  var bOK = buttonGroup.add("button", undefined, "Continue", {name: "ok"});
  var bCANCEL = buttonGroup.add("button", undefined, "Cancel", {name: "cancel"});
 
  return d;
}
function getControlValues(set) {
    elementsData = {};
    elementsData.controls = [];
    // TO DO Add more types
 
    var giLen = set.children.length;
    for (var gi = 0; gi < giLen; gi++ )
    {
        var child = set.children[gi];
        // alert(objReflection(child, "none", false));
        // alert(child.type);
        var control = {};
            control.name = child.elName;
            control.index = child.elIndex;
            control.type = child.type;
            control.visible = child.visible;
        switch(child.type)
        {
            case "statictext":
                control.value = child.text;
            break;
            case "edittext":
                control.value = child.text;
            break;
            case "dropdownlist":
                control.value = child.selection.text;
            break;
            case "checkbox":
                control.value = child.value;
            break;
            default:
            throw new Error('Unknown Dialog Element Type');
        }
        elementsData.controls.push(control);
        // alert(objReflection(control, "none", false));
    }
    return elementsData;
}
function getMetaData() {
// Return a data structure that contains meta data from the document.
 
    var dataObject = {};
 
     // Default arrays
     dataObject.listRevisions = generateRangeOfNumbers ("r", 1, 100);
     dataObject.listDesignComps = generateRangeOfNumbers ("Comp_", 1, 100);
     dataObject.listDocumentTypes = [
                     "Datasheet",
                     "Manual",
                     "Tech Guide",
                     "Other"
                 ];
 
 
     // Set Sensible Default Values for the UI Form
     if (!dataObject.inputECONumber) {
         dataObject.inputECONumber = "###ECO###";
     }
 
     if (!dataObject.inputDocumentName) {
         dataObject.inputDocumentName = "Document Name";
     }
 
     if (!dataObject.inputDocumentNumber) {
         dataObject.inputDocumentNumber = "048-xxx-30";
     }
 
     if (!dataObject.inputDocumentRevision) {
         dataObject.inputDocumentRevision = "r01";
     }
 
     if (!dataObject.inputDocumentType) {
         dataObject.inputDocumentType = "Datasheet";
     }
 
 
     return dataObject;
 
}
 
 
function generateRangeOfNumbers (prefix, start, end) {
    // This function generates an array of sequential numbers within a range
    // prefix = string to append to beginning of each element
    // start = the beginning of the range
    // end = the end of the range
    // length = overall number of cycles to loop through, start and end must fall within this value
    
    var output = [];
    
    for ( var i = start; i <= end; i++ )
    {
        if (i < 10) {
            // Add a leading zero
            output.push(prefix + "0" + i);
        }
        else {
            output.push(prefix + i);
        }
    }
 
    return output;
}
 
 
//=================================================
// END THE SCRIPT
///////////////////////////////////////////////////
}
 
theScript();