// Define Classes
function ModelClass(name, sections){
   this.className = "ModelClass";
   this.name = name;
   this.sections = sections;
}

function SectionClass (name, label, title, items) {
   this.className = "SectionClass";
   this.name  = name;
   this.label = label;
   this.title = title;
   this.items = items;
}
SectionClass.prototype = new ModelClass;

function ItemClass (name, label, type, torqueName, options, parentSection) {
   this.className = "ItemClass";
   this.name  = name;
   this.label = label;
   this.type  = type;
   this.torqueName  = torqueName;
   this.options  = options;
   this.parentSection  = parentSection;
}
ItemClass.prototype = new SectionClass;

function OptionClass (value, text, selected, parentItem) {
   this.className = "OptionClass";
   this.value     = value;
   this.text      = text;
   this.selected  = selected;
   this.parentItem  = parentItem;
}
OptionClass.prototype = new ItemClass;

function CriteriaClass (id, name, model, desc, criterions) {
   this.className = "CriteriaClass";
   this.id    = id;
   this.name  = name;
   this.model = model;
   this.desc  = desc;
   this.criterions  = criterions;
}

function CriterionClass (section, item, operator, value) {
   this.className = "CriterionClass";
   this.section   = section;
   this.item      = item;
   this.operator  = operator;
   this.value     = value;
}
CriterionClass.prototype = new CriteriaClass;


// Creating Items

// Constants
var LEFT_MARGIN      = "6%";
var CRITERIA_PREFFIX = "criteria.body.";
var INPUT_CLASS      = "mask";
var SELECT_CLASS     = "select";

function createItems(currItem){
    var divElement = document.getElementById("div_" + currItem.parentSection + "_" +  currItem.name);
    if (divElement.children.length == 0) {
        switch (currItem.type){
            case "integer":
                createIntegerItem(divElement, currItem);
                break;
            case "varchar":
                createVarcharItem(divElement, currItem);
                break;
            case "date":
                createDateItem(divElement, currItem);
                break;
            case "enumeration":
                createEnumItem(divElement, currItem);
                break;
            case "key":
                createKeyItem(divElement, currItem);
                break;
            case "map":
                createMapItem(divElement, currItem);
                break;
            default:
        }
        loadCriterion(criteria, currItem);
    }
}

function createIntegerItem(divElement, currItem){

    var tableElement = createSimpleTable("0", "0", "0", "100%")
    var tbodyElement = document.createElement("TBODY");
    tableElement.appendChild(tbodyElement);

    var trElement = document.createElement("TR");
    tbodyElement.appendChild(trElement);

    // first column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", LEFT_MARGIN);
    trElement.appendChild(tdElement);

    // second column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "10%");
    trElement.appendChild(tdElement);
    var selectElement = document.createElement("SELECT");
    selectElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".operator");
    selectElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".operator");
    selectElement.setAttribute("className", SELECT_CLASS);
    selectElement.setAttribute("onchange", setElementHide);
    selectElement.style.width = "95%";
    tdElement.appendChild(selectElement);

    // third column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "20%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type", "text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".from");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".from");
    inputElement.setAttribute("className", INPUT_CLASS);
    inputElement.setAttribute("preset", "number");
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    // forth column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "20%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type", "text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".to");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".to");
    inputElement.setAttribute("className", INPUT_CLASS);
    inputElement.setAttribute("preset", "number");
    inputElement.style.display = "none";
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "44%");
    trElement.appendChild(tdElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "=";
    optionElement.value = "equal";
    optionElement.selected = true;
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "<";
    optionElement.value = "less_than";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = ">";
    optionElement.value = "greater_than";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "<=";
    optionElement.value = "less_equal";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = ">=";
    optionElement.value = "greater_equal";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "<>";
    optionElement.value = "not_equal";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "Between";
    optionElement.value = "between";
    selectElement.options.add(optionElement);

    divElement.appendChild(tableElement);
}

