// include our JavaScript stuff for Ajax
// the ajaxml object we need to make our calls

// need way to keep track things already added to a cart!
//
var ajax_bin_r = make_new_ajax_request();
var ajax_info_busy = false;
var showing_bin = false;
var showing_my_bins = false;
var bin_key_now = null;

function bin_request_callback()
{
   if (ajax_bin_r.readyState == 4) {
      if (ajax_bin_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_bin_r.responseXML;
         node = d.getElementsByTagName('Result')[0];
         if (node)
         {  if (node.childNodes[0].nodeValue == 'Success')
            {  
               mode = d.getElementsByTagName('Mode')[0].childNodes[0].nodeValue;
               bin_key = d.getElementsByTagName('BinKey')[0].childNodes[0].nodeValue;     
               if (mode == 'rename_bin')
               {  the_bin_name = d.getElementsByTagName('BinName')[0].childNodes[0].nodeValue;
                  bin_key = d.getElementsByTagName('BinKey')[0].childNodes[0].nodeValue;
                  bin_data[bin_key].bin_name = the_bin_name;
                  show_my_bins(true);
               }
               else if (mode == 'Create')
               {  
                  the_bin_name = d.getElementsByTagName('Bin')[0].childNodes[0].nodeValue;       
                  exists = d.getElementsByTagName('BinExisted')[0].childNodes[0].nodeValue; 
                  if (exists == 1)
                  {  showAlert('You already have a bin named \'' + the_bin_name + '\'');
                  }
                  else
                  {  c = new Object();
                     c.bin_key = bin_key;
                     c.bin_name = the_bin_name;
                     c.cues = new Array();

                     cue_nodes = d.getElementsByTagName('CueID');
                     for (i = 0; i < cue_nodes.length; i++)
                     {  c.cues.push(cue_nodes[i].childNodes[0].nodeValue);
                     }

                     bin_data[bin_key] = c;
                     jump = d.getElementsByTagName('JumpToBin')[0].childNodes[0].nodeValue; 
                     if (jump != 0)
                     {  show_bin(true, bin_key);
                     }
                     else
                     {  showTempAlert("Your cue has been added to the new bin '" + 
                           the_bin_name + "'", 2500);
                     }
                     update_cart_status_line();
                  }
               }
               else if (mode == 'Merge')
               {  
                  c = new Object();
                  c.bin_key = d.getElementsByTagName('MergedBinKey')[0].childNodes[0].nodeValue;
                  c.bin_name = d.getElementsByTagName('MergedBinName')[0].childNodes[0].nodeValue;
                  c.cues = new Array();

                  bin_key_nodes = d.getElementsByTagName('MergedBinKeyContents');
                  for (i = 0; i < bin_key_nodes.length; i++)
                  {  c.cues.push(bin_key_nodes[i].childNodes[0].nodeValue);
                  }
                  bin_data[c.bin_key] = c;
               // clean up old merged bins
                  del_bin_nodes = d.getElementsByTagName('DeletedBin');
                  for (i = 0; i < del_bin_nodes.length; i++)
                  {  nv =  del_bin_nodes[i].childNodes[0].nodeValue;
                     delete bin_data[nv];
                  }
                  show_my_bins(true);
               }
               else if (mode == 'Delete')
               {  
                  bin_key_nodes = d.getElementsByTagName('BinKey');
                  for (i = 0; i < bin_key_nodes.length; i++)
                  {  nv =  bin_key_nodes[i].childNodes[0].nodeValue;
                     delete bin_data[nv];
                  }
                  show_my_bins(true);
               }
               else if (mode == 'add_cue' || mode == 'remove_cue')
               {  
                  cue_nodes = d.getElementsByTagName('CueID');
                  cues = new Array();
                  for (i = 0; i < cue_nodes.length; i++)
                  {  cues.push(cue_nodes[i].childNodes[0].nodeValue);
                  }
                  
                  bin_data[bin_key].cues = cues;
                  jump = d.getElementsByTagName('JumpToBin')[0].childNodes[0].nodeValue; 
                  if (jump != 0)
                  {  show_bin(true, bin_key);
                  }
                  else
                  {  showTempAlert("Your cue has been added to the bin", 2500);
                  }
               }
            }
            else
            {  
               err = d.getElementsByTagName('Error')[0];
               err_string = '';
               if (err)
               {  err_string = err.childNodes[0].nodeValue;
               }
               showAlert('Sorry, something went wrong with your bin:  ' + 
                  err_string);
            }
         }
      }       
   }
}

