﻿/// <reference path="jquery-1.4.2.js" />

var Ozytis = {};

jQuery.fn.center = function () {
    this.css("position", "absolute");
    this.css("top", ($(window).height() - this.height()) / 2 + "px");
    this.css("left", ($(window).width() - this.width()) / 2 + $(window).scrollLeft() + "px");
    return this;
}

Ozytis.update = function (targetId, url, onComplete) {
    var param = "X-Requested-With=XMLHttpRequest";

    if ((url + "").indexOf("?") < 0) {
        url += "?" + param;
    }
    else {
        url += "&" + param;
    }
    $(targetId).html("Chargement en cours...");
    $(targetId).load(url, null, onComplete);
}

Ozytis.updateAllDocument = function (url) {
    document.location = url;
}

Ozytis.conditionalUpdate = function (successUpdateTargetId, failureUpdateTargetId, Url) {
    //todo: complete
}

function formatCurrency(num) {
    num = num.toString().replace(/\$|\,/g, '');
    if (isNaN(num)) {
        num = "0";
    }
    sign = (num == (num = Math.abs(num)));
    num = Math.floor(num * 100 + 0.50000000001);
    cents = num % 100;
    num = Math.floor(num / 100).toString();
    if (cents < 10) {
        cents = "0" + cents;
    }
    for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
        num = num.substring(0, num.length - (4 * i + 3)) + ',' + num.substring(num.length - (4 * i + 3));
    }
    return (((sign) ? '' : '-') + num + ',' + cents);
}


function refresh() {
    window.location.reload(true);
}

function process(data, summaryId, partialId) {
    var obj = data;
    if (data.get_response != null) {
        obj = data.get_response().get_object();
    }

    if (obj.Success) {
        if (obj.ReloadUrl == null) {
            refresh();
        }
        else {
            if (obj.ReloadPartial) {
                $(partialId).load(obj.ReloadUrl);
            }
            else {
                document.location = obj.ReloadUrl;
            }
        }
    }
    else {
        if (summaryId == null) {
            alert(obj.Message);
        }
        else {
            var msgContainer = $(summaryId);
            msgContainer.addClass("error");
            msgContainer.html("");
            var msgUl = $("<ul></ul>");
            $(obj.Messages).each(function () {
                msgUl.append($("<li>" + this + "</li>"));
            });
            msgContainer.append(msgUl);
        }
    }
}

$.fn.table = function (options) {
    if (options == null) {
        options = { iCookieDuration: 60*60*24, bPaginate:false, bDisplayLength:false, bLengthChange:false, bInfo:false };
    }
    options.oLanguage = {
        "sProcessing": "Traitement en cours...",
        "sLengthMenu": "Afficher _MENU_ éléments",
        "sZeroRecords": "Aucun élément à afficher",
        "sInfo": "Affichage de l'élement _START_ à _END_ sur _TOTAL_ éléments",
        "sInfoEmpty": "Affichage de l'élement 0 à 0 sur 0 éléments",
        "sInfoFiltered": "(filtré de _MAX_ éléments au total)",
        "sInfoPostFix": "",
        "sSearch": "",
        "sUrl": "",
        "oPaginate": {
            "sFirst": "Premier",
            "sPrevious": "Précédent",
            "sNext": "Suivant",
            "sLast": "Dernier"
        }
    };
    $(this).dataTable(options);
}

jQuery.fn.oDialog = function (options) {
    var dialog = this.dialog(options);
    $("span.ui-icon-closethick").html("fermer");
    return dialog;
}

jQuery.fn.multiSelect = function () {
    var select = $(this);
    select.css("display", "none");

    var container = $("<div class='multiSelect-container'></div>");
    select.after(container);

    select.children("option").each(function () {
        var optionValue = $(this).val();
        var optionDiv = $("<div class='option'></div>");

        var chk = $("<input type='checkbox' />");
        chk.option = $(this);

        if ($(this).attr("selected")) {
            chk.attr("checked", "true");
        }

        chk.click(function () {
            if ($(this).attr("checked")) {
                chk.option.attr("selected", true);
            }
            else {
                chk.option.attr("selected", false);
            }
        });

        var text = $(this).html();
        var textSpan = $("<span>" + text + "</span>");
        optionDiv.append(chk);
        optionDiv.append(textSpan);
        container.append(optionDiv);
    });
}