function createVarcharItem(divElement, currItem){

    var tableElement = createSimpleTable("0", "0", "0", "100%")
    var tbodyElement = document.createElement("TBODY");
    tableElement.appendChild(tbodyElement);

    var trElement = document.createElement("TR");
    tbodyElement.appendChild(trElement);

    // first column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", LEFT_MARGIN);
    trElement.appendChild(tdElement);

    // second column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "10%");
    trElement.appendChild(tdElement);
    var selectElement = document.createElement("SELECT");
    selectElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".operator");
    selectElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".operator");
    selectElement.setAttribute("className", SELECT_CLASS);
    selectElement.setAttribute("onchange", setElementHide);
    selectElement.style.width = "95%";
    tdElement.appendChild(selectElement);

    // third column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "20%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type", "text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".from");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".from");
    inputElement.setAttribute("className", INPUT_CLASS);
    inputElement.setAttribute("preset", "string");
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    // forth column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "20%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type", "text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".to");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".to");
    inputElement.setAttribute("className", INPUT_CLASS);
    inputElement.setAttribute("preset", "string");
    inputElement.style.display = "none";
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "44%");
    trElement.appendChild(tdElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "=";
    optionElement.value = "equal";
    optionElement.selected = true;
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "<";
    optionElement.value = "less_than";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = ">";
    optionElement.value = "greater_than";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "<=";
    optionElement.value = "less_equal";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = ">=";
    optionElement.value = "greater_equal";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "<>";
    optionElement.value = "not_equal";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "Between";
    optionElement.value = "between";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "Like";
    optionElement.value = "like";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "Start";
    optionElement.value = "start";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "Contain";
    optionElement.value = "contain";
    selectElement.options.add(optionElement);

    divElement.appendChild(tableElement);
}

function createDateItem(divElement, currItem){

    var tableElement = createSimpleTable("0", "0", "0", "100%")
    var tbodyElement = document.createElement("TBODY");
    tableElement.appendChild(tbodyElement);

    var trElement = document.createElement("TR");
    tbodyElement.appendChild(trElement);

    // first column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", LEFT_MARGIN);
    trElement.appendChild(tdElement);

    // second column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "20%");
    trElement.appendChild(tdElement);

    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type","text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".from");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".from");
    inputElement.setAttribute("className", INPUT_CLASS);
    inputElement.setAttribute("preset", "shortdate");
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    // third column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "5%");
    trElement.appendChild(tdElement);
    var imgElement = document.createElement("IMG");
    imgElement.setAttribute("id", "img." + currItem.parentSection + "." +  currItem.name + ".from");
    imgElement.setAttribute("src", GetPath("static") + "images/table_icon3.gif");
    imgElement.setAttribute("onclick", popupCalendar);
	imgElement.style.cursor = "hand";
    tdElement.appendChild(imgElement);

    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "20%");
    trElement.appendChild(tdElement);

    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type","text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".to");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".to");
    inputElement.setAttribute("className", INPUT_CLASS);
    inputElement.setAttribute("preset", "shortdate");
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    var tdElement = document.createElement("TD");
//    tdElement.setAttribute("width", "5%");
    trElement.appendChild(tdElement);
    var imgElement = document.createElement("IMG");
    imgElement.setAttribute("id", "img." + currItem.parentSection + "." +  currItem.name + ".to");
    imgElement.setAttribute("src", GetPath("static") + "images/table_icon3.gif");
    imgElement.setAttribute("onclick", popupCalendar);
	imgElement.style.cursor = "hand";
    tdElement.appendChild(imgElement);

    divElement.appendChild(tableElement);
}

function createEnumItem(divElement, currItem){

   var tableElement = createSimpleTable("0", "0", "0", "100%")
   var tbodyElement = document.createElement("TBODY");
   tableElement.appendChild(tbodyElement);

   for (var i=0;i<currItem.options.length;i++){
       var trElement = document.createElement("TR");
       tbodyElement.appendChild(trElement);

       var tdElement = document.createElement("TD");
       tdElement.setAttribute("width", LEFT_MARGIN);
       trElement.appendChild(tdElement);

       var tdElement = document.createElement("TD");
       trElement.appendChild(tdElement);

       var inputElement = document.createElement("INPUT");
       inputElement.setAttribute("type","checkbox");
       inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + "." + i);
       inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + "." + i);
       inputElement.setAttribute("value", currItem.options[i].value);
       inputElement.setAttribute("height", "15");

       var textElement = document.createElement("SPAN");
       textElement.innerText = currItem.options[i].text;

       tdElement.appendChild(inputElement);
       tdElement.appendChild(textElement);
   }
   divElement.appendChild(tableElement);
}


