var _editSaveDialog = null;
var _editSaveCallback = null;
var _textareaIds = 0;

var debugEnabled = true;

var dialogIds = 0;

function showSaveDialog(aObjectType, aParentId, aCallback) {
    _editSaveCallback = aCallback;
    if (!_editSaveCallback) {
        try {
            _editSaveCallback = eval("callback" + aObjectType + "Saved");
        } catch(ex) {
            _editSaveCallback = null;
        }
    }

    $generalGetDialog(null, aObjectType, aParentId, renderDialog);
}

function showEditDialog(aId, aObjectType, aCallback) {
    _editSaveCallback = aCallback;
    if (!_editSaveCallback) {
        try {
            _editSaveCallback = eval("callback" + aObjectType + "Edited");
        } catch(ex) {
            _editSaveCallback = null;
        }
    }

    $generalGetDialog(aId, null, null, renderDialog);
}

function renderDialog(aAttributes) {
    var dialogDiv = document.createElement("DIV");
    dialogDiv.className = "objectDialog";
    dialogDiv.innerHTML = aAttributes["dialogCode"];
    dialogDiv.innerHTML += "<div class=\"dialogLeftAngle\"></div><div class=\"dialogRightAngle\"></div>";

    _editSaveDialog = new dijit.Dialog({
        id: "loginDialog" + dialogIds,
        title: aAttributes["dialogTitle"],
        refreshOnShow: true,
        hasShadow: true
    }, dialogDiv);

    _editSaveDialog.startup();

    document.body.appendChild(_editSaveDialog.domNode);

    preprocessFileFields();
    _editSaveDialog.show();

    document.body.style.overflowX = "hidden";
    
    setFocusToFirstThing(_editSaveDialog.domNode);
}

var _wysiwygId = null;
var _wikiId = null;

function editWYSYWIG(aDivId) {
    var wysiwygText = dojo.byId(aDivId);
    if (aDivId && wysiwygText) {
        _wysiwygId = aDivId;
        window.open("/editWYSIWYG.html", "_editorWYSIWYG", "width=700,height=500");
    }
}

function editWiki(aDivId) {
    var wikiText = dojo.byId(aDivId);
    if (aDivId && wikiText) {
        _wikiId = aDivId;
        window.open("/editWiki.html", "_editorWiki", "width=700,height=500");
    }
}

function preprocessFileFields(aNode) {
    try {
        if (!aNode) {
            aNode = _editSaveDialog.domNode;
        }
        if (aNode) {
            for (var i = 0; i < aNode.childNodes.length; i++) {
                var childNode = aNode.childNodes[i];

                if (childNode.className && childNode.className == "widget_File") {
                    initializeFileField(childNode);
                } else {
                    preprocessFileFields(childNode);
                }
            }
        }
    } catch(ex) {
        if (debugEnabled) {
            alert(dojo.toJson(ex));
        }
    }
}

function setFocusToFirstThing(aNode) {
    try {
        if (!aNode) {
            aNode = _editSaveDialog.domNode;
        }
        
        for (var i = 0; i < aNode.childNodes.length; i++) {
            var childNode = aNode.childNodes[i];

            if (childNode.tagName == "INPUT") {
                while (dojo.byId("firstToFocus")) {
                    dojo.byId("firstToFocus").id = null;
                }

                childNode.id = "firstToFocus";
                childNode.focus();
                setTimeout("dojo.byId(\"firstToFocus\").focus()", 50);
                return true;
            }

            if (setFocusToFirstThing(childNode)) {
                return true;
            }
        }
    } catch(ex) {
        if (debugEnabled) {
            alert(ex);
        }
    }

    return false;
}

function cancelSaveEditDialog() {
    var aNode = _editSaveDialog.domNode;
    aNode.parentNode.removeChild(_editSaveDialog.domNode);
    _editSaveDialog.hide();
    _editSaveDialog = null;
    _editSaveCallback = null;
    document.body.style.overflowX = "auto";
}

function submitSaveDialog() {
    $generalDialogSave(getJivaObjectFromDialog(), saveEditFinished);
}

function submitEditDialog() {
    $generalDialogEdit(getJivaObjectFromDialog(), saveEditFinished);
}

