function emptyLocker (e)
{
    var $answer = confirm ("This will permanently empty your locker.  Are you sure?");
    //console.log ($answer);
    if ($answer !== true) {
        Event.stop (e);
    }
}

var loadDetailHtml = {
    onLoadSuccess : function (e) {
        //console.log ('success');
        //console.log (e);
        var params = e.request.parameters;
        var id = '' + params.type + params[params.type + '_id'];
        var targetElement = $(id);
        //console.log (id);
        //console.log (targetElement);
        targetElement.writeAttribute ('loaded', '1');
        // Add the children.
        var targetElementHtml = targetElement.innerHTML;
        targetElementHtml += e.responseJSON;
        targetElement.innerHTML = targetElementHtml;
    },
    onLoadFailure : function (e) {
        // console.log (e);
        var params = e.request.parameters;
        var id = '' + params.type + params[params.type + '_id'];
        var targetElement = $(id);
        targetElement.writeAttribute ('loaded', '1');
        var targetElementHtml = targetElement.innerHTML;
        targetElementHtml += "<br /><i>Unable to load list</i><br>";
        targetElement.innerHTML = targetElementHtml;
    },
    process : function (e) {
        var parentCell = Event.findElement (e, 'td');
        if (parentCell && parentCell.readAttribute ('busy') == '1') {
            return;
        }
        parentCell.writeAttribute ('busy', 1);
        if (parentCell && parentCell.readAttribute ('loaded')) {
            if (parentCell.readAttribute ('loaded') == '1') {
                return;
            }
            var type = parentCell.readAttribute ('type');
            var id = parentCell.readAttribute ('value');
            var callbackUrl = '/locker/cb/tuneupspace/';
            switch (type) {
                case 'artist' : callbackUrl += 'album'; break;
                case 'album' : callbackUrl += 'track'; break;
                default : 
                    return;
            }
            var typeIdName = type + '_id';
            var params = {};
            params['type'] = type;
            params[type + '_id'] = id;
            // Load child request
	        var requestParams = {
	            method: 'get',
	            parameters: params,
	            onComplete: this.onLoadSuccess,
	            onFailure: this.onLoadFailure,
	            evalJSON: 'force'
	        };
	        var ajaxRequest = new Ajax.Request (callbackUrl, requestParams);
        }
    }
}

var loadArtistHtml = {
    elementId : 'lockerTree',
    callbackUrl : '/locker/cb/tuneupspace/artist',
    onLoadSuccess : function (e) {
        var element = $(loadArtistHtml.elementId);
        // console.info ('onLoadSuccess');
        // console.log (e);
        if (e.responseJSON) {
            element.innerHTML = e.responseJSON;
            // Set up the watch for clicks
            // Event.observe (element, 'click', loadDetailHtml.process.bindAsEventListener(loadDetailHtml));
        }
    }, 
    onLoadFailure : function (e) {
        // console.info ('onLoadFailure');
        // console.log (e);
        var element = $(loadArtistHtml.elementId);
        element.innerHTML = 'Unable to load Artist List.';
    },
    process : function () {
        var requestParams = {
            method: 'get',
            parameters: '',
            onComplete: this.onLoadSuccess,
            onFailure: this.onLoadFailure,
            evalJSON: 'force'
        };
        var ajaxRequest = new Ajax.Request (this.callbackUrl, requestParams);
    }
}
 
var totalCounter = {
    updateTotals : function (artistCount, albumCount, totalSize) {
        var artistCountElement = $('selectedArtists');
        var albumCountElement = $('selectedAlbums');
        var sizeElement = $('selectedSpace');
        sizeElement.innerHTML = parseInt(totalSize);
        artistCountElement.innerHTML = artistCount;
        albumCountElement.innerHTML = albumCount;
    },
    addArtist : function (size) {
        var countElement = $('selectedArtists');
        var sizeElement = $('selectedSpace');
        var count = parseInt (countElement.innerHTML);
        var currentSize = parseInt (sizeElement.innerHTML);
        count++;
        currentSize += parseInt(size);
        sizeElement.innerHTML = currentSize;
        countElement.innerHTML = count;
    },
    removeArtist : function (size) {
        var countElement = $('selectedArtists');
        var sizeElement = $('selectedSpace');
        var count = parseInt (countElement.innerHTML);
        var currentSize = parseInt (sizeElement.innerHTML);
        count--;
        currentSize -= parseInt(size);
        sizeElement.innerHTML = currentSize;
        countElement.innerHTML = count;
    },
    addAlbum : function (size) {
        var countElement = $('selectedAlbums');
        var sizeElement = $('selectedSpace');
        var count = parseInt (countElement.innerHTML);
        var currentSize = parseInt (sizeElement.innerHTML);
        count++;
        currentSize += parseInt(size);
        sizeElement.innerHTML = currentSize;
        countElement.innerHTML = count;
    
    },
    removeAlbum : function (size) {
        var countElement = $('selectedAlbums');
        var sizeElement = $('selectedSpace');
        var count = parseInt (countElement.innerHTML);
        var currentSize = parseInt (sizeElement.innerHTML);
        count--;
        currentSize -= parseInt(size);
        sizeElement.innerHTML = currentSize;
        countElement.innerHTML = count;
    }
}