jQuery.fn.sortElements = function () {

    var sort = [].sort;

    return function (comparator, getSortable) {

        getSortable = getSortable || function () { return this; };

        var placements = this.map(function () {

            var sortElement = getSortable.call(this),
                parentNode = sortElement.parentNode,

            // Since the element itself will change position, we have
            // to have some way of storing its original position in
            // the DOM. The easiest way is to have a 'flag' node:
                nextSibling = parentNode.insertBefore(
                    document.createTextNode(''),
                    sortElement.nextSibling
                );

            return function () {

                if (parentNode === this) {
                    throw new Error(
                        "You can't sort elements if any one is a descendant of another."
                    );
                }

                // Insert before flag:
                parentNode.insertBefore(this, nextSibling);
                // Remove flag:
                parentNode.removeChild(nextSibling);

            };

        });

        return sort.call(this, comparator).each(function (i) {
            placements[i].call(getSortable.call(this));
        });

    };

}

$.fn.dlWrapper = function (options) {

    if (options == null) {
        options = {};
    }

    if (options.text == null) {
        options.text = {
            All: "Tous",
            Search: "Rechercher",
            Empty: "Aucun élément",
            Filter: "Filtrer"
        }
    }

    var dl = $(this);
    var wrapper = $("<div class='dlwrapper'></div>");
    dl.replaceWith(wrapper);

    if (dl.find("dt").toArray().length == 0) {
        wrapper.html("<div class='empty'>" + options.text.Empty + "</div>");
    }
    else {
        var leftPanel = $("<div class='leftPanel'></div>");

        var filterVar = { searched: '', filter: options.text.All };
        var flabel = $("<label>" + options.text.Filter + "</label>:");
        var filter = $("<ul class='filterList'></ul>");

        if (!options.hideFilter) {
            leftPanel.append(flabel);
            leftPanel.append(filter);
        }

        var searchPanel = $("<div class='searchPanel'></div>");
        var label = $("<label>" + options.text.Search + "</label>:");
        searchPanel.append(label);

        var searchBox = $("<input class='searchBox'/>");
        searchPanel.append(searchBox);
        searchBox.keyup(function () {
            var searched = $(searchBox).val();
            filterVar.searched = searched;
            filterElements();
        });

        leftPanel.append(searchPanel);

        var rightPanel = $("<div class='rightPanel'></div>");
        $(rightPanel).append($(this));
        var letterPanel = $("<div class='letterPanel'></div>");
        rightPanel.prepend(letterPanel);
        var bottomPanel = $("<div class='bottomPanel'></div>");

        wrapper.append(leftPanel);
        wrapper.append(rightPanel);
        wrapper.append(bottomPanel);


        dl.find("dt").each(function () {
            var div = $("<div class='element'></div>");
            div.append($("<div class='title'>" + $(this).text() + "</div>"));
            div.append($("<div class='content'>" + $(this).next("dd").html() + "</div>"));
            $(this).next("dd").remove();
            $(this).replaceWith(div);
        });

        dl.find(".element").sortElements(function (a, b) {
            return $(a).find(".title").text() > $(b).find(".title").text() ? 1 : -1;
        });

        var refresh = function () {
            letterPanel.html("");
            filter.html("");
            rightPanel.find(".header").remove();
            var char = '';
            var currentElem;
            var filters = new Array();
            dl.find(".element:visible").each(function () {
                var text = $(this).find(".filter").text();
                if ($.inArray(text, filters) == -1) {
                    filters.push(text);
                }

                if (($(this).find(".title").text().substr(0, 1) != char)) {
                    char = $(this).text().substr(0, 1);
                    letterPanel.append("<span><a href='#" + char + "'>" + char + "</a></span>");
                    $(this).before("<h3 class='header' id='" + char + "'>" + char.toLocaleUpperCase() + "</h3>");
                }
            });

            var liAll = $("<li><a href='javascript:return false'>" + options.text.All + "</a></li>");
            if (options.text.All == filterVar.filter) {
                liAll.addClass("selected");
            }
            filter.append(liAll);

            for (var index = 0; index < filters.length; index++) {
                var li = $("<li><a href='javascript:return false'>" + filters[index] + "</a></li>");

                if (filters[index] == filterVar.filter) {
                    li.addClass("selected");
                }

                filter.append(li);
            };

            filter.find("li a").click(function () {
                filterVar.filter = $(this).html();
                filterElements();
            });

        }

        var filterElements = function () {
            dl.find(".element").each(function () {
                var subFilter = ".filter:contains(" + filterVar.filter + ")";
                var elem = $(this).find(subFilter).toArray();
                console.debug($(this).html().indexOf(filterVar.searched));
                if (((filterVar.searched != '') && ($(this).html().indexOf(filterVar.searched) < 0)) || ((filterVar.filter != "Tous") && (elem.length == 0))) {
                    $(this).hide();
                }
                else {
                    $(this).show();
                }
            });
            refresh();
        };

        refresh();
    }
}