function createKeyItem(divElement, currItem){

   var tableElement = createSimpleTable("0", "0", "0", "100%")
   var tbodyElement = document.createElement("TBODY");
   tableElement.appendChild(tbodyElement);

   var trElement = document.createElement("TR");
   tbodyElement.appendChild(trElement);

   // first column
   var tdElement = document.createElement("TD");
   tdElement.setAttribute("width", LEFT_MARGIN);
   trElement.appendChild(tdElement);

    // second column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "10%");
    trElement.appendChild(tdElement);
    var selectElement = document.createElement("SELECT");
    selectElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".operator");
    selectElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".operator");
    selectElement.setAttribute("className", SELECT_CLASS);
    selectElement.style.width = "95%";
    tdElement.appendChild(selectElement);

    // third column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "20%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type","text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name);
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name);
    inputElement.setAttribute("className", INPUT_CLASS);
    inputElement.setAttribute("preset", "string");
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    // forth column
    var tdElement = document.createElement("TD");
    trElement.appendChild(tdElement);
    var imgElement = document.createElement("IMG");
    imgElement.setAttribute("id", "img." + currItem.parentSection + "." +  currItem.name);
    imgElement.setAttribute("src", GetPath("static") + "images/table_icon2.gif");
    imgElement.setAttribute("onclick", popupMSMap);
	imgElement.style.cursor = "hand";
    tdElement.appendChild(imgElement);

/* No equal
    var optionElement = document.createElement("OPTION");
    optionElement.text = "=";
    optionElement.value = "equal";
    selectElement.options.add(optionElement);
*/
    var optionElement = document.createElement("OPTION");
    optionElement.text = "In";
    optionElement.value = "in";
    selectElement.options.add(optionElement);

    divElement.appendChild(tableElement);
}

function createMapItem(divElement, currItem){

    var tableElement = createSimpleTable("0", "0", "0", "100%")
    var tbodyElement = document.createElement("TBODY");
    tableElement.appendChild(tbodyElement);

    var trElement = document.createElement("TR");
    tbodyElement.appendChild(trElement);

    // first column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", LEFT_MARGIN);
    trElement.appendChild(tdElement);

    // second column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "10%");
    trElement.appendChild(tdElement);
    var selectElement = document.createElement("SELECT");
    selectElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".operator");
    selectElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".operator");
    selectElement.setAttribute("className", SELECT_CLASS);
    selectElement.style.width = "95%";
    tdElement.appendChild(selectElement);

    // third column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "20%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type", "text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name);
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name);
    inputElement.setAttribute("className", INPUT_CLASS);
    inputElement.setAttribute("preset", "string");
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "64%");
    trElement.appendChild(tdElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "=";
    optionElement.value = "equal";
    optionElement.selected = true;
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "<";
    optionElement.value = "less_than";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = ">";
    optionElement.value = "greater_than";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "<=";
    optionElement.value = "less_equal";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = ">=";
    optionElement.value = "greater_equal";
    selectElement.options.add(optionElement);

    var optionElement = document.createElement("OPTION");
    optionElement.text = "<>";
    optionElement.value = "not_equal";
    selectElement.options.add(optionElement);

    divElement.appendChild(tableElement);
////////////////////

    var table2Element = createSimpleTable("0", "0", "0", "100%")
    var tbodyElement = document.createElement("TBODY");
    table2Element.appendChild(tbodyElement);

    // 1st row
    var trElement = document.createElement("TR");
    tbodyElement.appendChild(trElement);

    // 1st column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", LEFT_MARGIN);
    trElement.appendChild(tdElement);

    // 2nd column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);
    var textElement = document.createElement("SPAN");
    textElement.innerText = "Segment";
    tdElement.appendChild(textElement);

    // 3rd column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type", "text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".segment1");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".segment1");
    inputElement.setAttribute("className", SELECT_CLASS);
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    // 4th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "10%");
    trElement.appendChild(tdElement);
    var textElement = document.createElement("SPAN");
    textElement.innerText = "Between";
    tdElement.appendChild(textElement);

    // 5th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type", "text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".segment2");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".segment2");
    inputElement.setAttribute("className", SELECT_CLASS);
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    // 6th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "8%");
    trElement.appendChild(tdElement);
    var textElement = document.createElement("SPAN");
    textElement.innerText = "and";
    tdElement.appendChild(textElement);

    // 7th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type", "text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".segment3");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".segment3");
    inputElement.setAttribute("className", SELECT_CLASS);
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    // 8th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "16%");
    trElement.appendChild(tdElement);
    var imgElement = document.createElement("IMG");
    imgElement.setAttribute("id", "img." + currItem.parentSection + "." +  currItem.name + ".segment");
    imgElement.setAttribute("src", GetPath("static") + "images/table_icon2.gif");
    imgElement.setAttribute("onclick", popupSegment);
	imgElement.style.cursor = "hand";
    tdElement.appendChild(imgElement);

    // 2nd row
    // 1st row
    var trElement = document.createElement("TR");
    tbodyElement.appendChild(trElement);

    // 1st column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", LEFT_MARGIN);
    trElement.appendChild(tdElement);

    // 2nd column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);
    var textElement = document.createElement("SPAN");
    textElement.innerText = "Intersection";
    tdElement.appendChild(textElement);

    // 3rd column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type", "text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".intersection1");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".intersection1");
    inputElement.setAttribute("className", SELECT_CLASS);
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    // 4th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "10%");
    trElement.appendChild(tdElement);
    var textElement = document.createElement("SPAN");
    textElement.innerText = "Between";
    tdElement.appendChild(textElement);

    // 5th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type", "text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".intersection2");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".intersection2");
    inputElement.setAttribute("className", SELECT_CLASS);
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    // 6th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "8%");
    trElement.appendChild(tdElement);
    var imgElement = document.createElement("IMG");
    imgElement.setAttribute("id", "img." + currItem.parentSection + "." +  currItem.name + ".intersection");
    imgElement.setAttribute("src", GetPath("static") + "images/table_icon2.gif");
    imgElement.setAttribute("onclick", popupIntersection);
	imgElement.style.cursor = "hand";
    tdElement.appendChild(imgElement);

    // 7th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);

    // 8th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "16%");
    trElement.appendChild(tdElement);

    // 3nd row
    // 1st row
    var trElement = document.createElement("TR");
    tbodyElement.appendChild(trElement);

    // 1st column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", LEFT_MARGIN);
    trElement.appendChild(tdElement);

    // 2nd column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);
    var textElement = document.createElement("SPAN");
    textElement.innerText = "Community/Monument";
    tdElement.appendChild(textElement);

    // 3rd column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);
    var inputElement = document.createElement("INPUT");
    inputElement.setAttribute("type", "text");
    inputElement.setAttribute("id", currItem.parentSection + "." +  currItem.name + ".community");
    inputElement.setAttribute("name", currItem.parentSection + "." +  currItem.name + ".community");
    inputElement.setAttribute("className", SELECT_CLASS);
    inputElement.style.width = "95%";
    tdElement.appendChild(inputElement);

    // 4th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "10%");
    trElement.appendChild(tdElement);
    var imgElement = document.createElement("IMG");
    imgElement.setAttribute("id", "img." + currItem.parentSection + "." +  currItem.name + ".community");
    imgElement.setAttribute("src", GetPath("static") + "images/table_icon2.gif");
    imgElement.setAttribute("onclick", popupCommunity);
	imgElement.style.cursor = "hand";
    tdElement.appendChild(imgElement);

    // 5th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);

    // 6th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "8%");
    trElement.appendChild(tdElement);

    // 7th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "15%");
    trElement.appendChild(tdElement);

    // 8th column
    var tdElement = document.createElement("TD");
    tdElement.setAttribute("width", "16%");
    trElement.appendChild(tdElement);

    divElement.appendChild(table2Element);
////////////////////
}

