var g_cue_sheets = new Array(); // for undo
var g_cue_sheet_now = -1;
var g_last_edit_row = 0;
var g_last_saved_sheet = -1;

var CS_timer;
var CS_search_data = null;
var CS_page_now = null;
var CS_sort_col_index_now = null;
var CS_sort_col_desc = false;
var CS_sort_page_last = null;
var max_CS_results_per_page = 5;




var ajax_CS_r = make_new_ajax_request();

// xtor for cue sheet
function CS(title_in)
{
   this.project_title = title_in;
   this.tracks = new Array();
}

function get_usage_options()
{
   opts = new Array();
   opt = new Object();
   opt.short_ver = "BI";
   opt.long_ver = "Background Instrumental";
   opts.push(opt);
 
   opt = new Object();
   opt.short_ver = "BV";
   opt.long_ver = "Background Voval";
   opts.push(opt);
 
   opt = new Object();
   opt.short_ver = "CT";
   opt.long_ver = "Closing Theme";
   opts.push(opt);

   opt = new Object();
   opt.short_ver = "FI";
   opt.long_ver = "Featured Instrumental";
   opts.push(opt);

   opt = new Object();
   opt.short_ver = "FV";
   opt.long_ver = "Featured Vocal";
   opts.push(opt);

   opt = new Object();
   opt.short_ver = "LG";
   opt.long_ver = "Logo";
   opts.push(opt);

   opt = new Object();
   opt.short_ver = "OT";
   opt.long_ver = "Opening Theme";
   opts.push(opt);

   opt = new Object();
   opt.short_ver = "SC";
   opt.long_ver = "Source Cue";
   opts.push(opt);

   opt = new Object();
   opt.short_ver = "VV";
   opt.long_ver = "Visual Voice";
   opts.push(opt);

   opt = new Object();
   opt.short_ver = "VI";
   opt.long_ver = "Visual Instrument";
   opts.push(opt);

   return opts;
}

// xtor for a cue sheet track
function CS_track()
{
   this.name = "";
   this.cue_key = "";
   this.cue_title = "";
   this.descrip = "";
   this.usage_id = 0;
   this.avail = false;
   this.publisher = "";
   this.composer  = "";
   this.start = "";
   this.end = "";
   return this;
}
   
function set_new_CS(cs_new)
{
   if (g_cue_sheet_now < g_cue_sheets.length - 1)
   {  
      g_cue_sheets.splice(g_cue_sheet_now + 1, 
         g_cue_sheets.length - 1 - g_cue_sheet_now);
   }

   g_cue_sheets.push(cs_new);
   g_cue_sheet_now++;
}

function hmsf_to_f(raw)
{
   var re  = 
      new RegExp("^([0-9][0-9]):([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$");

   if (re.exec(raw) == null)
   {  return null;
   }

   val = parseInt(RegExp.$1*60*60*30) +
         parseInt(RegExp.$2*60*30) +
         parseInt(RegExp.$3*30) + 
         parseInt(RegExp.$4);

   return val;
}

function f_to_hmsf(raw, show_frames)
{
   h = parseInt(raw / (60*60*30));
   m = parseInt((raw - (h*60*60*30))/(60*30));
   s = parseInt((raw - (h*60*60*30) - (m*60*30))/30);
   f = parseInt((raw -  h*60*60*30 -   m*60*30 - s*30));

   out = '';
   if (h < 10)
   {  out += "0";
   }  
   out += h + ":";
   if (m < 10)
   {  out += "0";
   }  
   out += m + ":";

   /*  in mins/secs, not mins/secs/frames
       30 frames max
       13 and above round up, 12 and below round down
       BUT 0:0:0:1 is still 0:0:1:0
   */
   if (!show_frames)
   {  if (f >=13 || (h+m+s == 0 && f >= 1))
      {  s++;
      }
   }

   if (s < 10)
   {  out += "0";
   }  
   out += s;

   if (show_frames)
   {  out += ":";
      if (f < 10)
      {  out += "0";
      }  
      out += f;
   }
   return out;
}

function show_cue_sheets(show)
{ 
   el = document.getElementById("cue_sheets_section_top");
   if (el == null)
   {  return;
   }
   el.style.display = (show ? "block" : "none");

   el = document.getElementById("cue_sheets_section_middle");
   if (el == null)
   {  return;
   }
   el.style.display = (show ? "block" : "none");

   if (!show)
   {  // all done now 
      clear_preview();
      return;
   }

   redraw_cue_sheet(-1);
   update_breadcrumb("CUE_SHEETS", false);

   show_my_bins(false);
   show_bin(false, 0);
   show_info_request(false, 0);
   show_login(false);
   show_order_summary(false, null);
   show_search(false);
   show_search_form(false);
   show_share(false, null);
   show_register(false);
   if (standalone)
   {  show_prefs(false);
      show_updater(false);
   }
   show_needledrop(false);
   show_new_releases(false);
   show_data_find(false);

   show_CS_intro_text();
}

function show_CS_intro_text()
{
   el = document.getElementById("CS_intro_text");
   el.innerHTML = 'Cue Sheets Beta';
}

function standalone_do_CS_upload()
{
   if (is_unix) {
      fileName= COCOA.getFileChoice_msg_pickMode_defaultDir_("Open File", "Select an EDL or XML file to load", false, null);
   } else {
      fileName = window.external.getFileChoice("Open File", "Select an EDL or XML file to load", false, null); 
   }


   if (fileName)
   {  
      showAlertHold("Processing file.  Please wait a few moments; " + 
         "it takes some time to search the database for matches");

      xml = "<\?xml version=\"1.0\"\?><CueSheetRequest>" +
         "<Command>Parse</Command>";

      // return if nothing to merge!
      xml += "<FileName>" + xml_escape(fileName) + "</FileName>";
      xml += "</CueSheetRequest>";

      xml = "xml=" + escape(xml);

      ajax_CS_r.open("POST", "/cue_sheet_backend.php", true);
     
      ajax_CS_r.onreadystatechange = merge_CS_callback;
      ajax_CS_r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      ajax_CS_r.send(xml);
   } 
}

