﻿function AjaxDropDownTree(containerID, serviceUrl, maxSelectionCount, displayTextPattern, infoTextPattern, initialCheckedValues) {
    function toggle() {
        if (!isLoaded()) {
            load();
        }
        jQuery('#' + containerID + ' .treepanel').toggle();
        jQuery('#' + containerID + ' .hackforie6').toggle();
    }
    function isLoaded() {
        return (jQuery('#' + containerID + ' .treecontainer').children().length > 0);
    }
    function load() {
        showLoading();
        jQuery.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            url: serviceUrl,
            dataType: "json",
            success: bind
        });
    }
    function bind(data, textStatus) {
        inputName = containerID + '_input';
        jQuery('#' + containerID + ' .treecontainer').html(TreeGenerator(data, inputName, getInitialCheckedValues()).GetTreeHtml());
        jQuery('#' + containerID).find('input:checkbox').click(checkboxClick);
        jQuery('#' + containerID + ' .treecontainer').find('img').click(toggleSubNodes);
        jQuery('#' + containerID + ' .treecontainer').show();

        setCheckedValues(getInitialCheckedValues());
        hideLoading();
    }
    function checkboxClick(sender, args) {
        if (this.checked) {
            jQuery(this).parent().find('input:checkbox').attr('checked', false);
            if (jQuery(this).parent().parent().attr('class') != 'treecontainer') {
                jQuery(this).parent().parent().find('input:checkbox:first').attr('checked', false);
            }
            jQuery(this).attr('checked', true);
        }
        showCheckedCount();
    }
    function showCheckedCount() {
        checkedCount = getCheckedCount();
        if (checkedCount >= maxSelectionCount) {
            jQuery('#' + containerID).find('input:checkbox').not(':checked').attr('disabled', true);
        }
        else {
            jQuery('#' + containerID).find('input:checkbox:disabled').removeAttr('disabled');
        }
        
        var displayText = infoTextPattern.replace('{0}', maxSelectionCount);
        if (checkedCount > 0) {
            displayText = displayTextPattern.replace('{0}', checkedCount)
        }    
        jQuery('#' + containerID + ' .displaytext').html(displayText);
    }
    function setCheckedValues(checkedValues) {
        inputName = containerID + '_input';
        for (var i = 0; i < checkedValues.length; ++i) {
            jQuery("input[name='" + inputName + "'][value=" + checkedValues[i] + "]").attr('checked', true);
        }
        jQuery('#' + containerID + ' .treecontainer div > div').find('input:checked').parent().parent().find('div').toggle();
        jQuery('#' + containerID + ' .treecontainer div > div').find('input:checked').parent().parent().find('img').attr('src', ajaxDropDownTreeImageRootFolder + 'minus.gif')
    }
    function getCheckedValues() {
        function concat() {
            checkedValues[checkedValues.length] = this.value;
        }
        if (!isLoaded()) {
            return initialCheckedValues;
        }
        else {
            var checkedValues = new Array();
            jQuery('#' + containerID).find('input:checkbox:checked').each(concat);
            return checkedValues.join(',');
        }
    }
    //bu fonksiyon test için
    function alertGetCheckedValues() {
        alert(getCheckedValues());
    }
    function getCheckedCount() {
        if (!isLoaded()) {
            return getInitialCheckedValues().length;
        }
        else {
            return jQuery('#' + containerID).find('input:checkbox:checked').length;
        }
    }
    function showLoading() {
        jQuery('#' + containerID + ' .treeloading').show();
    }
    function hideLoading() {
        jQuery('#' + containerID + ' .treeloading').hide();
    }
    function mouseUpFired(e) {
        if (jQuery(e.target).parents('#' + containerID).length == 0 &&
                    jQuery('#' + containerID + ' .treepanel').is(':visible')) {
            toggle();
        }
    }
    function deselectAll() {
        jQuery('#' + containerID).find('input:checkbox:checked').attr('checked', false);
        showCheckedCount();
    }
    function getInitialCheckedValues() {
        return initialCheckedValues.length != 0 ? initialCheckedValues.split(',') : new Array();
    }
    function toggleSubNodes(sender, args) {
        jQuery(this).parent().find('div').toggle();
        //set image
        if (jQuery(this).attr('src').indexOf('plus') >= 0) {
            jQuery(this).attr('src', ajaxDropDownTreeImageRootFolder + 'minus.gif');
        }
        else {
            jQuery(this).attr('src', ajaxDropDownTreeImageRootFolder + 'plus.gif');
        }
    }

    jQuery('#' + containerID + ' .displaypanel').click(toggle);
    jQuery('#' + containerID + ' .closebutton').click(toggle);
    jQuery('#' + containerID + ' .deselectbutton').click(deselectAll);
    jQuery(document).mouseup(mouseUpFired);
    showCheckedCount();

    this.GetCheckedValues = getCheckedValues;
    this.SetCheckedValues = setCheckedValues;
    return this;
}

function TreeGenerator(nodes, inputName, selectedValues) {
    function getTreeHtml() {
        return createTree();
    }
    function createTree() {
        var result = '';
        for (var i = 0; i < nodes.length; ++i) {
            if (nodes[i].ParentID == null) {
                result += generateNode(nodes[i].ID, nodes[i].Name, 0);
            }
        }
        return result;
    }
    function generateNode(value, text, depth) {
        var result = '';

        var subNodes = '';
        var subNodeCount = 0;
        for (var i = 0; i < nodes.length; ++i) {
            if (nodes[i].ParentID == value) {
                subNodes += generateNode(nodes[i].ID, nodes[i].Name, depth+1);
                subNodeCount++;
            }
        }
        if (subNodeCount > 0) {
            result += '<div style="padding-left:5px;">';
            result += '<img src="' + ajaxDropDownTreeImageRootFolder + 'plus.gif" border="0"/>'
        }
        else {
            if (depth == 0) {
                result += '<div style="padding-left:18px;">';
            }
            else {
                result += '<div style="padding-left:30px;display:none;">';
            }
            
        }
        result += createElement(value, text);
        result += subNodes;
        result += '</div>';
        return result;
    }
    function createElement(value, text) {
        result = '<input name=' + inputName + ' type="checkbox" value="' + value + '"/>';
        result += '<span>' + text + '</span>';
        return result;
    }
    this.GetTreeHtml = getTreeHtml;
    return this;
}