function createSimpleTable(cellPadding, cellSpacing, border, width){
   var tableElement = document.createElement("TABLE");
   tableElement.setAttribute("cellPadding", cellSpacing);
   tableElement.setAttribute("cellSpacing", cellSpacing);
   tableElement.setAttribute("border", border);
   tableElement.setAttribute("width", width);
   return tableElement;
}

// Actions
function createSubmitURL(){
    var pars = String();
    var par  = String();
    for (var i=0;i<formModel.sections.length;i++){
        var items = formModel.sections[i].items;
        var currSection = formModel.sections[i].name;
        for (var j=0;j<items.length;j++){
            var currItem = items[j].name;
            var currBranch = currSection + "." + currItem;
            var divElement = document.getElementById("div_" + currSection + "_" + currItem);
            if (divElement.children.length != 0){
                switch (items[j].type){
                    case "integer":
                        if (document.getElementById(currBranch + ".from").value != "")
                            if (document.getElementById(currBranch + ".operator").value == "between")
                                par = CRITERIA_PREFFIX + currBranch + "." +
                                      document.getElementById(currBranch + ".operator").value + "=" +
                                      document.getElementById(currBranch + ".from").value + ";" +
                                      document.getElementById(currBranch + ".to").value;
                            else
                                par = CRITERIA_PREFFIX + currBranch + "." +
                                      document.getElementById(currBranch + ".operator").value + "=" +
                                      document.getElementById(currBranch + ".from").value;
                        break;
                    case "varchar":
                        if (document.getElementById(currBranch + ".from").value != "")
                            if (document.getElementById(currBranch + ".operator").value == "between")
                                par = CRITERIA_PREFFIX + currBranch + "." +
                                      document.getElementById(currBranch + ".operator").value + "=" +
                                      document.getElementById(currBranch + ".from").value + ";" +
                                      document.getElementById(currBranch + ".to").value;
                            else
                                par = CRITERIA_PREFFIX + currBranch + "." +
                                      document.getElementById(currBranch + ".operator").value + "=" +
                                      document.getElementById(currBranch + ".from").value;
                        break;
                    case "date":
                        if ((document.getElementById(currBranch + ".from").value.length == 0) &&
                            (document.getElementById(currBranch + ".to").value.length > 0)){
                            par = CRITERIA_PREFFIX + currBranch + ".between_date" + "=" +
                                  document.getElementById(currBranch + ".to").value;
                        }
                        if ((document.getElementById(currBranch + ".from").value.length > 0) &&
                            (document.getElementById(currBranch + ".to").value.length == 0)){
                            par = CRITERIA_PREFFIX + currBranch + ".between_date" + "=" +
                                  document.getElementById(currBranch + ".from").value;
                        }
                        if ((document.getElementById(currBranch + ".from").value.length > 0) &&
                            (document.getElementById(currBranch + ".to").value.length > 0)){
                            par = CRITERIA_PREFFIX + currBranch + ".between_date" + "=" +
                                  document.getElementById(currBranch + ".from").value + ";" +
                                  document.getElementById(currBranch + ".to").value;
                        }
                        break;
                    case "enumeration":
                        var options = items[j].options;
                        var subPar = new String();
                        for (var k=0;k<options.length;k++)
                            if (document.getElementById(currBranch + "." + k).checked) subPar = subPar + document.getElementById(currBranch + "." + k).value + ";";
                        if (subPar.length > 0) par =  CRITERIA_PREFFIX + currBranch + ".in" + "=" + removeFromLast(subPar, ";");
                        break;
                    case "key":
                        if (document.getElementById(currBranch).value.length != 0){
                            par = CRITERIA_PREFFIX + currBranch + "." +
                                  document.getElementById(currBranch + ".operator").value + "=" +
                                  document.getElementById(currBranch).value;
                        }
                        break;
                    case "map":
                        if (document.getElementById(currBranch).value.length != 0){
                            par = CRITERIA_PREFFIX + currBranch + "." +
                                  document.getElementById(currBranch + ".operator").value + "=" +
                                  document.getElementById(currBranch).value;
                        }
                        break;
                }
                if (par.length > 0 )  pars = par + "&" + pars ;
            }
        }
    }

 //  alert("pars: " + createCriteriaSpec() + "&" + removeFromLast(pars,"&"));
   return createCriteriaSpec() + "&" + removeFromLast(pars,"&");
}