function submit_upload_form()
{  if (g_last_saved_sheet != g_cue_sheet_now)
   {  if (!confirm("Are you sure you want to upload a new sheet? You have unsaved changes"))
      {  return;
      }
   }
//   el = document.getElementById("upload_iframe");
//   el.innerHTML = '';  // breaks IE

   el = document.getElementById("upload_frm");
   document.upload_frm.target = "upload_iframe";
   document.upload_frm.action = "/edl_upload_backend.php";
   document.upload_frm.submit();
}         

function process_cue_sheet_track(t_in, t)
{
   t.avail = ( XML_val(t_in, "Available") == 1 ? true : false);

   t.name = XML_val(t_in, "CatalogID");
   t.cue_key = XML_val(t_in, "CueKey");
   t.cue_title = XML_val(t_in, "CueTitle");
   t.descrip = XML_val(t_in, "CueDescription");
   t.publisher = XML_val(t_in, "Publisher");
   t.composer = XML_val(t_in, "Composer");

   // kind of complex, we get here by 1 of 2 means; if it's a
   //  track lookup we don't get the usageID and don't want to set it.
   //  if we are here from importing an XML we do want it
   usage_id = XML_val(t_in, "UsageID");
   if (usage_id != "")
   {  t.usage_id = usage_id;
   }

   // load up this cue's data
   if (t.cue_key && !all_cue_data[t.cue_key])
   {  nc = new Object();

      nc.is_pending_cart = 0;
      nc.cue_id = t.cue_key; 
      nc.cue_code = t.name;

      nc.cue_title = t.cue_title;

      nc.cue_length = XML_val(t_in, "Length");
      nc.disc_title = XML_val(t_in, "AlbumTitle");
      nc.cue_description = t.descrip;

      nc.preview_id = XML_val(t_in, "PreviewCode");
      all_cue_data[t.cue_key] = nc;
   }

   return t;
}

function update_cue_sheet_from_dom(d)
{
   el = document.getElementById('CS_project_title');
   el.value = XML_val(d, 'ProjectTitle');

   el = document.getElementById('CS_episode_title');
   el.value = XML_val(d, 'EpisodeTitle');

   el = document.getElementById('CS_client_name');
   el.value = XML_val(d, 'ClientName');

   el = document.getElementById('CS_production_co');
   el.value = XML_val(d, 'ProductionCo');

   el = document.getElementById('CS_program_type');
   el.value = XML_val(d, 'ProgramType');

   el = document.getElementById('CS_air_date');
   el.value = XML_val(d, 'AirDate');

   cs = new CS();
   tracks = d.getElementsByTagName('Track');
   if (tracks.length > 0)
   {  for (i = 0; i < tracks.length; i++)
      {  t = new CS_track();
         process_cue_sheet_track(tracks[i], t);
         
         t.start = XML_val(tracks[i], "TimeStart");
         t.end = XML_val(tracks[i], "TimeEnd");

         cs.tracks.push(t);
      }
   }
   set_new_CS(cs); 
   redraw_cue_sheet(-1);
}

function update_cue_sheet_from_XML(xml)
{
   d = parseXML(xml);
   update_cue_sheet_from_dom(d);
}

function undo_CS()
{
   if (g_cue_sheet_now > 0)
   {  g_cue_sheet_now -= 1;
   }

   redraw_cue_sheet(-1);
}

function redo_CS()
{
   if (g_cue_sheet_now < g_cue_sheets.length - 1)
   {  g_cue_sheet_now += 1;
   }

   redraw_cue_sheet(-1);
}


function duplicate_CS_row(id, copy)
{
   len = g_cue_sheets.length;
   if (len == 0) return;

   cs_old = g_cue_sheets[g_cue_sheet_now];

   cs_new = clone(cs_old);
   cs_new.tracks = new Array();

   // but redo the tracks because otherwise the insert is wacky
   for (i = 0; i < cs_old.tracks.length; i++)
   {
      t = clone(cs_old.tracks[i]);
      cs_new.tracks.push(t);
      if (i == id) 
      {  
         if (copy)
         {
            t = clone(cs_old.tracks[i]);
            cs_new.tracks.push(t);
         }
         else
         {  
            t = new CS_track();
            t.avail = false;
            cs_new.tracks.push(t);
         }
      }
   }

   set_new_CS(cs_new);
   redraw_cue_sheet(-1);
}

function delete_CS_row(id)
{
   len = g_cue_sheets.length;
   if (len == 0) return;
   cs_old = g_cue_sheets[g_cue_sheet_now];
   cs_new = clone(cs_old);
   cs_new.tracks = new Array();
    
   for (i = 0; i < cs_old.tracks.length; i++)
   {
      if (i == id) continue;
      t = clone(cs_old.tracks[i]);
      cs_new.tracks.push(t);
   }

   set_new_CS(cs_new);
   redraw_cue_sheet(-1);
}

