var parsedCalendars = {};

/** Добавляет actionName к document.location */
function appendActionToUrl(actionName) {
    var s = "" + document.location;
    return s.split("?")[0] + "/" + actionName;
}

function initCalendar(params) {
    if (parsedCalendars[params.id]) return;
    var id = params.id;
    delete(params.id);
    // add year parameter to prevent caching when year changes
    params.year = new Date().getFullYear();
    var changeHandler = function () {
        var div = $($(this).parents("span")[0]);
        var arr = [];
        $(div.find("select")).each(function() {
            arr.push($(this).val());
        });
        div.find("input:hidden").val(arr.join('.'));
    };

    var div = $(document.getElementById(id));
    var fld = div.find("input:hidden");
    $.ajax({
        url: appendActionToUrl("calendar"),
        type: "GET",
        cache: false,
        data: params,
        success: function(html) {
            div.append(html);
            if ($.browser.msie) {
                if (!params.displayType || params.displayType.toUpperCase() != 'YEAR') {
                    div.find("select").attr("style", "width: none;");
                }
            }
            if (fld.length) {
                var d = fld.val();
                var s = d ? d.split(".") : [];
                var selects = div.find("select");
                for (var i = 0; i < selects.length; i++) {
                    var el = $(selects[i]);
                    if (s[i]) el.val(Number(s[i]));
                    el.change(changeHandler);
                }
            }
            parsedCalendars[id] = true;
        }
    });
}

function addDefinition(el, clz) {
    var spans = $(el).parents("span");
    var span = $(spans[0]);
    if (span) {
        if (span.children("table").length > 10) return;
        var t = span.children("table:last");
        if (t) {
            if (clz) {
                var tr = t.find("$" + clz + ":last").parents("tr:first");
                tr.parent().append(tr.clone(true));
            } else {
                var isNotEmpty = false;
                t.find("select,input[type!=hidden]").each(function() {
                    isNotEmpty = isNotEmpty || $(this).val() || $(this).attr("type") == "file";
                });
                if (isNotEmpty) {
                    var t1 = t.clone(true);
                    t1.find("select,input,textarea").each(function() {
                        $(this).val("");
                        if ($(this).attr("type") == "file") {
                            // для оперы чистим file
                        }
                    });
                    t1.insertAfter(t);
                    $("<br>").insertBefore(t1);
                }
            }
        }
    }
}

function removeDefinition(el, clz) {
    var t;
    var span = $($(el).parents("span")[0]);
    if (span) {
        if (clz) {
            t = span.children("table:last");
            if (t) {
                var f = t.find("." + clz);
                if (f.length > 1) $(f[1]).parents("tr:first").remove();
            }
        } else {
            t = span.children("table");
            if (t.length > 1) {
                t = $(t.get(t.length - 1));
                t.parent().children("br:last").remove();
                t.remove();
            } else if (t.length == 1) {
                span.find("select,input,textarea").each(function() {
                    $(this).val("");
                });
            }
        }
    }
}

function resetForm(form) {
    if ($(form).get(0).tagName != 'FORM') form = $(form).parents("form:first");
    $(form).find("input[type!=hidden][type!=submit][type!=button],select,textarea").val("");
    return false;
}

function submitForm(form) {
    if ($(form).get(0).tagName != 'FORM') form = $(form).parents("form:first");
    if (form.length) {
        if (!form.find(":hidden[name$='operation.cancel']").val()) {
            if (form[0].onsubmit && !form[0].onsubmit()) return;
        }
        form[0].submit();
    }
}

function gotoPage(el, name, n) {
    var form = $(el).parents("form:first");
    form.find(":hidden[name$=" + name + ".currentPage]").val(n);
    submitForm(form);
    return false;
}

function setFormParams(form, arrayOrName, value) {
    if ($(form).get(0).tagName != 'FORM') form = $(form).parents("form:first");
    if (arrayOrName) {
        var arr = [];
        if (typeof(arrayOrName) == "string") {
            arr.push({name:arrayOrName,value:value});
        } else {
            arr = arrayOrName;
        }
        for (var i = 0; i < arr.length; i++) {
            var op = form.find(":hidden[name=" + arr[i].name + "]");
            if (op.length) {
                op.val(arr[i].value);
            } else {
                form.append($("<input type='hidden' name='" + arr[i].name + "' value='" + arr[i].value + "'>"));
            }
        }
    }
}

function sendFormWithParams(el, arrayOrName, value) {
    var form = $(el).parents("form:first");
    if (form.length) {
        setFormParams(form, arrayOrName, value);
        if ($(el).attr("type") == "image") {
            // fox for chrome
            setFormParams(form, $(el).attr("name"), 1);
        }
        submitForm(form);
    }
    return false;
}

function setUniqueChoice(el) {
    $(":checkbox[name=" + el.name + "]").each(function() {
        if (this != el) this.checked = false;
    });
}

function sendAction(el, action, arrayOrName, value) {
    var form = $(el).parents("form:first");
    if (form.length) {
        el.name = "operation.none";
        form.attr("action", action);
        setFormParams(form, arrayOrName, value);
        submitForm(form);
    }
    return false;
}

function addToIdList(el, id, name, list) {
    var form = $(el).parents("form:first");
    if (typeof(list) == "string") list = form.find(":select[name=" + list + "]");
    if (!list.find("option[value=" + id + "]").length) {
        list.append("<option value='" + id + "'>" + name + "</option>");
    }
    return false;
}

function removeSelectedItem(el) {
    var value = $('select[@name=loadFileName] option:selected').val();
    $(el).find("option[value=" + value + "]").remove();
}

function skipOtherTablesValidation(table) {
    var form = $(table).parents("form:first");
    form.find("input,select,textarea").each(function() {
        this.skipValidation = $(this).parents("table").index(table.get(0)) == -1;
    });
}

function replaceHtml(e1, e2) {
    var $e1 = $(e1);
    var $e2 = $(e2);
    var $p1 = $e1.prev();
    var $p2 = $e2.prev();
    if ($p1.length) {
        $e1.insertBefore($e2);
        $e2.insertAfter($p1);
    } else if ($p2.length) {
        $e2.insertBefore($e1);
        $e1.insertAfter($p2);
    }
}

function selectDiv(target) {
    var rng, sel;
    if (document.createRange) {
        rng = document.createRange();
        rng.selectNodeContents(target);
        sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(rng);
    } else {
        rng = document.body.createTextRange();
        rng.moveToElementText(target);
        rng.select();
    }
}

function editStatus(el) {
    var $el = $(el);
    if (el.contentEditable != "true") {
        $el.addClass("statusActive");
        el.contentEditable = true;
        $el.focus();
        selectDiv(el);
        el.origText = $el.text();
        var cancelEdit = function () {
            var $el = $(el);
            $el.removeClass("statusActive");
            el.contentEditable = false;
            $el.text(el.origText);
        };
        $el.blur(cancelEdit);
        $el.keydown(function (event) {
            switch (event.keyCode) {
                case 13: // enter
                    $el.removeClass("statusActive");
                    el.contentEditable = false;
                    $.ajax({
                        url: appendActionToUrl("saveUserStatus"),
                        processData: true,
                        type:"POST",
                        data: {status: $el.text()}
                    });
                    el.origText = null;
                    event.preventDefault();
                    break;
                case 27: // esc
                    cancelEdit();
                    event.preventDefault();
                    break;
            }
        });
    }
}

