function handleError(msg, url, line)
{
    alert("Message:  " + msg + "\nURL:  " + url + "\nLine:  " + line);
}
var lib = [];
var sortedColumn = 1;
onError=handleError;

var searchColumn = -2;
var searchFilter = "";

function search()
{
    searchColumn = $('searchColumn').value;
    searchFilter = $('searchFilter').value;
    populateLibraryTable();
}

function showAll()
{
    searchColumn = -2;
    searchFilter = "";
    populateLibraryTable();
}

function getURLParameter(name)
{  
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");  
    var regexS = "[\\?&]"+name+"=([^&#]*)";  var 
    regex = new RegExp( regexS );  
    var results = regex.exec( window.location.href );  
    if( results == null )
        return null;  
    else
        return decodeURI(results[1]);
}

function parseURL()
{
    var filterParam = getURLParameter("filter");
    var columnParam = getURLParameter("searchColumn");
    
    if (filterParam != null && columnParam != null)
    {
        searchFilter = filterParam;
        $('searchFilter').value = searchFilter;
        
        searchColumn = columnParam;  
        $('searchColumn').value = searchColumn;            
    }
}

function matchesSearch(row)
{
    if (searchFilter == "")
        return true;
        
    var lowercaseSearchFilter = searchFilter.toLowerCase();

    var startCol = 0;
    var lastCol = lib[0].length - 1;
    if (searchColumn >= 0)
    {
        startCol = searchColumn;
        lastCol = searchColumn;
    }
    for (var i = startCol; i <= lastCol; i++) {
        var s = lib[row][i];
        s = s.toLowerCase();
        if (s.match(lowercaseSearchFilter) != null) {
            return true;
        }
    }
    return false;
}

function updateSearchLink()
{
    var url = location.href.match(/[^?]*/);
    url = url + "?filter=" + encodeURI(searchFilter) + "&searchColumn=" + encodeURI(searchColumn);
    if (searchFilter != "")
    {
        $('searchLink').update(url);
        $('searchLink').href = url;
    }
}

function doPopulateLibraryTable()
{
    while ($('library').rows.length > 1)
    {
        $('library').deleteRow(1);
    }

    var matchsearch = 0;
    for (var k = 0; k < lib.length; k++) {
        if (matchesSearch(k)) {
            matchsearch = 1;
            var row = $('library').insertRow( -1 );
            for (var l = 0; l < lib[k].length; l++) {
                var cell = row.insertCell(-1);
                cell.innerHTML = lib[k][l];
            }
        }
    }
    $('searchSection').show();
    if (searchFilter == "")
    {
        $("Show All").hide();
        $('searchLinkDiv').hide();
    }
    else 
    {
        $("Show All").show();
        updateSearchLink();
        $('searchLinkDiv').show();
    }
    $('status').hide();
    if (matchsearch == 0)
    {
        $('noresults').show();
    }
    else
    {
        $('libraryDiv').show();
        $('noresults').hide();
    }
    document.body.style.cursor = 'default';
}

function populateLibraryTable()
{
    document.body.style.cursor = 'wait';
    $('status').show();
    $('libraryDiv').hide();
    $('searchSection').hide();
    $('noresults').hide();
    setTimeout(doPopulateLibraryTable, 50);
}

function compareEntries(a,b)
{
    if (sortedColumn == 0)
    {
        if (a[sortedColumn].substring(0,1) < b[sortedColumn].substring(0,1))
            return -1;
        if (a[sortedColumn].substring(0,1) > b[sortedColumn].substring(0,1))
            return 1;
        return (a[sortedColumn].substring(1) - b[sortedColumn].substring(1))
    }
    if (a[sortedColumn] < b[sortedColumn])
        return -1;
    if (a[sortedColumn] > b[sortedColumn])
        return 1;
    return 0;
}

function doLoadMessage()
{
    new Ajax.Request( 'ACWEMessage.txt',
    {
        method: 'get',
        onSuccess: function( transport ) 
        {
            $('message').update(transport.responseText);
        }
    } );
}

function doLoadTable()
{
    new Ajax.Request( 'ACWELibrary.xml', { 
      method: 'get',
      onFailure: function( transport ) {
          $('status').hide();
          $('failed').update("There was an error loading the library: " + transport.status + " " + transport.statusText);
          $('failed').show();
          document.body.style.cursor = 'default';
      },
      onSuccess: function( transport ) {
         try {      
            var musicTags = transport.responseXML.getElementsByTagName( 'acwemusic' );
            lib = new Array(musicTags.length);
            for( var i = 0; i < musicTags.length; i++ ) {
              var tags = ['catalognumber', 'composition', 'composer', 'arranger', 'publisher', 'genre', 'datelastperformed', 'missingparts', 'notes'];

              var rowData = new Array(tags.length);
              
              for (var j = 0; j < tags.length; j++) {
                  var child = musicTags[i].getElementsByTagName(tags[j])[0].firstChild;
                  var str;
                  if (child)
                    str = child.nodeValue;
                  else
                    str = "&nbsp;";
                  str = str.replace(/^\s+|\s+$/g,""); // trim whitespace
                  rowData[j] = str.replace(/\n/g, "<br>");
              }
              lib[i] = rowData;
            }
            
            lib.sort(compareEntries);
            parseURL();
            populateLibraryTable();
       }
           catch (e)
       {
            alert("Error: " + e.name + "\nMessage: " + e.message);
       }
       }
    } );
}

function loadLibrary()
{   
    document.body.style.cursor = 'wait';
    setTimeout(doLoadMessage, 50);
    setTimeout(doLoadTable, 50);
}


function columnClicked(column)
{
    if (column != sortedColumn)
    {
        var oldCell = $('library').rows[0].cells[sortedColumn];
        var newCell = $('library').rows[0].cells[column];
        
        oldCell.setAttribute('class','colHeader');
        oldCell.setAttribute('className','colHeader');
 
        newCell.setAttribute('class','sortedColHeader');
        newCell.setAttribute('className','sortedColHeader');

        sortedColumn = column;
        
        lib.sort(compareEntries);
        populateLibraryTable();
    }
}