// make the XML, but not the xml 'header' business
//  so this can be pasted onto another XML payload
function make_XML_for_CS(cs)
{
   xml = "<ProjectTitle>" + 
      xml_escape(document.getElementById('CS_project_title').value) +
      "</ProjectTitle>" + 
      "<EpisodeTitle>" + 
      xml_escape(document.getElementById('CS_episode_title').value) +
      "</EpisodeTitle>" + 
      "<ClientName>" +  
      xml_escape(document.getElementById('CS_client_name').value) + 
      "</ClientName>" +  
      "<ProductionCo>" + 
      xml_escape(document.getElementById('CS_production_co').value) + 
      "</ProductionCo>" + 
      "<ProgramType>" + 
      xml_escape(document.getElementById('CS_program_type').value) +
      "</ProgramType>" + 
      "<AirDate>" + 
      xml_escape(document.getElementById('CS_air_date').value) +
      "</AirDate>";

   for (i = 0; i < cs.tracks.length; i++)
   {  t = cs.tracks[i];

      xml += "<Track>" + 
         "<CueDescription>" + xml_escape(t.descrip) + "</CueDescription>" +
         "<TimeStart>" + xml_escape(t.start) + "</TimeStart>" +
         "<TimeEnd>" + xml_escape(t.end) + "</TimeEnd>" +
         "<Publisher>" + xml_escape(t.publisher) + "</Publisher>" +
         "<Composer>" + xml_escape(t.composer) + "</Composer>" +
         "<UsageID>" + xml_escape(t.usage_id) + "</UsageID>" +
         "</Track>";
   }
   return xml;
}

function merge_CS()
{
   xml = "<\?xml version=\"1.0\"\?><CueSheetRequest>" +
      "<Command>Merge</Command>";

   // return if nothing to merge!
   cs = g_cue_sheets[g_cue_sheet_now];
   xml += make_XML_for_CS(cs);
   xml += "</CueSheetRequest>";

   // IIRC, we must use escape here, no xml_escape because this is in fact
   //  XML (?)
   xml = "xml=" + escape(xml);

   ajax_CS_r.open("POST", "/cue_sheet_backend.php", true);
  
   ajax_CS_r.onreadystatechange = merge_CS_callback;
   ajax_CS_r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   ajax_CS_r.send(xml);
}

function lookup_CS_track_descrip(descrip)
{
   xml = "<\?xml version=\"1.0\"\?><CueSheetRequest>" +
      "<Command>Lookup</Command>" +
      "<TrackDesc>" + xml_escape(descrip) + "</TrackDesc>" + 
      "</CueSheetRequest>";

   xml = "xml=" + escape(xml);
   ajax_CS_r.open("POST", "/cue_sheet_backend.php", true);
  
   ajax_CS_r.onreadystatechange = lookup_CS_track_callback;
   ajax_CS_r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   ajax_CS_r.send(xml);
}

function save_CS_edit(edit_row)
{
   new_start = document.getElementById("CS_edit_t_start").value;
   new_end   = document.getElementById("CS_edit_t_end").value;

   f_start = hmsf_to_f(new_start);
   f_end = hmsf_to_f(new_end);

   if (f_start == null)
   {  showAlert("Please enter start time with format HH:MM:SS:FF");
      return;
   }

   if (f_end == null)
   {  showAlert("Please enter end time with format HH:MM:SS:FF");
      return;
   }

   if (f_start > f_end)
   {  tmp = new_end;
      new_start = new_end;
      new_end = tmp;
   }

   cs_old = g_cue_sheets[g_cue_sheet_now];

   cs_new = clone(cs_old);
   cs_new.tracks = new Array();
   for (i = 0; i < cs_old.tracks.length; i++)
   {
      t = clone(cs_old.tracks[i]);
      if (i == edit_row) 
      {    
         t.start = new_start;
         t.end   = new_end;
         t.usage_id = document.getElementById("sel_usage").value;

         if (!t.avail)
         {  t.cue_title = document.getElementById("CS_edit_cue_title").value;
            t.composer  = document.getElementById("CS_edit_composer").value;
            t.publisher = document.getElementById("CS_edit_publisher").value;
         }
      }
      cs_new.tracks.push(t);
   }

   set_new_CS(cs_new);

   // now look for a match and redraw
   el = document.getElementById("CS_edit_descrip");

   g_last_edit_row = edit_row;
   lookup_CS_track_descrip(el.value);

//   redraw_cue_sheet(-1);
}
function lookup_CS_track_callback()
{
   if (ajax_CS_r.readyState == 4) {
      if (ajax_CS_r.status == 200) {

         var d = ajax_CS_r.responseXML;
         result = XML_val(d, "Result");
         if (result == 'Success')
         {
            t_last = g_cue_sheets[g_cue_sheet_now].tracks[g_last_edit_row];
            t = clone(t_last); 
            process_cue_sheet_track(d, t);
         // fix up the row I was editing
            g_cue_sheets[g_cue_sheet_now].tracks[g_last_edit_row] = t;
         }
         else
         {  
            showAlert("Something went wrong with the track lookup: " +
               XML_val(d, "Error"));
         }
         // redraw pass or fail, because we deferred to this callback  
         redraw_cue_sheet(-1);

      }
   }
}

function merge_CS_callback()
{  
   if (ajax_CS_r.readyState == 4) {
      if (ajax_CS_r.status == 200) {

         hideHeldAlert();
         var d = ajax_CS_r.responseXML;
         result = XML_val(d, "Result");
         if (result == 'Success')
         {
            update_cue_sheet_from_dom(d);
         }
         else
         {  
            showAlert("Something went wrong with the track merge" + 
               XML_val(d, "Error"));
         }
         // redraw pass or fail, because we deferred to this callback  
         redraw_cue_sheet(-1);

      }
   }
}

function report_CS_callback()
{
   if (ajax_CS_r.readyState == 4) {
      if (ajax_CS_r.status == 200) {

         var d = ajax_CS_r.responseXML;
         result = XML_val(d, "Result");
         if (result == 'Success')
         {  if (!standalone) {
               file = XML_val(d, "URL");
               showTempAlert("Your Cue Sheet (beta) has been created and will begin downloading",
                  4000);
               instant_download_push(file);
            } else {
               showTempAlert("Your Cue Sheet (beta) has been created", 4000);
            }
         }
         else
         {  
            showAlert("Something went wrong with the report gen" + 
               XML_val(d, "Error"));
         }
         // redraw pass or fail, because we deferred to this callback  
      }
   }
}