function add_cue_to_bin(bin_key, cue_id)
{
   xml = "<\?xml version=\"1.0\"\?><BinRequest>";
   xml += "<Mode>add_cue</Mode>";
   xml += "<BinKey>" + xml_escape(bin_key) + "</BinKey>";
   xml += "<Cues>";

   xml += "<CueID>" + cue_id + "</CueID>";

   xml += "</Cues>";
   xml += "<JumpToBin>0</JumpToBin>";
   xml += "</BinRequest>";
   xml = "xml=" + escape(xml);

   ajax_bin_r.open("POST", "/bin_backend.php", true);
   
   ajax_bin_r.onreadystatechange = bin_request_callback;
   ajax_bin_r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   ajax_bin_r.send(xml);
}
   
function add_cart_cues_to_bin(bin_key)
{
   xml = "<\?xml version=\"1.0\"\?><BinRequest>";
   xml += "<Mode>add_cue</Mode>";
   xml += "<BinKey>" + xml_escape(bin_key) + "</BinKey>";
   xml += "<Cues>";

   for (j = 0; j < cart_order.length; j++)
   {  xml += "<CueID>" + cart_order[j] + "</CueID>";
   }

   xml += "</Cues>";
   xml += "</BinRequest>";
   xml = "xml=" + escape(xml);
   ajax_bin_r.open("POST", "/bin_backend.php", true);
   
   ajax_bin_r.onreadystatechange = bin_request_callback;
   ajax_bin_r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   ajax_bin_r.send(xml);
}
   
