csys.load.algorithm <- function(file.name = NULL)
{
    print(file.name)
    if(length(file.name) == 0) {
	stop("Invalid file name")
    }
    if(require(XML) == FALSE) {
        stop("Failed to load the package XML")
    }

    # parse the xml file without comments
    doc = xmlTreeParse(file.name, handlers=list("comment"=function(x,...){NULL}), asTree = TRUE)

    algo.tree = doc$doc$children$list$children
    nalgo = length(algo.tree)
    algo.list = NULL

    # parse algorithms
    for(i in 1 : nalgo) {
        t.algo = algo.tree[i]$algorithm

        if (length(t.algo) == 0) {
            stop("Invalid algorithms XML file format")
        }

        # algorithm is ignored
        t.algo.ignored = toString(t.algo$children$is.ignored$children$text)
        if (t.algo.ignored == "") {
            t.algo.ignored = "FALSE"
        }

        # algorithm name
        t.algo.name = toString(t.algo$children$name$children$text)

        ##if (length(t.algo.name) == 0) {
        ##    t.algo.name = NA
        ##}

        # package name
        t.pck.name = toString(t.algo$children$package$children$text)
        ##if (length(t.pck.name) == 0) {
        ##    t.pck.name = NA
        ##}

        # function:
        t.func = t.algo$children$"function"$children
        t.func.n = length(t.func)

        t.func.name = toString(t.func$name$children$text) # name
        if (t.func.name != "") {
            t.func.n = t.func.n - 1
        }

        t.func.pass.arg = toString(t.func$pass.arguments$children$text) # pass.arguments
        if (t.func.pass.arg != "") {
            t.func.n = t.func.n - 1
        }

        t.func.parameter.list = rep(NA,t.func.n)
        k = 1
        for (j in 1 : length(t.func)) {
            if (attr(t.func[j], "name") == "parameter") {
                t.func.p.p = t.func[j]$parameter$children
                t.func.p.p.name = t.func.p.p$name$children$text
                t.func.p.p.value = t.func.p.p$value$children$text
                if (length(t.func.p.p.name) != 0 &
                    length(t.func.p.p.value) != 0)
                {
                    t.func.parameter.list[k] = list(name = toString(t.func.p.p.name),value = toString(t.func.p.p.value))
                    k = k+1
                }
            }
        }

        # train
        t.train = t.algo$children$train$children

        t.train.parameter.name = toString(t.train$parameter.name$children$text)

        t.train.cbind = toString(t.train$combine.with.labels$children$text)
        if(t.train.cbind == "") {
            t.train.cbind = "FALSE"
        }
        t.train.dframe = toString(t.train$make.data.frame$children$text)
        if(t.train.dframe == "") {
            t.train.dframe = "FALSE"
        }

        # labels
        t.labels = t.algo$children$labels$children
        t.labels.parameter.name = toString(t.labels$parameter.name$children$text)
        t.labels.formula.left = toString(t.labels$formula$children$left.hand$children$text)
        t.labels.formula.right = toString(t.labels$formula$children$right.hand$children$text)
        ##if (t.labels.parameter.name == "") {
        ##    t.labels.parameter.name = NA
        ##}
        ##if (t.labels.formula.left == "") {
        ##    t.labels.formula.left = NA
        ##}
        ##if (t.labels.formula.right == "") {
        ##    t.labels.formula.right = NA
        ##}

        ## parameter.list = t.func.parameter.list is NOT added to the data.frame (be not able to)
        t.list = list(
        name = t.algo.name,
        package = t.pck.name,
        func.name = t.func.name,
        pass.arguments = as.logical(t.func.pass.arg),
        train.name = t.train.parameter.name,
        cbind = as.logical(t.train.cbind),
        data.frame = as.logical(t.train.dframe),
        labels.name = t.labels.parameter.name,
        labels.formula.left = t.labels.formula.left,
        labels.formula.right = t.labels.formula.right);

        ## add the algorithm parameters to algo.list
        if (t.algo.ignored == "FALSE") {
            algo.list = rbind(algo.list, data.frame(t.list))
        }
    }
    return(algo.list)
}