function export_CS_callback()
{
   if (ajax_CS_r.readyState == 4) {
      if (ajax_CS_r.status == 200) {

         var d = ajax_CS_r.responseXML;
         result = XML_val(d, "Result");
         if (result == 'Success')
         {  file = XML_val(d, "URL");
            showTempAlert("Your XML file has been created and will begin downloading",
               4000);
            instant_download_push(file);
         }
         else
         {  
            showAlert("Something went wrong with the XML gen" + 
               XML_val(d, "Error"));
         }
         // redraw pass or fail, because we deferred to this callback  
      }
   }
}

function do_CS_export()
{
   xml = "<\?xml version=\"1.0\"\?><CueSheetRequest>" +
      "<Command>Export</Command>";

   var report_name;
   if (!standalone)
   {
      report_name = trim(document.getElementById("CS_export_name").value);
      if (!report_name)
      {  showAlert("Please enter a export filename");
         return;
      }
   }
   else
   {
      cs = g_cue_sheets[g_cue_sheet_now];
      xml = "<?xml version=\"1.0\"?>";
      xml += "<TheXML>";
      xml += make_XML_for_CS(cs);
      xml += "</TheXML>";
      if (is_unix) {
         report_name = COCOA.getFileSavePath_msg_ext_payload_("Save As", 
            "Choose a file to export the XML for this Cue Sheet", "xml", xml);
      } else {
         report_name = window.external.getFileSavePath("Save As", 
            "Choose a file to export the XML for this Cue Sheet", "xml", xml);
      } 
      return;
   }
   xml += "<ReportName>" + xml_escape(report_name) + "</ReportName>";

   cs = g_cue_sheets[g_cue_sheet_now];
   xml += "<TheXML>" + urlencode(make_XML_for_CS(cs)) + "</TheXML>";
   xml += "</CueSheetRequest>";
   xml = "xml=" + escape(xml);

   ajax_CS_r.open("POST", "/cue_sheet_backend.php", true);
  
   ajax_CS_r.onreadystatechange = export_CS_callback;
   ajax_CS_r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   ajax_CS_r.send(xml);
}

function make_CS_report()
{
   xml = "<\?xml version=\"1.0\"\?><CueSheetRequest>" +
      "<Command>Report</Command>";

   var report_name;
   if (!standalone)
   {
      report_name = trim(document.getElementById("CS_report_name").value);
      if (!report_name)
      {  showAlert("Please enter a report name");
         return;
      }
   }
   else
   {  if (is_unix) {
         report_name = COCOA.getFileSavePath_msg_ext_payload_("Save As", 
            "Choose a file for the Cue Sheet Report Spreadsheet", "xls", null); 
      } else {
         report_name = window.external.getFileSavePath("Save As", 
            "Choose a file for the Cue Sheet Report Spreadsheet", "xls", ""); 
      }
      if (!report_name)
      {  return;
      }
   }
    
   xml += "<ReportName>" + xml_escape(report_name) + "</ReportName>";
   // return if nothing to merge!
   cs = g_cue_sheets[g_cue_sheet_now];
   xml += make_XML_for_CS(cs);
   xml += "</CueSheetRequest>";
   xml = "xml=" + escape(xml);

   ajax_CS_r.open("POST", "/cue_sheet_backend.php", true);
  
   ajax_CS_r.onreadystatechange = report_CS_callback;
   ajax_CS_r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   ajax_CS_r.send(xml);
}

function handle_CS_text_box_changed(keyCode, val)
{
   if (keyCode == 13)
   {  clearTimeout(CS_timer);
      handle_CS_search_changed();
   }
   // character or delete key pressed; reschedule
   else if (keyCode > 40 || keyCode == 8)
   {  clearTimeout(CS_timer);
      CS_timer = setTimeout(handle_CS_search_changed, 200);
   }
}

function handle_CS_search_changed()
{  
   needs_search = false;

   CS_search_data = new Object;
   CS_search_data.attributes = new Array();
   text_in = trim(document.getElementById('CS_search_text_box').value);

   if (text_in)
   {  CS_search_data.search_text_box = text_in;
      needs_search = true;
   }

   // do a 'clean' search
   if (needs_search)
   {  do_CS_search(1, null);
   }
   else
   {  clear_CS_results_table();
   }
}

function do_CS_search(page, sort_col_index)
{
   // if we're in the midst of a search already, schedule ourselves to
   //  do the search after 1000 ms.  Also, cancel any other delayed &
   //  scheduled searchces 

   CS_page_now = page;

   // if this is the same page and column, then toggle the desc
   if (CS_sort_page_last == page && CS_sort_col_index_now == sort_col_index)
   {  CS_sort_col_desc = !CS_sort_col_desc;
   }
   // if it's a different sort column, reset to sort ascend   else if (CS_sort_col_index_now != sort_col_index)
   {  CS_sort_col_desc = false;
   }
   // else, leave the sorting along

   CS_sort_col_index_now = sort_col_index;
   CS_sort_page_last = page;
//var search_retry_timer = null;

   if (!CS_search_data)
   {  return -1;
   }
   xml = "<\?xml version=\"1.0\"\?><SearchRequest>";
   xml += "<MaxResultsPerPage>" + max_CS_results_per_page + "</MaxResultsPerPage>";

   // if this is an initial search, we have no sort columns yet.  We want
   //  to search by added_date.  This is a funky case.  But bascially if
   //  sort_col_index is null, we won't tell the backend what to order by,
   //  and so it will order by its default, which is added_date
   if (CS_sort_col_index_now != null)
   {
      xml += "<SortBy>" + columns[CS_sort_col_index_now].ajax_name + "</SortBy>"
;
   }
   xml += "<SortDesc>" + (CS_sort_col_desc ? '1' : '0') + "</SortDesc>";
   xml += "<Page>" + page + "</Page>";
   xml += "<SkipTitleSearch>1</SkipTitleSearch>";

   if (CS_search_data.search_text_box)
   {
      xml += "<SearchTextBox>" + xml_escape(CS_search_data.search_text_box) +
         "</SearchTextBox>";
   }

   xml += "</SearchRequest>";
   xml = "xml=" + escape(xml);
   ajax_CS_r.open("POST", "/search_backend.php", true);
   ajax_CS_r.onreadystatechange = CS_search_callback;
   ajax_CS_r.setRequestHeader("Content-Type", 
      "application/x-www-form-urlencoded");
   ajax_CS_r.send(xml);
}