function saveEditFinished(aAttributes, aObjects, aResultType, aResultDescription) {
    try {
        removeAllWarnings();
    } catch(ex) {
        if (debugEnabled) {
            alert(dojo.toJson(ex));
        }
    }

    if (aResultType == "ERROR") {
        if (aResultDescription.indexOf("Fields Check failed: ") == 0) {
            var badFields = aResultDescription.substring(21).split(/\|\|/g);
            for (var i in badFields) {
                var nameHint = badFields[i].split(/\|/g);
                var badFieldName = nameHint[0];
                if (dojo.byId("labelFor_" + badFieldName)) {
                    dojo.byId("labelFor_" + badFieldName).innerHTML =
                    "<img src=\"/i/warning.gif\" width=\"10\" height=\"10\" alt=\"!\" " +
                    "style=\"margin-right: 5px;\" title=\"" + nameHint[1] + "\" alt=\"" + nameHint[1] + "\" class=\"warningImage\"/>" + dojo.byId("labelFor_" + badFieldName).innerHTML;
                }
            }
        }
    } else if (aResultType == "OK") {
        if (_editSaveCallback) {
            try {
                _editSaveCallback(aAttributes, aObjects, aResultType, aResultDescription);
            } catch(ex) {
                alert(dojo.toJson(ex));
            }
        }

        cancelSaveEditDialog();
    }
}

function getJivaObjectFromDialog(aNode, aObject) {
    if (!aObject) {
        aObject = new Array();
    }

    if (!aNode) {
        aNode = _editSaveDialog.domNode;
    }

    if (aNode) {
        for (var i = 0; i < aNode.childNodes.length; i++) {
            var childNode = aNode.childNodes[i];

            if (childNode.className && childNode.className.substring(0, 7) == "widget_") {
                if (childNode.tagName == "TEXTAREA" || (childNode.tagName == "DIV" &&
                                                        (childNode.className == "widget_TextAreaWYSIWYG_preview" || childNode.className == "widget_TextAreaWiki_preview"))) {
                    if (childNode.tagName == "DIV" && childNode.innerHTML != "") {
                        aObject.push($a(childNode.getAttribute('name'), "s", childNode.innerHTML));
                    } else {
                        aObject.push($a(childNode.name, "s", childNode.value));
                    }
                } else if (childNode.getAttribute("type") == "checkbox") {
                    aObject.push($a(childNode.name, "s", childNode.checked ? "true" : "false"));
                } else if (childNode.className == "widget_PasswordField" && childNode.value != "Hello Hacker :)") {
                    aObject.push($a(childNode.name, "s", childNode.value));
                } else if (childNode.name) {
                    aObject.push($a(childNode.name, "s", childNode.value));
                }
            }

            getJivaObjectFromDialog(childNode, aObject);
        }
    }

    return aObject;
}

function getJivaObjectFieldFromDialog(aFieldName, aNode) {
    if (!aNode) {
        aNode = _editSaveDialog.domNode;
    }

    if (aNode) {
        for (var i = 0; i < aNode.childNodes.length; i++) {
            var childNode = aNode.childNodes[i];

            if (childNode.className && childNode.className.substring(0, 7) == "widget_" && childNode.name == aFieldName) {
                return childNode;
            }

            var deeper = getJivaObjectFieldFromDialog(aFieldName, childNode);
            if (deeper != null) {
                return deeper;
            }
        }
    }

    return null;
}

function removeAllWarnings(aNode) {
    var images = document.getElementsByTagName("IMG");
    for (var i in images) {
        var image = images[i];
        if (image.className == "warningImage") {
            image.parentNode.removeChild(image);
        }
    }
}

/**
 * ID итема выставляется типа "имя"_"индекс", подробнее - класс WidgetListEditor
 * @param aItemId
 * @param aListId
 */
function widgetListRemoveItem(aItemId, aListId) {
    var div = dojo.byId(aItemId);
    div.parentNode.removeChild(div);

    var index = new Number(aItemId.substring(aListId.length + 1));

    var fieldDiv = dojo.byId(aListId);
    var value = fieldDiv.value;
    var deleteFrom = value.indexOf("¡" + index + "∞");
    if (deleteFrom != -1) {
        var deleteTo = value.indexOf("¡", deleteFrom + 1);

        if (deleteTo == -1) {
            deleteTo = value.length;
        }

        value = value.substring(0, deleteFrom) + value.substring(deleteTo + 1);
        fieldDiv.value = value;
    }
}

// пока добавляет в конец.
function widgetListAddItemAfter(aItemId, aListId) {
    //ToDo: работа со списками еще впереди
//    var div = document.createElement("DIV");
//    div.id =
}