// Load criteria
function loadCriterion(criteriaObj, currItem){
    for (var i=0;i<criteriaObj.criterions.length;i++){
        var currCriterion = criteriaObj.criterions[i];
        var criteriaItem = currCriterion.section + "." + currCriterion.item;
        var modelItem = currItem.parentSection + "." + currItem.name;
        if (criteriaItem == modelItem){
            switch (currItem.type){
                case "integer":
                    var valueArr = getArrValue(currCriterion.value);
                    if (valueArr.length == 1)
                        document.getElementById(modelItem + ".from").value = valueArr[0];
                    else if (valueArr.length == 2){
                        document.getElementById(modelItem + ".from").value = valueArr[0];
                        document.getElementById(modelItem + ".to").value   = valueArr[1];
                        document.getElementById(modelItem + ".to").style.display = "block";
                    }
                    for (var j=0;j<document.getElementById(modelItem + ".operator").length;j++)
                          if (document.getElementById(modelItem + ".operator").options(j).value == currCriterion.operator)
                              document.getElementById(modelItem + ".operator").options(j).selected = true;
                    break;
                case "varchar":
                    var valueArr = getArrValue(currCriterion.value);
                    if (valueArr.length == 1)
                        document.getElementById(modelItem + ".from").value = valueArr[0];
                    else if (valueArr.length == 2){
                        document.getElementById(modelItem + ".from").value = valueArr[0];
                        document.getElementById(modelItem + ".to").value   = valueArr[1];
                        document.getElementById(modelItem + ".to").style.display = "block";
                    }
                    for (var j=0;j<document.getElementById(modelItem + ".operator").length;j++)
                          if (document.getElementById(modelItem + ".operator").options(j).value == currCriterion.operator)
                              document.getElementById(modelItem + ".operator").options(j).selected = true;
                    break;
                case "date":
                    var valueArr = getArrValue(currCriterion.value);
                    if (valueArr.length == 1)
                        document.getElementById(modelItem + ".from").value = valueArr[0];
                    else if (valueArr.length == 2){
                        document.getElementById(modelItem + ".from").value = valueArr[0];
                        document.getElementById(modelItem + ".to").value   = valueArr[1];
                    }
                    break;
                case "enumeration":
                    var valueArr = getArrValue(currCriterion.value);
                    var options  = currItem.options;
                    for (var m=0;m<valueArr.length;m++)
                        for (var n=0;n<options.length;n++)
                            if (document.getElementById(modelItem + "." + n).value == valueArr[m]) document.getElementById(modelItem + "." + n).checked = true;
                    break;
                case "key":
                    document.getElementById(modelItem).value = currCriterion.value;
                    for (var j=0;j<document.getElementById(modelItem + ".operator").length;j++)
                          if (document.getElementById(modelItem + ".operator").options(j).value == currCriterion.operator)
                              document.getElementById(modelItem + ".operator").options(j).selected = true;
                    break;
                case "map":
                    document.getElementById(modelItem).value = currCriterion.value;
                    for (var j=0;j<document.getElementById(modelItem + ".operator").length;j++)
                          if (document.getElementById(modelItem + ".operator").options(j).value == currCriterion.operator)
                              document.getElementById(modelItem + ".operator").options(j).selected = true;
                    break;
            }
        }
    }
}