function clear_CS_results_table()
{
   document.getElementById("CS_search_count").innerHTML = '';
   document.getElementById("CS_page_picker_bottom").innerHTML = '';

   table = document.getElementById("CS_results_table");
   row_count = table.rows.length;

   for (i = row_count; i > 0; i--)
   {  table.deleteRow(0);
   }
}

function handle_CS_report_box_changed(keyCode, val)
{
   if (keyCode == 13)
   {  make_CS_report();
   }
}

function make_blank_CS_report()
{  
   if (g_last_saved_sheet != g_cue_sheet_now)
   {  if (!doConfirm("Are you sure you want to start with a new sheet? You have unsaved changes"))
      {  return;
      }
   }

   cs = new CS("(untitled)");
   cs.tracks.push(new CS_track());
   g_cue_sheets = new Array();
   g_cue_sheets.push(cs);
   g_cue_sheet_now = 0;

   document.getElementById('CS_project_title').value = '';
   document.getElementById('CS_episode_title').value = '';
   document.getElementById('CS_client_name').value = '';
   document.getElementById('CS_production_co').value = '';
   document.getElementById('CS_program_type').value = '';
   document.getElementById('CS_air_date').value = '';

   redraw_cue_sheet(-1);
}

function replace_CS_track(cue_id, track_num)
{
   cs_old = g_cue_sheets[g_cue_sheet_now];

   cs_new = clone(cs_old);
   cs_new.tracks = new Array();

   for (i = 0; i < cs_old.tracks.length; i++)
   {
      if (i == track_num)
      {
         t = clone(cs_old.tracks[i]);
         cd = all_cue_data[cue_id];

         t.name = cd.cue_code;
         t.cue_key = cd.cue_id;
         t.cue_title = cd.cue_title;
         t.usage_id  = cd.usage_id;
         t.avail = true;
         t.descrip   = cd.cue_code;
         t.publisher = cd.publisher;
         t.composer  = cd.composer;
         cs_new.tracks.push(t);
      }
      else
      {
         t = clone(cs_old.tracks[i]);
         cs_new.tracks.push(t);
      }
   }
   set_new_CS(cs_new);
   redraw_cue_sheet(-1);
}

function append_CS_track()
{
   cs_old = g_cue_sheets[g_cue_sheet_now];
   cs_new = clone(cs_old);
   cs_new.tracks = new Array();
   for (i = 0; i < cs_old.tracks.length; i++)
   {
      t = clone(cs_old.tracks[i]);
      cs_new.tracks.push(t);
   }
   cs_new.tracks.push(new CS_track());

   set_new_CS(cs_new);
   redraw_cue_sheet(-1);
}

function add_CS_track(cue_id, track_num)
{  
   cs_old = g_cue_sheets[g_cue_sheet_now];
   cs_new = clone(cs_old);
   cs_new.tracks = new Array();

   for (i = -1; i < cs_old.tracks.length; i++)
   {
      if (i >= 0)
      {  
         t = clone(cs_old.tracks[i]);
         cs_new.tracks.push(t);
      }
      if (i == track_num)
      {  t = new CS_track();
         cd = all_cue_data[cue_id];

         t.name = cd.cue_code;
         t.cue_key = cd.cue_id;
         t.cue_title = cd.cue_title;
         t.avail = true;
         t.descrip   = cd.cue_code;
         t.usage_id  = 0;
         t.publisher = cd.publisher;
         t.composer  = cd.composer;
         cs_new.tracks.push(t);
      }
   }

   set_new_CS(cs_new);
   redraw_cue_sheet(-1);
}

