/**
 * This script will render between markers
 * 
 * Written By: Edward Troxel
 * www.jetdv.com/tts
 * Modified: 05-29-2003
 **/

import System;
import System.Text;
import System.IO;
import System.Windows.Forms;
import System.Object;
import SonicFoundry.Vegas;

// here are some default variables for the GUI.
//Path names must use "\\" to indicate a standard path "\"
//so, defaultBasePath refers to D:\renders\

var defaultBasePath = "D:\\vmedia\\";

// set this to true if you want to allow files to be overwritten
var overwriteExistingFiles = false;

try {

  var mrkEnum = new Enumerator(Vegas.Project.Markers);

  var zeroMark = new Timecode(0);
  var PrevMark = zeroMark;
  var currMark = zeroMark;
  var SubClipNum = 1;
  var renderStart : Timecode;
  var totalLength = Vegas.Project.Length;
  var renderLength : Timecode;

  var renderer = FindRenderer(/Video for Windows/);
  if (null == renderer)
      throw "failed to find renderer";

  var template = FindRenderTemplate(renderer, /NTSC DV/);
  if (null == template)
      throw "failed to find template";


  //Go through the list of Markers
  while (!mrkEnum.atEnd()) {
    currMark = Marker(mrkEnum.item()).Position;

    renderStart = PrevMark;
    renderLength = currMark - PrevMark;
    DoRender(defaultBasePath + "test" + SubClipNum + ".AVI", renderer, template, renderStart, renderLength);

    PrevMark = currMark
    SubClipNum++;
    mrkEnum.moveNext();
  }

  // Do the final clip
  renderStart = PrevMark;
  renderLength = totalLength - PrevMark;
  DoRender(defaultBasePath + "test" + SubClipNum + ".AVI", renderer, template, renderStart, renderLength);

} catch (e) {
    MessageBox.Show(e);
}


// perform the render. The Render method returns a member of the
// RenderStatus enumeration. If it is anything other than OK, exit
// the loops. This will throw an error message string if the render
// does not complete successfully.
function DoRender(fileName, rndr, rndrTemplate, start, length) {
  // make sure the file does not already exist
  if (!overwriteExistingFiles && File.Exists(fileName)) {
      throw "File already exists: " + fileName;
  }

  // perform the render. The Render method returns
  // a member of the RenderStatus enumeration. If
  // it is anything other than OK, exit the loops.
  var status = Vegas.Render(fileName, rndrTemplate, start, length);

  // if the render completed successfully, just return
  if (status == RenderStatus.Complete)
      return;

  // if the user canceled, throw out a special message that won't be
  // displayed.
  if (status == RenderStatus.Canceled) {
      var cancelMsg = new String("User canceled");
      cancelMsg.skipMessageBox = true;
      throw cancelMsg;
  }

  // if the render failed, throw out a detailed error message.
  var msg : StringBuilder = new StringBuilder("Render failed:\n");
  msg.Append("\n file name: ");
  msg.Append(fileName);
  msg.Append("\n Renderer: ");
  msg.Append(rndr.FileTypeName);
  msg.Append("\n Template: ");
  msg.Append(rndrTemplate.Name);
  msg.Append("\n Start Time: ");
  msg.Append(start.ToString());
  msg.Append("\n Length: ");
  msg.Append(length.ToString());
  throw msg;
}



function FindRenderer(rendererRegExp : RegExp) : Renderer {
  var rendererEnum : Enumerator = new Enumerator(Vegas.Renderers);
  while (!rendererEnum.atEnd()) {
    var renderer : Renderer = Renderer(rendererEnum.item());
    if (null != renderer.FileTypeName.match(rendererRegExp)) {
        return renderer;
    }
    rendererEnum.moveNext();
  }
  return null;
}

function FindRenderTemplate(renderer : Renderer, templateRegExp : RegExp) : RenderTemplate {
  var templateEnum : Enumerator = new Enumerator(renderer.Templates);
  while (!templateEnum.atEnd()) {
    var renderTemplate : RenderTemplate = RenderTemplate(templateEnum.item());
    if (null != renderTemplate.Name.match(templateRegExp)) {
        return renderTemplate;
    }
    templateEnum.moveNext();
  }
  return null;
}