function expandItems(){
   var OPENED_IMG = GetPath("static") + "images/minus.gif";
   var CLOSED_IMG = GetPath("static") + "images/plus.gif";

   for (var i=0;i<formModel.sections.length;i++){
        var currSection = formModel.sections[i];
        for (var j=0;j<currSection.items.length;j++){
            currItem = currSection.items[j];
            var divIdItem    = "div_" + currSection.name + "_" + currItem.name;
            if (document.getElementById(divIdItem).children.length != 0){
                var currElement = currSection.name + "." + currItem.name;
                switch (currItem.type){
                    case "integer":
                        if ((document.getElementById(currElement + ".from").value.length > 0) ||
                            (document.getElementById(currElement + ".to").value.length > 0)){
                            Toggle(currSection.name, OPENED_IMG, CLOSED_IMG, "open");
                            Toggle(currSection.name + "_" + currItem.name, OPENED_IMG, CLOSED_IMG, "open");
                        }
                        break;
                    case "varchar":
                        if ((document.getElementById(currElement + ".from").value.length > 0) ||
                            (document.getElementById(currElement + ".to").value.length > 0)){
                            Toggle(currSection.name, OPENED_IMG, CLOSED_IMG, "open");
                            Toggle(currSection.name + "_" + currItem.name, OPENED_IMG, CLOSED_IMG, "open");
                        }
                        break;
                    case "date":
                        if ((document.getElementById(currElement + ".from").value.length > 0) ||
                            (document.getElementById(currElement + ".to").value.length > 0)){
                            Toggle(currSection.name, OPENED_IMG, CLOSED_IMG, "open");
                            Toggle(currSection.name + "_" + currItem.name, OPENED_IMG, CLOSED_IMG, "open");
                        }
                        break;
                    case "enumeration":
                        for (var k=0;k<currItem.options.length;k++){
                            if (document.getElementById(currElement + "." + k).checked){
                                Toggle(currSection.name, OPENED_IMG, CLOSED_IMG, "open");
                                Toggle(currSection.name + "_" + currItem.name, OPENED_IMG, CLOSED_IMG, "open");
                                break;
                            }
                        }
                        break;
                    case "key":
                        if (document.getElementById(currElement).value.length > 0){
                            Toggle(currSection.name, OPENED_IMG, CLOSED_IMG, "open");
                            Toggle(currSection.name + "_" + currItem.name, OPENED_IMG, CLOSED_IMG, "open");
                        }
                        break;
                    case "map":
                        if (document.getElementById(currElement).value.length > 0){
                            Toggle(currSection.name, OPENED_IMG, CLOSED_IMG, "open");
                            Toggle(currSection.name + "_" + currItem.name, OPENED_IMG, CLOSED_IMG, "open");
                        }
                        break;
                }
            }
        }
    }
}