function redraw_cue_sheet(edit_row)
{
   el = document.getElementById("CS_welcome");
   el2 = document.getElementById("CS_results_section");
   el3 = document.getElementById("CS_add_track_button");
   el4 = document.getElementById("CS_search_section");
   if (g_cue_sheet_now == -1)
   {  el.style.display = "";
      el2.style.display = "none";
      el3.style.display = "none";
      el4.style.display = "none";
   }
   else
   {  el.style.display = "none";
      el2.style.display = "";
      el3.style.display = "";
      el4.style.display = "";
   }

   el = document.getElementById("CS_report_div");
   el.style.display = (g_cue_sheet_now >= 0 ? "" : "none");

   el = document.getElementById("CS_export_div");
   el.style.display = (g_cue_sheet_now >= 0 ? "" : "none");

   el = document.getElementById("CS_redo_button");
   if (g_cue_sheet_now < g_cue_sheets.length - 1)
   {  el.style.display = "";
   }
   else
   {  el.style.display = "none";
   }

   el = document.getElementById("CS_undo_button");
   if (g_cue_sheet_now > 0)
   {  el.style.display = "";
   }
   else
   {  el.style.display = "none";
   }

   el = document.getElementById("CS_merge_button");
   if (g_cue_sheet_now > 0)
   {  el.style.display = "";
   }
   else
   {  el.style.display = "none";
   }

   clear_cue_sheet();
   len = g_cue_sheets.length;
   if (len == 0) return;

   cs = g_cue_sheets[g_cue_sheet_now];


   table = document.getElementById("cue_sheet_table");

   col = 0; 
   row = table.insertRow(table.rows.length);
   row.className = "result_title";

   cell = row.insertCell(col++);
   cell.className = "mainTextTableHeader";
   cell.innerHTML = "<B>#<B>";

   cell = row.insertCell(col++);
   cell.className = "mainTextTableHeader";
   cell.innerHTML = "<B>File name<B><BR><B>o1engine Match</B><BR><B>Usage</B>";

   cell = row.insertCell(col++);
   cell.className = "mainTextTableHeader";
   cell.innerHTML = "<B>Track Title<B><BR><B>Composer</B><BR><B>Publisher</B>";

   cell = row.insertCell(col++);
   cell.className = "mainTextTableHeader";
   cell.innerHTML = "<B>TC in<BR>TC out<BR>Duration (hr:min:sec)<B>";

   // popup menu
   cell = row.insertCell(col++);
   cell.className = "mainTextTableHeader";
   cell.innerHTML = "";
 
   for (i = 0; i < cs.tracks.length; i++)
   {
      t = cs.tracks[i];

      col = 0;
      row = table.insertRow(table.rows.length);
      row.className = (i % 2 ? "result_even" : "result_odd");

      // cue sheet row number
      cell = row.insertCell(col++);
      cell.width = "20";
      cell.className = "mainTextTable";
      cell.innerHTML = (i + 1);

      cell = row.insertCell(col++);
      cell.className = "mainTextTable";

      out = "<TABLE class=\"mainTextTable\">";
           
      out += "<TR><TD NOWRAP>f</TD><TD>-</TD>"; 
      if (edit_row == i)
      {  out += 
            "<TD><INPUT type='text' id='CS_edit_descrip' size=\"20\" value=\"" + 
            t.descrip + "\"></td>";
      }
      else
      {  out += "<TD>" + t.descrip + "</TD>";
      }

      out += "<TR><TD NOWRAP>o</TD><TD>-</TD>"; 
      out += "<TD><SPAN class=\"" + (t.avail ? "mainTextTable" : "errorText") + 
         "\">" + t.name + "</span>";
      out  += "</TD></TR>";

      opts = get_usage_options();
      out += "<TR><TD NOWRAP>u</TD><TD>-</TD>"; 
      if (edit_row == i)
      {
         out += "<TD><SELECT id=\"sel_usage\">";
         for (j = 0; j < opts.length; j++)
         {
            out += "<OPTION VALUE=\"" + j + "\" " +
               (j == t.usage_id ? "SELECTED" : "") + ">" + 
               opts[j].short_ver + " - " + opts[j].long_ver + 
               "</OPTION>";
         }
         out += "</SELECT></TD>";
      }
      else
      {  
         out += "<TD>" + opts[t.usage_id].short_ver + "</TD>";
      }
      out += "</TR></TABLE>";
      cell.className = "mainTextTable";
      cell.width = "150";
      cell.innerHTML = out;


      cell = row.insertCell(col++);
      cell.style.padding = "6px 0px 6px 0px";
      cell.width = "280";
      cell.className = "mainTextTable";
      if (edit_row == i && !t.avail)
      {
         cell.innerHTML = "<TABLE class=\"mainTextTable\">" + 
            "<TR>" + 
            "<TD NOWRAP>t</TD><TD>-</TD>" + 
            "<TD><INPUT type='text' id='CS_edit_cue_title' size=\"30\" value=\""+ t.cue_title+ "\"></TD>" +
            "</TR>" +
            "<TR>" + 
            "<TD NOWRAP>c</TD><TD>-</TD>" + 
            "<TD><INPUT type='text' id='CS_edit_composer' size=\"30\" value=\""+ t.composer+ "\"></TD>" +
            "</TR>" + 
            "<TR>" + 
            "<TD NOWRAP>p</TD><TD>-</TD>" + 
            "<TD><INPUT type='text' id='CS_edit_publisher' size=\"30\" value=\""+ t.publisher+ "\"></TD>" +
            "</TR>" + 
            "</TABLE>";
      }
      else
      {
         cell.innerHTML = "<TABLE class=\"mainTextTable\"><TR>" + 
            "<TD NOWRAP>t</TD><TD>-</TD><TD>" + t.cue_title + "</TD></TR>" + 
            "<TR><TD NOWRAP>c</TD><TD>-</TD><TD>" + t.composer + "</TD></TR>" + 
            "<TR><TD NOWRAP>p</TD><TD>-</TD><TD>" + t.publisher + "</TD></TR></TABLE>";
      }


      cell = row.insertCell(col++);
      cell.width = "20";
      cell.className = "mainTextTable";
      if (edit_row == i)
      {  cell.innerHTML = 
            "<TABLE class=\"mainTextTable\">" + 
            "<TR><TD NOWRAP>i</TD><TD>-</TD>"+"<TD><INPUT type='text' id='CS_edit_t_start' size=\"13\" value=\""+ t.start+ "\"></TD></TR>"+
            "<TR><TD NOWRAP>o</TD><TD>-</TD><TD><INPUT type='text' id='CS_edit_t_end' size=\"13\" value=\""+ t.end+ "\"></TD></TR>"+
   "</TABLE>";
      }
      else
      {  
         duration = f_to_hmsf(hmsf_to_f(t.end) - hmsf_to_f(t.start), false);

         cell.innerHTML = "<TABLE class=\"mainTextTable\">" + 
            "<TR><TD NOWRAP>i</TD><TD>-</TD><TD>"  + t.start + "</TD></TR>" +
            "<TR><TD NOWRAP>o</TD><TD>-</TD><TD>" + t.end + "</TD></TR>" +
            "<TR><TD NOWRAP>d</TD><TD>-</TD><TD>" + duration + "</TD></TR>" +
         "</TABLE>";
      }

      // popup menu
      cell = row.insertCell(col++);
      cell.width = "30";

      if (edit_row == i)
      {
         cell.innerHTML = 
            '<A HREF="javascript:save_CS_edit('+ i +')">' + 
            mk_button("SAVE") + '</A><BR>' +
            '<A HREF="javascript:redraw_cue_sheet(-1)">' + 
            mk_button("CANCEL") + '</A><BR>';
      }
      else
      {
         if (t.cue_key)
         { 
         span = document.createElement('span');
         span.innerHTML = 
            "<A HREF=\"javascript:play_preview_mini('" + 
               t.cue_key + "');\">" + 
            "<img src=\"/img/speaker_" + 
               (domain_info.white_on_black_results_bin ? "light" : "dark") + 
                  ".gif\"" +
         " style=\"border-style:none;\" ALIGN=\"ABSMIDDLE\"></A><BR>";
         cell.appendChild(span);
         }

         popup_control = document.createElement('img');
         button_id = "CS_row_" + i;
         popup_control.cue_key = t.cue_key;
         popup_control.avail = t.avail;
         popup_control.setAttribute('id', button_id);
         popup_control.style.cursor = "pointer";
         popup_control.src = '/img/gear_' +
            (domain_info.white_on_black_results_bin ? "light" : "dark") +".gif";
         popup_control.row_number = i;
         popup_control.onclick = show_CS_menu;
         cell.appendChild(popup_control);
      }
   }
   // try to do this late in the process help make sure it happens
   if (edit_row != -1)
   {
      el = document.getElementById("CS_edit_descrip");
      el.focus();
   }
}