/*
function updateCheckBox (element) {
    // Update the totals
    if (element.tagName.toLowerCase() !== 'input') { return; }
    
    var size = parseInt (element.readAttribute ('mp3_size')) / 1024;
    var targetCount = element.readAttribute('name');
    if (element.checked) {
        console.log ('checked');
        switch (targetCount) {
            case 'artist[]' : totalCounter.addArtist (size); break;
            case 'album[]'  : totalCounter.addAlbum (size); break;
        }
    } else {
        console.log ('unchecked');
        switch (targetCount) {
            case 'artist[]' : totalCounter.removeArtist (size); break;
            case 'album[]'  : totalCounter.removeAlbum (size); break;
        }
    }
}
*/

function recalculateTotals () {
    var inputList = $('lockerTree').select ('input');
    var totalSize = 0;
    var totalAlbums = 0;
    var totalArtists = 0;
    for (var i=0, j=inputList.length; i<j; i++) {
        var element = inputList[i];
        if (!element.checked) { continue; } 
        var targetCount = element.readAttribute('name');
        var isArtist = (targetCount == 'artist[]');
        var isAlbum = (targetCount == 'album[]');
        if (isArtist) totalArtists++;
        if (isAlbum) totalAlbums++;
        // Update size if has no children nodes
        if ((isArtist && !(element.up('tr').down('table')))
            || (isAlbum)) {
            totalSize += parseInt (element.readAttribute ('mp3_size')) / 1024 / 1024;
        }
    }
    totalCounter.updateTotals (totalArtists, totalAlbums, totalSize);
}


function toggleCheckBox (e) {
    // Update the totals
    var element = Event.element (e);
    // updateCheckBox(element);
    
    // Propagation of checkboxes
    var targetCount = element.readAttribute('name');
    var isArtist = (targetCount == 'artist[]');
    var isAlbum = (targetCount == 'album[]');
    var newState = element.checked;
    if (isArtist) {
        // Propagate down
        var inputList = element.up('tr').select('input');
        for (var i=0, j=inputList.length; i<j; i++) {
            if (inputList[i].checked !== newState) {
                inputList[i].checked = newState;
                //updateCheckBox(inputList[i]);
            }
        }
    } else if (isAlbum) {
        // Propagate state up as required
        // Case 1: Unchecked
        if (!newState) {
            var input = element.up('tr').up('tr').down('input');
            if (input.checked !== newState) { 
                input.checked = newState;
                //updateCheckBox(input);
            }
        // Case 2: Subtree Checked
        } else {
            var inputList = element.up('table').select('input');
            var hasMismatch = false;
            for (var i=0, j=inputList.length; i<j; i++) {
                if (inputList[i].checked !== newState) {
                    hasMismatch = true;
                    break;
                }
            }
            
            // If the subtree is consistant, propagate to artist
            if (!hasMismatch) {
                var target = element.up('tr').up('tr').down('input');
                if (target.checked !== newState) {
                    target.checked = newState;
                    //updateCheckBox(target);
                }
            }
        }
    }
    recalculateTotals();
}


function submitForm (e) {
    Event.stop(e);
    var form = $('deleteTrackForm');
    form.submit();
}


function windowLoad () {
    Event.observe ($('emptyLockerLink'), 'click', emptyLocker);
    loadArtistHtml.process();
    Event.observe ($('lockerTree'), 'click', toggleCheckBox);
    Event.observe ($('deleteTracksButton'), 'click', submitForm);
}

Event.observe (window, 'load', windowLoad);