function closeItems(){
   var OPENED_IMG = GetPath("static") + "images/minus.gif";
   var CLOSED_IMG = GetPath("static") + "images/plus.gif";

   for (var i=0;i<formModel.sections.length;i++){
        var currSection = formModel.sections[i];
        for (var j=0;j<currSection.items.length;j++){
            currItem = currSection.items[j];
            var divIdItem    = "div_" + currSection.name + "_" + currItem.name;
            if (document.getElementById(divIdItem).children.length != 0){
                var currElement = currSection.name + "." + currItem.name;
                Toggle(currSection.name, OPENED_IMG, CLOSED_IMG, "close");
                Toggle(currSection.name + "_" + currItem.name, OPENED_IMG, CLOSED_IMG, "close");
            }
        }
    }
}

function clearItems(){

   for (var i=0;i<formModel.sections.length;i++){
        var currSection = formModel.sections[i];
        for (var j=0;j<currSection.items.length;j++){
            currItem = currSection.items[j];
            var divIdItem    = "div_" + currSection.name + "_" + currItem.name;
            if (document.getElementById(divIdItem).children.length != 0){
                var currElement = currSection.name + "." + currItem.name;
                switch (currItem.type){
                    case "integer":
                        document.getElementById(currElement + ".from").value = "";
                        document.getElementById(currElement + ".to").value = "";
                        for (var t=0;t<document.getElementById(currElement + ".operator").length;t++)
                              if (document.getElementById(currElement + ".operator").options(t).value == "equal")
                                  document.getElementById(currElement + ".operator").options(t).selected = true;
                        break;
                    case "varchar":
                        document.getElementById(currElement + ".from").value = "";
                        document.getElementById(currElement + ".to").value = "";
                        for (var t=0;t<document.getElementById(currElement + ".operator").length;t++)
                              if (document.getElementById(currElement + ".operator").options(t).value == "equal")
                                  document.getElementById(currElement + ".operator").options(t).selected = true;
                        break;
                    case "date":
                        document.getElementById(currElement + ".from").value = "";
                        document.getElementById(currElement + ".to").value = "";
                        break;
                    case "enumeration":
                        for (var k=0;k<currItem.options.length;k++)
                            if (document.getElementById(currElement + "." + k).checked)
                                document.getElementById(currElement + "." + k).checked = false;
                        break;
                    case "key":
                        document.getElementById(currElement).value = "";
                        for (var t=0;t<document.getElementById(currElement + ".operator").length;t++)
                              if (document.getElementById(currElement + ".operator").options(t).value == "equal")
                                  document.getElementById(currElement + ".operator").options(t).selected = true;
                        break;
                    case "map":
                        document.getElementById(currElement).value = "";
                        for (var t=0;t<document.getElementById(currElement + ".operator").length;t++)
                              if (document.getElementById(currElement + ".operator").options(t).value == "equal")
                                  document.getElementById(currElement + ".operator").options(t).selected = true;
                        break;
                }
            }
        }
    }
}

function loadCriteria(formModelObj, criteriaObj){

    for (var i=0;i<formModelObj.sections.length;i++){
         var currSection = formModelObj.sections[i];
         for (var j=0;j<currSection.items.length;j++){
              var currItem = currSection.items[j];
              if (compareModels(criteriaObj, currItem)) createItems(currItem);
         }
    }
    expandItems(formModelObj);
}

function compareModels_old(formModel, criteriaItem){
    for (var i=0;i<formModel.sections.length;i++){
        var currSection = formModel.sections[i];
        for (var j=0;j<currSection.items.length;j++){
            var currItem = currSection.items[j];
            var itemName = currItem.parentSection + "." + currItem.name;
            if (criteriaItem == itemName) return currSection.name + "_" + currItem.name;
        }
    }
    return null;
}

function compareModels(criteria, currItem){
    for (var i=0;i<criteria.criterions.length;i++){
        var currCriterion = criteria.criterions[i];
        var itemName = currItem.parentSection + "." + currItem.name;
        var criterionName = currCriterion.section + "." + currCriterion.item;
        if (itemName == criterionName) return true;
    }
    return false;
}

function createCriteriaSpec(){
   return   "criteria.id=" + document.getElementById("criteria.id").value + "&" +
            "criteria.name=" + document.getElementById("criteria.name").value + "&" +
            "criteria.description=" + document.getElementById("criteria.description").value + "&" +
            "criteria.modelName=" + document.getElementById("criteria.modelName").value ;
}

function getArrValue(currValue){
   var currValue = new String(currValue);
   var valueArr = new Array();

   var tmp = String();
   var m = -1;

   if (currValue.length != 0) currValue = currValue + ";";
   for (var k=0;k<currValue.length;k++){
       if (currValue.substr(k,1) == ";"){
           m++;
           valueArr[m] = tmp ;
           tmp = "";
       }
       else
          tmp = tmp + currValue.substr(k,1);
   }

   return valueArr;
}

