MessageFactory = [];

// Signature: arguments - path, where to save message. Last parameter - message
// function can be called as setMessage("domain", "subdomain", "key", "value") and also as setMessage(["domain", "subdomain", "key", "value"])
function setMessage(){
    var args = arguments;
    if(arguments.length == 1 && arguments[0].construstor == Array)
        args = arguments[0];

    var curr = MessageFactory;

    for(var i = 0; i < args.length - 2; i++ ){
        if(curr[args[i]] == null)
            curr[args[i]] = []

        curr = curr[args[i]];
    }

    curr[args[args.length - 2]] = args[args.length - 1];
}

function getMessageFromTree(tree, args){
    var curr = tree;

    if(curr == null || args == null)
        alert(getMessage("internal", "invalidParams"));

    for(var i = 0; i < args.length; i++ ){
        curr = curr[args[i]];

        if(curr == null){
            alert(getMessage("internal", "notFound") + args.join("@"));
            return null;
        }
    }

    return curr;
}

// function can be called as getMessage("domain", "subdomain", "key") and also as getMessage(["domain", "subdomain", "key"])
function getMessage(){
    return getMessageFromTree(MessageFactory, arguments);
}

// forms object with field "tree" that contains subtree from whole message resources for given path.
// Usage: new MessageTree("path", "to", "subtree")
function MessageTree(){
    this.tree = getMessageFromTree(MessageFactory, arguments);
}

// method for MessageTree object - get message from subtree.
// Usage: (new MessageTree("path", "to", "subtree")).getMessage("key")
MessageTree.prototype.getMessage = function(){return getMessageFromTree(this.tree, arguments)}

