// JavaScript Document
// enhanced String (should go in main)
String.prototype.trim =
    function () {
        return this.replace(/(^\s*)|(\s*$)/g, "");
    }

// table controller class
function t_Controller() {
    this.tables = new Array();
    this.form = document.forms["_tform"];
    this.addTable = function(table) {
        this.tables[this.tables.length] = table;
    }
    this.getTable = function(name) {
        for (var i = 0; i < this.tables.length; ++i)
            if (this.tables[i].name == name) return this.tables[i];
        return null;
    }
    this.submit = function(method) {
        this.form.method = method;
        for (var i = 0; i < this.tables.length; ++i) {
            this.form.elements["_tcgis_"+this.tables[i].name].value = this.tables[i].toXml();
// alert(this.form.elements["_tcgis_"+this.tables[i].name].value);
        }
        this.form.submit();
    }
}

// table (data) class
function t_Table(name, tag, page, sortId, sortAscending, selectableCount, selectedCount) {
    this.name = name;
    this.tag = tag;
    this.page = page;
    this.sortId = sortId;
    this.sortAscending = sortAscending;
    this.selectableCount = selectableCount;
    this.selectedCount = selectedCount;
    this.selectAll = false;
    this.selectNone = false;
    this.selectOps = new Array();
    this.action = "";
    this.inlineInputs = new Array();
    this.clearSelectOps = function() {
        this.selectOps.length = 0;
    }
    this.addSelectOp = function(op) {
        this.selectOps[this.selectOps.length] = op;
    }
    this.removeSelectOp = function(value) {
        for (var i = 0; i < this.selectOps.length; ++i) {
            if (this.selectOps[i].substring(1) == value) {
                this.selectOps.splice(i, 1);
                return;
            }
        }
    }
    this.getElementById = function(id) {
        return document.getElementById("#_t" + id + "_" + this.name);
    }
    this.toXml = function() {
        var ret = '<tcgis';
        ret += ' tag="' + this.tag + '"';
        ret += ' page="' + this.page + '"';
        ret += '>';
        if (this.sortId) {
            ret += '<sort';
            ret += ' id="' + this.sortId + '"';
            ret += ' asc="' + (this.sortAscending ? '1': '0') + '"';
            ret += ' />';
        }
        if (this.selectableCount > 0 && (this.selectAll || this.selectNone || this.selectOps.length > 0)) {
            ret += '<sel';
            if (this.selectAll) ret += ' all="1"';
            else if (this.selectNone) ret += ' none="1"';
            ret += '>';
            for (var i = 0; i < this.selectOps.length; ++i)
                ret += '<selop>' + this.selectOps[i] + '</selop>';
            ret += '</sel>';
        }
        if (this.action) {
            ret += '<act>';
            ret += this.action;
            ret += '</act>';
        }
        if (this.inlineInputs.length > 0) {
            for (var i = 0; i < this.inlineInputs.length; ++i) {
                ret += '<inp name="' + this.inlineInputs[i][0] + '">';
                ret += this.inlineInputs[i][1];
                ret += '</inp>';
            }
        }
        ret += '</tcgis>';
        return ret;
    }
    this.gotoPage = function(page) {
        this.page = page;
        _tctl.submit("get");
    }
    this.gotoBoxPage = function(boxname) {   
         to = document.getElementById(boxname).value;   
         this.page = to;   
         _tctl.submit("get");   
     } 
    
    this.sort = function(sortId, ascending) {
        this.sortId = sortId;
        this.sortAscending = ascending;
        _tctl.submit("get");
    }
    this.radioClick = function(r) {
        this.clearSelectOps();
        if (r.checked) {
            if (this.selectedCount == 0 || !r.defaultChecked) {
                // only if no previous selection (count == 0), or
                // selection changed
                this.addSelectOp("=" + r.value);
                this.selectedCount = 1;
            }
        }
        else {
            if (this.selectedCount > 0) {
                this.addSelectOp("=");
                this.selectedCount = 0;
            }
        }
    }
    this.checkboxClick = function(c) {
        this.doCheckboxClick(c);
        this.updateSelectedCount();
    }
    this.doCheckboxClick = function(c) {
        this.removeSelectOp(c.value);
        if (c.checked) {
            if (this.selectNone || (!c.defaultChecked && !this.selectAll)) {
                this.addSelectOp("+" + c.value);
            }
            ++this.selectedCount;
        }
        else {
            if (this.selectAll || (c.defaultChecked && !this.selectNone)) {
                this.addSelectOp("-" + c.value);
            }
            --this.selectedCount;
        }
    }
    this.updateSelectedCount = function() {
        var e = this.getElementById("selected_count");
        if (e) e.innerHTML = this.selectedCount;
    }
    this.doSelectNone = function(form) {
        for (var i = 0; i < form.elements.length; i++) {
            var field = form.elements[i];
            if (field.type == "checkbox" && field.name == "_tcheckbox" && field.checked) {
                field.checked = false;
            }
        }
        this.selectAll = false;
        this.selectNone = true;
        this.clearSelectOps();
        this.selectedCount = 0;
        this.updateSelectedCount();
    }
    this.doSelectPage = function(form) {
        for (var i = 0; i < form.elements.length; i++) {
            var field = form.elements[i];
            if (field.type == "checkbox" && field.name == "_tcheckbox" && !field.checked) {
                field.checked = true;
		        this.doCheckboxClick(field);
            }
        }
        this.updateSelectedCount();
    }
    this.doSelectAll = function(form) {
        for (var i = 0; i < form.elements.length; i++) {
            var field = form.elements[i];
            if (field.type == "checkbox" && field.name == "_tcheckbox" && !field.checked) {
                field.checked = true;
            }
        }
        this.selectAll = true;
        this.selectNone = false;
        this.clearSelectOps();
        this.selectedCount = this.selectableCount;
        this.updateSelectedCount();
    }
    this.actionChange = function(a) {
        this.action = a.options[a.selectedIndex].value;
    }
    this.doAction = function(noActionMsg, noSelectMsg) {
        if (!this.action) {
            if (!noActionMsg) noActionMsg = "Please select an action to perform.";
            alert(noActionMsg);
            return;
        }
        if (this.selectedCount < 1) {
            if (!noSelectMsg) noSelectMsg = "Please select data row to perform action on.";
            alert(noSelectMsg);
            return;
        }
        _tctl.submit("post");
    }
    this.doAction2 = function(noActionMsg, noSelectMsg, formName, selectName) {
    	//pervent Firefox not see the selected action in the select dropdown
		var form = document.forms[formName];
		var select = form.elements[selectName]; 
		this.action = select.options[select.selectedIndex].value;
		
        if (!this.action) {
            if (!noActionMsg) noActionMsg = "Please select an action to perform.";
            alert(noActionMsg);
            return;
        }
        if (this.selectedCount < 1) {
            if (!noSelectMsg) noSelectMsg = "Please select data row to perform action on.";
            alert(noSelectMsg);
            return;
        }
        _tctl.submit("post");
    }
    
    this.setInlineInput = function(name, value) {
        for (var i = 0; i < this.inlineInputs.length; ++i) {
            if (this.inlineInputs[i][0] == name) {
                if (this.inlineInputs[i][1] == value) return;  // nothing changed
                this.inlineInputs.splice(i, 1);
                break;
            }
        }
        this.inlineInputs[this.inlineInputs.length] = [name, value];
    }
    this.inlineInputChange = function(i) {
        i.value = i.value.trim();
        this.setInlineInput(i.name, i.value);
    }
    this.inlineSelectChange = function(s) {
        this.setInlineInput(s.name, s.selectedIndex >= 0 ? s.options[s.selectedIndex].value : "");
    }
    this.inlineRadioChange = function(r) {
        this.setInlineInput(r.name, r.checked ? r.value : "");
    }
    this.inlineMultiSelectChange = function(s, delim) {
        var v = new Array();
        for (var i = 0; i < s.options.length; ++i) {
            if (s.options[i].selected) v[v.length] = s.options[i].value;
        }
        this.setInlineInput(s.name, v.join(delim));
    }
}
