﻿(function ($) {
    $.fn.jFinder = function (options) {
        var options = $.extend({}, $.fn.jFinder.defaults, options);

        function addButton(container, button) {
            var html = "<a href='javascript:void(0);' id='button-" + button.id + "' class='button'><span>" + button.name + "</span></a>";

            $('.buttons .' + button.position, container).append(html);
            $('#button-' + button.id, container).click(function () {
                if ($.isFunction(button.onClick)) {
                    button.onClick.call(this, $('#button-' + button.id, container));
                }
            });
        }

        function addFilePreview(container, fileId) {
            var data = getDataByFileId(options.data, fileId);
            var folders = $('.finder .folders', container);

            folders.append(getFilePreview(data));
            resizeFolders(container);
        }

        function addFolderLevel(container, folderId) {
            var data = getDataByFolderId(options.data, folderId);
            var folders = $('.finder .folders', container);

            folders.append(getFolderList(data));
            resizeFolders(container);

            $('.folder li', container).click(itemClick);

            if ($.isFunction(options.onDblClick)) {
                $('.folder li', container).dblclick(options.onDblClick);
            } else {
                $('.folder li', container).dblclick(itemDblClick);
            }
        }

        function buildFinderContainer() {
            var html = "<div class='title'><div class='folderTitle'><span>/</span></div>";

            if (options.buttons != null) {
                html += "<div class='buttons'><div class='right'></div><div class='left'></div><div class='center'></div><div class='clear'></div></div>";
            }

            html += "</div>";
            html += "<div class='finder'><div class='folders'></div></div>";

            return html;
        }

        function changeSelectedStates(item) {
            $(item).closest('.jFinder').find('.topSelected').removeClass('topSelected').addClass('selected');
            $(item).siblings().removeClass('selected');
            $(item).addClass('topSelected');
        }

        function createMenu(container) {
            for (var buttonKey in options.buttons) {
                var button = options.buttons[buttonKey];
                button.id = buttonKey;

                addButton(container, button);
            }
        }

        function downloadFile(fileId) {
		   //console.log('ping');
            var data = getDataByFileId(options.data, fileId);
            window.open(data.FilePath, '_blank');					
        }

        function getFilePreview(data) {
            var html = "<div id='file-" + data.FileId + "' class='file'>";

            html += "<div class='fileLine'>&nbsp;</div>";
            html += getFileInfoHtml("Name", data.Name);
            html += getFileInfoHtml("Description", data.Description);
            html += getFileInfoHtml("Date", getShortDateString(data.CreatedDate));
            html += "<div class='fileLine'>&nbsp;</div>";
            html += "<div class=\"fileLine\"><a href=\"" + data.FilePath + "\" target=\"_blank\" class=\"downloadButton\" onClick=\"javascript: _gaq.push(['_trackPageview', '"+ data.Name +"']);\">Download file...</a><div>";

            html += "</div>";

            return html;
        }

        function getFolderList(data) {
            var html = "<div id='folder-" + data.FolderId + "' class='folder'><ul>";

            $.each(data.Folders, function (index, value) {
                html += "<li id='folderId-" + value.FolderId + "' class='folderItem'>" + value.Name + "</li>";
            });

            $.each(data.Files, function (index, value) {
                html += "<li id='fileId-" + value.FileId + "' class='fileItem'>" + value.Name + "</li>";
            });

            html += "</ul></div>";

            return html;
        }

        function itemClick() {
            var container = $(this).closest('.jFinder');
            var id = null;

            if ($(this).hasClass('folderItem')) {
                id = parseInt($(this).attr('id').toString().replace("folderId-", ""));

                removeFoldersBeforeLevel(container, this);
                addFolderLevel(container, id);

                setTitle(container, $(this).text());
            } else if ($(this).hasClass('fileItem')) {
                id = parseInt($(this).attr('id').toString().replace("fileId-", ""));

                removeFoldersBeforeLevel(container, this);
                addFilePreview(container, id);

                var titleElements = $(this).closest('.folder').prev('.folder').find('li.selected, li.topSelected');
                var title = "";

                if (titleElements.length > 0) {
                    $(titleElements).text();
                } else {
                    title = "/";
                }

                setTitle(container, title);
            }

            changeSelectedStates(this);
        }

        function itemDblClick() {
            if ($(this).hasClass('fileItem')) {
                var id = parseInt($(this).attr('id').toString().replace("fileId-", ""));

                downloadFile(id);
            }
        }

        function resizeFolders(container) {
            var width = options.columnWidth * $('.folder, .file', container).length;
            var newWidth = width;

            $('.folders, .folder, .file', container).height(options.height - 18);

            $('.finder', container).width(options.width);
            $('.folder, .file', container).width(options.columnWidth);
            $('.folders', container).width(newWidth);

            $('.finder', container).stop().scrollTo($('.folder:last', container), 100);
        }

        return this.each(function () {
            $(this).addClass('jFinder');
            $(this).width(options.width);
            $(this).html(buildFinderContainer());

            createMenu(this);
            addFolderLevel(this, null);
            resizeFolders(this);
        });
    };

    // ################################################################################
    // DEFAULTS

    $.fn.jFinder.defaults = {
        data: null,
        buttons: null,
        columnWidth: 200,
        height: 300,
        width: 600,
        onDblClick: null
    };

    // ################################################################################
    // PRIVATE FUNCTIONS

    function getDataByFolderId(data, folderId) {
        if (data.FolderId == folderId)
            return data;

        for (var folderKey in data.Folders) {
            var folder = data.Folders[folderKey];
            var retVal = getDataByFolderId(folder, folderId);

            if (retVal != null)
                return retVal;
        }

        return null;
    }

    function getDataByFileId(data, fileId) {
        for (var fileKey in data.Files) {
            var file = data.Files[fileKey];

            if (file.FileId == fileId)
                return file;
        }

        for (var folderKey in data.Folders) {
            var folder = data.Folders[folderKey];
            var retVal = getDataByFileId(folder, fileId);

            if (retVal != null)
                return retVal;
        }

        return null;
    }

    function getFileInfoHtml(label, info) {
        return "<div class='fileLine'><div class='label'>" + label + "&nbsp;&nbsp;</div><div class='info'>" + info + "</div></div>";
    }

    function getShortDateString(dateString) {
        if (dateString == null)
            return "-";

        var date = new Date(dateString);

        return (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear();
    }

    function removeFoldersBeforeLevel(container, item) {
        $(item, container).closest('.folder').nextAll().remove();
        $('.file', container).remove();
    }

    function setTitle(container, title) {
        $('.title .folderTitle', container).html("<span>" + title + "</span>");
    }
})(jQuery);