function clear_cue_sheet()
{
   table = document.getElementById("cue_sheet_table");
   row_count = table.rows.length;

   for (i = row_count; i > 0; i--)
   {  table.deleteRow(0);
   }
}

function draw_CS_results_table_title()
{
   table = document.getElementById("CS_results_table");

   row = table.insertRow(0);
   row.className = "result_title";
   for (i = 0; i < columns.length; i++)
   {
      cell = row.insertCell(i);

      cell.innerHTML = '<B>' +
         '<A class="mainTextTableHeader" HREF="javascript:'+
         'do_CS_search(' + page_now + ',' + i + ');">' +
         columns[i].pretty_name + '</B>' + "</A>&nbsp;";
   }
   cell = row.insertCell(i);
   cell.innerHTML = ''; //Preview
}

function make_CS_page_link(page_num, txt)
{
   return "<A HREF=\"javascript:do_CS_search(" + page_num + "," +
      sort_col_index_now + ");\">" + txt + "</A>&nbsp;";
}

function CS_search_callback()
{  
   if (ajax_CS_r.readyState == 4) {
      if (ajax_CS_r.status == 200) {

         // Get the response from the server - conveniently already
         //  as an XML tree (requires some subtle header settings in 
         //  the server script
         var d = ajax_CS_r.responseXML;
         node = d.getElementsByTagName('TotalTitleCount')[0];
         count = 0;
         if (node)
         {  count = Number(node.childNodes[0].nodeValue);
         }

         search_string = null;
         node = d.getElementsByTagName('SearchDescrip')[0];
         if (node && node.childNodes[0])
         {  search_string = node.childNodes[0].nodeValue;
         }

         node = d.getElementsByTagName('SearchWarning')[0];

         el = document.getElementById("CS_search_warning");   
         if (node)
         {  search_warning = node.childNodes[0].nodeValue;
            el.innerHTML = search_warning;
         }
         else
         {  el.innerHTML = "";
         }

      if (count)
      {  
         out = "Found " + count + " possible matches";
         if (search_string)
         {  out += " for <B>" + search_string + "</B>";
         }
         clear_CS_results_table();
         draw_CS_results_table_title();

      // get the page number we are currently showing.  if we don't cast
      //  this as a number we get into trouble as we do arithmetic on it
      //  below in drawing the page links
         page_num = Number(XML_val(d, 'Page'));

         if (Number(count) > Number(max_CS_results_per_page))
         {  first = 1 + ((page_num - 1)*max_CS_results_per_page);
            last = count - first > max_CS_results_per_page ? 
               page_num*max_CS_results_per_page : count; 
            out += " - showing results " + first + " to " + last;
         }

      // how many pages total do we have?
         last_page = Math.ceil(count / (max_CS_results_per_page));


      // the var where we prep what we're going to dump out the page links
         page_pick_out = "";

         if (last_page > 1)
         {
            first_page_link = (page_num - Math.round(max_page_links_to_draw/2) + 
               max_page_links_to_draw % 2);
            if (first_page_link < 1)
            {  first_page_link = 1;
            }

            last_page_link = (first_page_link + max_page_links_to_draw - 1);
            if (last_page_link > last_page)
            {  last_page_link = last_page;
            }
            if (first_page_link > 1)
            {  page_pick_out += make_CS_page_link(1, "(first)") +"&nbsp;";
               left = Math.max(1, page_num - max_page_links_to_draw);
               page_pick_out += make_CS_page_link(left, "&lt;&lt;") +"&nbsp;";
            }
      // previous page link            
            if (page_num > 1)
            {  page_pick_out += make_CS_page_link(page_num - 1, "&lt;") +"&nbsp;";
            }
            for (i = first_page_link; i <= last_page_link; i++)
            {  if (i > first_page_link) 
               {  page_pick_out += " ";
               }
               if (i == page_num)
               {  page_pick_out += "<B>" + i + "</B>";
               }
               else
               {  page_pick_out += make_CS_page_link(i, i);
               }
               page_pick_out += "&nbsp;";
            }
      // previous page link            
            if (page_num < last_page)
            {  page_pick_out += make_CS_page_link((page_num + 1), '&gt;') + 
                  '&nbsp';
            }
            if (last_page_link < last_page)
            {  right = Math.min(last_page, page_num + max_page_links_to_draw);
               page_pick_out += make_CS_page_link(right, '&gt;&gt;') + 
                  "&nbsp;";
               page_pick_out += make_CS_page_link(last_page, '(last)');
            }            
         }
      // find the elemend where we draw our page links
         page_el = document.getElementById("CS_page_picker_bottom");
         page_el.innerHTML = page_pick_out;

      // now draw the results in a table
         table = document.getElementById("CS_results_table");
         items = d.getElementsByTagName('Item');

         if (items.length > 0)
         {  
            for (i = 0; i < items.length; i++)
            {  //title = items[i].getElementsByTagName("CueTitle").textContent;
               row = table.insertRow(i + 1);
               col = 0;

               row.className = "result_" + (i%2 ? "odd" : "even");
               cat_id = items[i].getElementsByTagName("CatalogID")[0].childNodes[0].nodeValue;
               cell = row.insertCell(col++);
               cell.className = "mainTextTable";
               cell.width = "100";
               cell.innerHTML = cat_id;

               cue_title_in = items[i].getElementsByTagName("CueTitle")[0].childNodes[0];
               if (cue_title_in)
               {  cue_title = cue_title_in.nodeValue;
               }
               else
               {  album_title = "-";
               }
               cell = row.insertCell(col++);
               cell.className = "mainTextTable";
               cell.width = 225;
               cell.style.padding = "1px 5px 1px 0px";
               cell.innerHTML = cue_title;

               album_title_in = items[i].getElementsByTagName("AlbumTitle")[0].childNodes[0];
               if (album_title_in)
               {  album_title = album_title_in.nodeValue;
               }
               else
               {  album_title = "-";
               }

               composer_in = items[i].getElementsByTagName("Composer")[0].childNodes[0];
               if (composer_in)
               {  composer= composer_in.nodeValue;
               }
               else
               {  composer = "";
               }

               publisher_in = items[i].getElementsByTagName("Publisher")[0].childNodes[0];
               if (publisher_in)
               {  publisher= publisher_in.nodeValue;
               }
               else
               {  publisher = "";
               }

               cue_description_in = items[i].getElementsByTagName("CueDescription")[0].childNodes[0];
               if (cue_description_in)
               {  cue_description = cue_description_in.nodeValue;
               }
               else
               {  cue_description = "-";
               }

               cell = row.insertCell(col++);
               cell.className = "mainTextTable";
               cell.width = 375;
               cell.style.padding = "1px 5px 1px 0px";
               cell.innerHTML = cue_description;

               cue_length = items[i].getElementsByTagName("Length")[0].childNodes[0].nodeValue;
               cell = row.insertCell(col++);
               cell.className = "mainTextTable";
               cell.width = 50;
               cell.innerHTML = cue_length;

               cue_id= items[i].getElementsByTagName("CueKey")[0].childNodes[0].nodeValue;
               preview_id = items[i].getElementsByTagName("PreviewCode")[0].childNodes[0].nodeValue;
               cell = row.insertCell(col++);
               cell.className = "mainTextTable";
               cell.valign="middle";
               cell.width = 90;

	            this_row = new Object();
               this_row.el = row;
               this_row.cue_id = cue_id;
               this_row.cue_code = cat_id;
               this_row.cue_title = cue_title;
               this_row.cue_length = cue_length;
               this_row.disc_title = album_title;
               this_row.cue_description = cue_description;
               this_row.preview_id = preview_id;
               this_row.composer = composer;
               this_row.publisher = publisher;

               all_cue_data[cue_id] = this_row;

               out2 = "<A HREF=\"javascript:play_preview_mini('" + cue_id + 
                  "');\"><img src=\"/img/speaker_" + 
                  (domain_info.white_on_black_results_bin ? "light" : "dark") +
                   ".gif\"" + 
                  " style=\"border-style:none;\" ALIGN=\"ABSMIDDLE\">"+ 
                  "</A>&nbsp;&nbsp;";
//               out2 += "&nbsp;<A class=\"mainTextTable\" HREF=\"javascript:add_DF(" + cue_id + ")\">Add</A>";
               span = document.createElement('span');
               span.innerHTML = out2; 
               cell.appendChild(span);

               button_id = "CS_search" + cue_id;
               popup_control = document.createElement('img');
               popup_control.cue_key = cue_id;
               popup_control.setAttribute('id', button_id);
               popup_control.style.cursor = "pointer";
               popup_control.src = '/img/gear_' +
                  (domain_info.white_on_black_results_bin ? "light" : "dark") +".gif";
               popup_control.onclick = show_CS_search_menu;
               cell.appendChild(popup_control);
            }
         }
         
      }
      else if (count == 0)
      {  if (search_string)
         {  out = "Found no results for <B>" + search_string + "</B>";
         }
         else
         {  out = "Found no results";
         }
         clear_CS_results_table();
      } 
      else if (count == -1)
      {  out = "SEARCH ERROR";
      }
   }


  el = document.getElementById("CS_search_count");   
  el.innerHTML = out;
      
   }
}