function remove_cues_from_bin(bin_key, cues_to_delete)
{
   xml = "<\?xml version=\"1.0\"\?><BinRequest>";
   xml += "<Mode>remove_cue</Mode>";
   xml += "<BinKey>" + xml_escape(bin_key) + "</BinKey>";
   xml += "<Cues>";

   for (j = 0; j < cues_to_delete.length; j++)
   {  
      xml += "<CueID>" + cues_to_delete[j] + "</CueID>";
   }

   xml += "</Cues>";
   xml += "</BinRequest>";
   xml = "xml=" + escape(xml);

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

function handleAddCartToBin()
{  
   el = document.getElementById("add_to_bin_picker");
   index = el.selectedIndex;
   if (index == 0)
   {  return;
   }
   else if (index == 1)
   {  makeNewBin(true, null); 
   }
   else
   {  add_cart_cues_to_bin(el.value);
   }
}

function makeNewBin(makeFromCart, add_one_cue_id)
{
   if (!makeFromCart && add_one_cue_id != null)
   {  showTextPrompt(makeNewBinSingleCueCallback, "Choose a name for your bin", "", 
         add_one_cue_id);
   }
   else
   {  showTextPrompt(makeNewBinCallback, "Choose a name for your bin", "", 
         makeFromCart);
   }
}

function makeNewBinSingleCueCallback(bin_name, cue_id)
{
   __makeNewBinCallback(bin_name, false, cue_id);
}

function makeNewBinCallback(bin_name, makeFromCart)
{
   __makeNewBinCallback(bin_name, makeFromCart, null);
}

function __makeNewBinCallback(bin_name, makeFromCart, add_one_cue_id)
{  
   if (!bin_name)
   {  return false;
   }
   xml = "<\?xml version=\"1.0\"\?><BinRequest>";
   xml += "<Mode>Create</Mode>";
   xml += "<Bin>" + xml_escape(bin_name) + "</Bin>";
   if (makeFromCart)
   {
      xml += "<Cues>";
      for (j = 0; j < cart_order.length; j++)
      {  xml += "<CueID>" + cart_order[j] + "</CueID>";
      }
      xml += "</Cues>";
   }
   else if (add_one_cue_id != null)
   {
      xml += "<Cues>";
      xml += "<CueID>" + add_one_cue_id + "</CueID>";
      xml += "</Cues>";
      xml += "<JumpToBin>0</JumpToBin>";
   }
   xml += "</BinRequest>";
   xml = "xml=" + escape(xml);

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

function handle_delete_bin()
{
   xml = "<\?xml version=\"1.0\"\?><BinRequest>";
   xml += "<Mode>Delete</Mode>";
   xml += "<BinKey>" + xml_escape(bin_key_now) + "</BinKey>";
   xml += "</BinRequest>";
   xml = "xml=" + escape(xml);

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

function handleEditBin()
{  
   el = document.getElementById("edit_bin_picker");
   index = el.selectedIndex;
   if (index == 0)
   {  return;
   }
   else if (index == 1)
   {  
      makeNewBin(false, null);
      el.selectedIndex = 0;
   }
   else
   {  
      show_bin(true, el.value);
   }
}

function clear_my_bins_table()
{
   table = document.getElementById("my_bins_table");
   row_count = table.rows.length;

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

function clear_bin_table()
{
   table = document.getElementById("bin_table");
   row_count = table.rows.length;

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

function handle_bin_uncheck_all()
{
   el = document.getElementById("uncheck_all");
   do_check = el.checked;

   els = document.getElementsByName("bin_checks");
   for (i = 0; i < els.length; i++)
   {
      cb = els[i];
      cb.checked = do_check;
   }
}

function handle_my_bins_uncheck_all()
{
   el = document.getElementById("my_bins_check_all");
   do_check = el.checked;

   els = document.getElementsByName("my_bins_checks");
   for (i = 0; i < els.length; i++)
   {
      cb = els[i];
      cb.checked = do_check;
   }
}

function handle_share_selected() 
{  
   els = document.getElementsByName("bin_checks");
   cues_to_download = new Array();
   for (i = 0; i < els.length; i++)
   {
      cb = els[i];
      if (cb.checked)
      {  cues_to_download.push(cb.value);
      }
   }

   if (cues_to_download.length <= 0)
   {  showAlert('You must have at least one cue selected to share');
      return;
   }

   show_share(true, cues_to_download);  
}

function handle_download_selected(share_mode, audio_mode_id) 
{  
   els = document.getElementsByName("bin_checks");
   cues_to_download = new Array();
   for (i = 0; i < els.length; i++)
   {
      cb = els[i];
      if (cb.checked)
      {  cues_to_download.push(cb.value);
      }
   }

   if (cues_to_download.length <= 0)
   {  showAlert('You must have at least one cue selected to start a download');
      return;
   }
   if (standalone)
   {  start_export(cues_to_download);
   }
   else
   {
      if (!share_mode) 
      {  show_order_summary(true, cues_to_download);
      }
      else
      {  start_downloads(audio_mode_id);
      }
   }
}

function handle_remove_selected(keep_checked)
{
   els = document.getElementsByName("bin_checks");
   cues_to_delete = new Array();
   for (i = 0; i < els.length; i++)
   {
      cb = els[i];
      if (cb.checked != keep_checked)
      {  cues_to_delete.push(cb.value);
      }
   }
   if (keep_checked)
   {  
      l = els.length - cues_to_delete.length;
      if (l == els.length)
      {  return;
      }
      if (doConfirm("Are you sure you want to keep only the " +
         (l == 1 ? "selected cue" : l + " selected cues") + " from this bin?"))
      {
         remove_cues_from_bin(bin_key_now, cues_to_delete);
      }
   }
   else
   {
      l = cues_to_delete.length;
      if (l == 0)
      {  return;
      }
      if (doConfirm("Are you sure you want to remove the " +
         (l == 1 ? "seleceted cue" : l + " selected cues") + " from this bin?"))
      {
         remove_cues_from_bin(bin_key_now, cues_to_delete);
      }
   }
}


function show_my_bins(show)
{  
   el = document.getElementById("my_bins_section");
   if (!el)
   {  return;
   }
   el.style.display = (show ? "block" : "none");
   showing_my_bins = show;

   if (show != true)
   {  return;
   }

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

   update_breadcrumb("MY_BINS", false);

   clear_my_bins_table();
   table = document.getElementById("my_bins_table");

   col = 0;
   row = table.insertRow(0);
   row.className = "result_title";
   cell = row.insertCell(col++);
   cell.className = "mainTextTableHeader";
   cell.innerHTML = 
      '<INPUT TYPE="CHECKBOX" UNCHECKED id="my_bins_check_all" onchange="handle_my_bins_uncheck_all();">' + 
      "&nbsp;&nbsp;<B>Bin Name</B>";

   cell = row.insertCell(col++);
   cell.className = "mainTextTableHeader";
   cell.width = 125;
   cell.innerHTML = '<B><CENTER># Cues in This Bin</CENTER></B>';


   i = 1;
   any_drawn = false;

   for (var a in bin_data)
   {
      any_drawn = true;
      this_bin = bin_data[a];
      row = table.insertRow(i);
      row.className = "result_" + (i++%2 ? "even" : "odd");  
      col = 0;
      cell = row.insertCell(col++);
      cell.className = "mainTextTable";
      cell.innerHTML = 
         '<INPUT TYPE="CHECKBOX" NAME="my_bins_checks" VALUE="'+ a + 
         '" UNCHECKED>' + 
         '&nbsp;&nbsp;' + '<A class="mainTextTable" href="javascript:show_bin(true, ' + a + ')">' +
         this_bin.bin_name + '</A>';

      cell = row.insertCell(col++);
      cell.className = "mainTextTable";
      cell.innerHTML = '<center>' + this_bin.cues.length + '</center>';
   } 

   if (!any_drawn)
   {  col = 0;
      row = table.insertRow(i);
      row.className = "result_even";  
      cell = row.insertCell(col++);
      cell.className = "mainTextTable";
      cell.colSpan = "2";
      cell.innerHTML = "<center>(You currently have no bins)</center>";
   }
   update_cart_status_line();
}

function handle_rename_bin()
{
   els = document.getElementsByName("my_bins_checks");
   which_cb = null;
   for (i = 0; i < els.length; i++)
   {  cb = els[i];
      if (cb.checked)
      {  if (which_cb != null)
         {  showAlert('Please select just one bin to rename');
            return;
         }
         else
         {  which_cb = cb;
         }  
      }
   }
   if (which_cb == null)
   {  showAlert("Please select a bin to rename");
      return;
   }
   else
   {  
      showTextPrompt(rename_bin_callback, 
         "Choose a new name for this bin", "", which_cb.value);
   }
}

function rename_bin_callback(new_name_in, bin_key)
{   
   new_name = trim(new_name_in);
   if (!new_name || !new_name_in)
   {  showAlert("Please enter in a bin name");
      return;
   }
   for (var a in bin_data)
   {  if (bin_data[a].bin_name == new_name)
      {  showAlert("You already have a bin by that name");
         return;
      }
   }

   xml = "<\?xml version=\"1.0\"\?><BinRequest>";
   xml += "<Mode>rename_bin</Mode>";
   xml += "<BinKey>" + xml_escape(bin_key) + "</BinKey>";
   xml += "<BinName>" + new_name + "</BinName>";
   xml += "</BinRequest>";
   xml = "xml=" + escape(xml);

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


function handle_merge_bins()
{
   els = document.getElementsByName("my_bins_checks");
   bins_to_merge = new Array();

   for (i = 0; i < els.length; i++)
   {  cb = els[i];
      if (cb.checked)
      {  bins_to_merge.push(cb.value);
      }
   }
   merge_count = bins_to_merge.length;
   if (merge_count < 2)
   {  showAlert("Please select at least 2 bins to merge");
      return;
   }
   else
   {  
      showTextPrompt(handle_merge_bins_callback,
         "Enter the name of an existing bin, " +
         "or choose the name of a new bin to merge the selected bins into.",
         "", bins_to_merge);
   }
}

// IE chokes on 'bin_name'??
function handle_merge_bins_callback(the_bin_in, bins_to_merge)
{
   if (the_bin_in == null)
   {  return;
   }
   _bin_name = trim(the_bin_in);

   if (!_bin_name)
   {  showAlert('A bin name is requred');
   }
   else if (_bin_name == null)
   {  return;
   }
   else
   {  
      xml = "<\?xml version=\"1.0\"\?><BinRequest>";
      xml += "<Mode>Merge</Mode>";
      xml += "<MergedBinName>" + _bin_name + "</MergedBinName>";
      for (i = 0; i < bins_to_merge.length; i++)
      {  xml += "<BinKey>" + xml_escape(bins_to_merge[i]) + "</BinKey>";
      }
      xml += "</BinRequest>";
      xml = "xml=" + escape(xml);

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

function handle_delete_bin_my_bins()
{
   els = document.getElementsByName("my_bins_checks");
   bins_to_delete = new Array();

   for (i = 0; i < els.length; i++)
   {  cb = els[i];
      if (cb.checked)
      {  bins_to_delete.push(cb.value);
      }
   }
   del_count = bins_to_delete.length;
   if (del_count == 0)
   {  showAlert("Please select bin(s) to delete");
      return;
   }
   else
   {  
      yes = doConfirm("Are you sure you want to delete the selected " + 
         (del_count == 1 ? "bin" : del_count + " bins") + "?");

      if (yes)
      {
         xml = "<\?xml version=\"1.0\"\?><BinRequest>";
         xml += "<Mode>Delete</Mode>";
         for (i = 0; i < del_count; i++)
         {
            xml += "<BinKey>" + xml_escape(bins_to_delete[i]) + "</BinKey>";
         }
         xml += "</BinRequest>";
         xml = "xml=" + escape(xml);

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

function show_bin(show, bin_key)
{  _show_bin(show, bin_key, false);
}

function show_shared_bin(show, bin_key)
{  _show_bin(show, bin_key, true);
}

function _show_bin(show, bin_key, share_mode)
{  
   el = document.getElementById("bin_section");
   el.style.display = (show ? "block" : "none");
   showing_bin = show;

   if (show != true)
   {  return;
   }
   update_breadcrumb("BIN", false);

   if (!share_mode)
   {
      show_cart(false);
      show_my_bins(false); 
      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_data_find(false);
      show_new_releases(false);
      show_cue_sheets(false);
   }

   clear_preview();
   bin_key_now = bin_key;

   update_cart_status_line();

   if (bin_key != 0 || share_mode)
   {  el = document.getElementById("bin_name");
      el.innerHTML = bin_data[bin_key].bin_name;
      clear_bin_table();
      table = document.getElementById("bin_table");

      col = 0;
      row = table.insertRow(0);
      row.className = "result_title";
      cell = row.insertCell(col++);
      cell.className = "mainTextTableHeader";
      cell.innerHTML = 
         '<INPUT TYPE="CHECKBOX" CHECKED id="uncheck_all" onchange="handle_bin_uncheck_all();">' + 
         "&nbsp;&nbsp;<B>Cue Code</B>";

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

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

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

      cell = row.insertCell(col++);
      cell.innerHTML = "";

      i = 1;
      num_cues_in_bin = bin_data[bin_key].cues.length;
      if (num_cues_in_bin < 1)
      {  col = 0;
         row = table.insertRow(i);
         row.className = "result_even";  
         cell = row.insertCell(col++);
         cell.innerHTML = "You have no cues in this bin";
      }
      else
      {
         for (j = 0; j < num_cues_in_bin ; j++)
         {  cue_key = bin_data[bin_key].cues[j];

            c = all_cue_data[cue_key]; 
            if (!c)
            {  
               continue;
            }
            row = table.insertRow(i);
            row.className = "result_" + (i%2 ? "even" : "odd");  
            col = 0;
            cell = row.insertCell(col++);
            cell.width = 125;
            cell.style.padding = "1px 5px 1px 0px";
            cell.className = "mainTextTable";
            cell.innerHTML = 
               '<INPUT TYPE="CHECKBOX" NAME="bin_checks" VALUE="'+ cue_key +'" CHECKED>' + 
               '&nbsp;&nbsp;' + c.cue_code;


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

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

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

            cell = row.insertCell(col++);
            out = "<A HREF=\"javascript:play_preview_mini(" + cue_key + 
               ");\"><img src=\"/img/speaker_" + 
               (domain_info.white_on_black_results_bin ? "light" : "dark") +".gif\"" +
               " style=\"border-style:none;\"></A>&nbsp;&nbsp;";
            cell.innerHTML = out;
            if (!share_mode)
            {  
               popup_control = document.createElement('img');
               button_id = "bin_button_" + cue_key;
               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.cue_id = cue_key;
               popup_control.onclick = show_gear_menu;
               cell.appendChild(popup_control);
            }
            i++;
         }
      }
   }
}