function Toggle(sScope,imgOpen,imgClose,status){
    var imgPlus  = new Image();
    var imgMinus = new Image();

    imgPlus.src =  imgClose;
    imgMinus.src = imgOpen;

    var oTable = document.all["div_" + sScope];
    var oImg   = document.all["img_" + sScope];
    if (status == "close"){
        oImg.src = imgPlus.src;
        oTable.style.display = "none";
    }
    else if (status == "open"){
        oImg.src = imgMinus.src;
        oTable.style.display = "block";
    }
}

function ToggleScope(sScope,imgOpen,imgClose)
{
    var imgPlus = new Image();
    var imgMinus = new Image();

    imgPlus.src =  imgClose;
    imgMinus.src = imgOpen;

    var oTable = document.all["div_" + sScope];
    var oImg = document.all["img_" + sScope];
    if (oTable && oTable.style.display == "block")
    {
        oImg.src = imgPlus.src;
        oTable.style.display = "none";
    }
    else
    {
        oImg.src = imgMinus.src;
        oTable.style.display = "block";
    }
}

function removeFromLast(str, token){
    var newStr = String(str);
    if (newStr.length > 0) newStr = newStr.substr(0,newStr.length-1);
    return newStr;
}

function setElementHide(){
    var caller = event.srcElement;
    var elementName = String(caller.name);
    elementName = elementName.substr(0,elementName.indexOf("operator")) + "to";

    if (caller.value == "between")
        document.getElementById(elementName).style.display = "block";
    else{
        document.getElementById(elementName).style.display = "none";
        document.getElementById(elementName).value = "";
    }
}

function popupCalendar(){
    var caller = event.srcElement;
    var elementName = String(caller.id);
    // because it starts with img.
    var elementName = elementName.substr(4, elementName.length-1);
//    var a = document.forms[0].name + ".all('" + elementName + "')";
    var a = document.forms[0].name + "." + elementName + "";
    show_calendar(a);
}

function popupSegment(){
    var caller = event.srcElement;
    var elementName = String(caller.id);
    // because it starts with img.
    var elementName = elementName.substr(4, elementName.length-1);

    var s1 = document.getElementById(elementName + "1").value;
    var s2 = document.getElementById(elementName + "2").value;
    var s3 = document.getElementById(elementName + "3").value;
    window.open(GetPath('dynamic')+'/template/SearchMapList.jsp/action/Search?eventsubmit_domap_popup=true&layout_template=%2FPopup.jsp&location_type=segment&street1='+ s1 + '&street2=' + s2 + '&street3=' + s3 ,'','height=600,width=800,left=0,top=0,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
}

function popupIntersection(){
    var caller = event.srcElement;
    var elementName = String(caller.id);
    // because it starts with img.
    var elementName = elementName.substr(4, elementName.length-1);

    var s1 = document.getElementById(elementName + "1").value;
    var s2 = document.getElementById(elementName + "2").value;
    window.open(GetPath('dynamic')+'/template/SearchMapList.jsp/action/Search?eventsubmit_domap_popup=true&layout_template=%2FPopup.jsp&location_type=intersection&street1='+ s1 + '&street2=' + s2,'','height=600,width=800,left=0,top=0,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
}

function popupCommunity(){
    var caller = event.srcElement;
    var elementName = String(caller.id);
    // because it starts with img.
    var elementName = elementName.substr(4, elementName.length-1);
    var s1 = document.getElementById(elementName + "1").value;
    window.open(GetPath('dynamic')+'/template/SearchMapList.jsp/action/Search?eventsubmit_domap_popup=true&layout_template=%2FPopup.jsp&location_type=monument&street1='+ s1,'','height=600,width=800,left=0,top=0,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
}

function popupMSMap()
{
    var caller = event.srcElement;
    var elementName = String(caller.id);
    // because it starts with img.
    var elementName = elementName.substr(4, elementName.length-1);
    var a = document.getElementById(elementName).value;
    if (a == '')
        a = 'N/A';
    var m = 'map_id=';
    var p = '&map_id=';
    for (var it = 0; it < a.length; it++)
    {
            var c = a.charAt(it);
            if (c == ';')
                m += p;
            else
                m += c;
    }
    window.open(GetPath('dynamic')+'/template/SelectMapForm.jsp/action/VgMapper?eventsubmit_doPrepare_map=true&layout_template=%2FPopup.jsp&next_page=true&map_location_type=multiple&'+ m,'','height=600,width=800,left=0,top=0,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes');
}