// ====================================================================
// == Object selector
// ====================================================================

var _objectSelectorTimer = null;
var _objectSelecting = false;
var _selectingElement = null;
var _lastTemplate = null;

var _divWithSelections = null;

function selectObjectsByName(aObjectType, aElement, aLoadFromAllRoots) {
    if (_lastTemplate == aElement.value) {
        return;
    }

    _lastTemplate = aElement.value;

    if (_objectSelectorTimer) {
        clearTimeout(_objectSelectorTimer);
    }

    if (_lastTemplate == "") {
        if (_divWithSelections) {
            _divWithSelections.parentNode.removeChild(_divWithSelections);
            _divWithSelections = null;
        }

        return;
    }

    _selectingElement = aElement;
    _selectingElement.style.position = "relative";    

    _objectSelectorTimer = setTimeout("updateObjectSelector('" + aObjectType + "', '" + aLoadFromAllRoots + "')", 200);
}

function updateObjectSelector(aObjectType, aLoadFromAllRoots) {
    if (_objectSelecting) {
        selectObjectsByName(aObjectType, _selectingElement);
    }

    _objectSelecting = true;

    $generalDialogSelectObjects(aLoadFromAllRoots, aObjectType, _selectingElement.value.substring(_selectingElement.value.lastIndexOf(";") + 1), objectsSelected);
}

function objectsSelected(aAttributes, aObjects) {
    var selected = aAttributes["result"];
    _objectSelecting = false;

    var selections = "";

    for (var id in selected) {
        var title = selected[id];

        if (selections.length != 0) {
            selections += ", ";
        }

        selections += "<span class=\"objectsSelection\" onclick=\"addSelection('" + id + "', '" + title + "');\">" + title + "</span>";
    }

    _divWithSelections = dojo.byId("objectSelectionDivId");
    if (!_divWithSelections) {
        _divWithSelections = document.createElement("DIV");
        _divWithSelections.id = "objectSelectionDivId";
        _divWithSelections.className = "objectSelectionDiv";
    }

    _divWithSelections.innerHTML = selections;
    _divWithSelections.style.position = "relative";
    _divWithSelections.style.left = "0";
    _divWithSelections.style.top = "-10px";

    _selectingElement.parentNode.appendChild(_divWithSelections);

//    alert(_selectingElement.tagName);
//    alert(_divWithSelections.innerHTML);

//    try {
//        alert(dojo.dom);
//    } catch(ex) {
//        alert(ex);
//    }

//    dojo.dom.insertAfter(_divWithSelections, _selectingElement);
}

function addSelection(aId, aTitle) {
    addElementToField(aTitle, _selectingElement, true);
    addElementToField(aId, dojo.byId("idsFor_" + _selectingElement.name), false);

    _selectingElement.value += "; ";

    _divWithSelections = dojo.byId("objectSelectionDivId");

    if (_divWithSelections) {
        _divWithSelections.parentNode.removeChild(_divWithSelections);
        _divWithSelections = null;
    }

    _lastTemplate = null;
    _selectingElement.focus();
}

function addElementToField(aNewElement, aField, aNeedPop) {
    var elements = aField.value.split(/\s*;\s*/g);
    if (aNeedPop) {
        elements.pop();
    }
    elements.push(aNewElement);

    var newElements = "";

    for (var i in elements) {
        if (newElements.indexOf(elements[i]) == -1) {
            if (newElements.length != 0) {
                newElements += "; ";
            }

            newElements += elements[i];
        }
    }

    aField.value = newElements;
}

/**
 * Возвращает true, если событие пришло по нажатию ентера, false иначе.
 * @param event
 */
function enterPressed(event) {
    var keycode;
    if (window.event) {
        keycode = window.event.keyCode;
    } else if (event) {
        keycode = event.which;
    } else {
        return false;
    }
    
    return (keycode == 13);
}

// --------------------------------------------
// Remove objects
// --------------------------------------------

function showRemoveDialog(aId, aCallback) {
    if (confirm("Вы уверены, что хотите удалить объект?")) {
        $objectRemove(aId, aCallback ? aCallback : responseRemoveObject);
    }
}

function responseRemoveObject(aAttributes) {
    var element = dojo.byId("" + aAttributes["id"]);
    if (element && element.parentNode) {
        element.parentNode.removeChild(element);
    }
}
