var columnsSize = undefined;
var displayWhenEmpty = true;
var emptyMessage = "Nenhum registro encontrado.";

/**
 * Obtem um valor de uma determinada linha e coluna em um grid
 */
function getGridValue(id, col, row) {
    var retorno;

    try {
        var campo = "#" + id + "-" + col + "-" + row;

        jQuery(campo, document.body).each(function () {
            var colElement = jQuery(this).get(0);
            retorno = colElement.innerHTML;
        });
    } catch (e) {
        alert("getGridValue: " + e);
    }

    return retorno;
}

/**
 * Define um valor em uma determinada linha e coluna de um grid
 */
function setGridValue(id, col, row, value) {
    try {
        var campo = "#" + id + "-" + col + "-" + row;

        jQuery(campo, document.body).each(function () {
            jQuery(this).get(0).innerHTML = value;
        });
    } catch (e) {
        alert("setGridValue: " + e);
    }
}


function hideDivs(id) {
    var el = document.getElementById(id).childNodes;
    for(var i=0; i<el.length; i++) {
        if(el[i].tagName== 'DIV') {
            el[i].style.display = 'none';
        }
    }
}

function mountGrid( data, id, rpp) {
    var nPages = Math.round( (data.rows.length / rpp) + 0.49999);
    var out = '';
    var linhaCorreta = 0;

    for(var i=0; i<nPages; i++) {
        if(i==0) {
            out +="<div id='"+id+":" + i +"' style='display : ;'>\n";
        } else {
            out +="<div id='"+id+":" + i +"' style='display : none ;'>\n";
        }

        out +="<table cellpadding='0' cellspacing='1' class='styleTableBorder'>";

        out += "<tr class='styleTableHeader'>";

        for(var l=0; l < data.columns.length; l++) {
            if( (columnsSize!=undefined) && (columnsSize[l]!=undefined) ) {
                out += "<td width=\"" + columnsSize[l] + "\">" + data.columns[l] + "</td>";
            } else {
                out += "<td>" + data.columns[l] + "</td>";
            }
        }

        if(data.removeLinks) {
            out += "<td>&nbsp;</td>";
        }

        out += "</tr>";

        for(var j=0; j<rpp; j++) {
            var row = data.rows[((i*rpp)+j)];
            var link = undefined;

            if(data.links) {
                link = data.links[((i*rpp)+j)];
            }

            var removeLink = undefined;
            if(data.removeLinks) {
                removeLink = data.removeLinks[((i*rpp)+j)];
            }
            if(row!= undefined) {
                if((j % 2) == 0) {
                    out += "<tr class='styleTableRow1' style='background:#EFEFEF;";
                } else {
                    out += "<tr class='styleTableRow' style='background:#FFFFFF;";
                }
                if(link!=undefined) {
                    out+="cursor : pointer;' onmouseover='javascript:tableMouseOver(this);' onmouseout='javascript:tableMouseOut(this);' ";
                } else {
                    out+="'";
                }
                out+=">";
                
                linhaCorreta++;
                for(var k=0; k<row.length; k++) {
                   
                    var aux = row[k] + "";

                    // Define um ID para a linha
                    aux = "<span id='"+id+"-"+k+"-"+linhaCorreta+"'>" + aux + "</span>";

                    if(aux == "true") {
                        aux = "<input disabled='true' type='checkbox' checked>";
                    } else if(aux == "false") {
                        aux = "<input disabled='true' type='checkbox'>";
                    }

                    if(link!=undefined) {
                        if (aux.indexOf("<input") != -1) {
                            out+="<td>" + aux + "</td>";
                        } else if (aux.indexOf("<select") != -1) {
                            out+="<td>" + aux + "</td>";
                        } else if (aux.indexOf("<button") != -1) {
                            out+="<td>" + aux + "</td>";
                        } else {
                            out+="<td href=\"#\" onclick=\"" + link + "\">" + aux + "</td>";
                        }
                    } else {
                        out+="<td id='"+id+"-col-"+j+"'>" + aux + "</td>";
                    }

                }
                if(removeLink!=undefined) {
                    out+="<td style='cursor : pointer;' href=\"#\" onclick=\"" + removeLink + "\" align='center'><img src='../../images/remove.png'/></td>";
                }

                out += "</tr>";
            } else {
                out +="<tr class='styleTableRowBlank'><td colspan='" + data.columns.length + "'>&nbsp;</tr></td>";
            }

        }
        if(data.sum) {
            out +="<tr class='styleTableBottom'><td align=\"right\" colspan='" + (data.columns.length-1) + "'><b>" + data.sumLabel + "&nbsp;</b></td><td align=\"center\"><b>" + data.sum + "</b></td></tr>";
        }

        out += "<tr class='styleTableBottom'>";

        if(data.removeLinks) {
            out +="<td colspan='" + (data.columns.length + 1) + "' width='100%'>";
        } else {
            out +="<td colspan='" + data.columns.length + "' width='100%'>";
        }

        //out +="<div style='position:relative; width:100%;'>\n"
        out +="<table border='0' width='100%'; style='width : 100%;'><tr>\n"

        //out += "<div style='left: 0%; position:absolute; display:inline;' class='styleTableFooterPagingControler'>\n";
        out += "<td width='50%' class='styleTableFooterPagingControler'>\n";

        if(i>0) {
            out+="<a href='#' onclick='javascript: hideDivs(\""+id+"\"); document.getElementById(\"" + id + ":" + 0  + "\").style.display = \"\";'> &laquo; Primeira </a>";
            out+="<a href='#' onclick='javascript: hideDivs(\""+id+"\"); document.getElementById(\"" + id + ":" + (i-1)  + "\").style.display = \"\";'> &lt; </a>";
        } else {
            out += ' &laquo; Primeira &lt; ';
        }

        for(var m=0; m<nPages; m++) {
            if(m==i) {
                out+= " <b>" + (m+1) + "</b> ";
            } else {
                out+="<a href='#' onclick='javascript: hideDivs(\""+id+"\"); document.getElementById(\"" + id + ":" + (m)  + "\").style.display = \"\";'> " + (m+1) + " </a>";
            }
        }

        if(i < (nPages-1)) {
            out+="<a href='#' onclick='javascript: hideDivs(\""+id+"\"); document.getElementById(\"" + id + ":" + (i+1)  + "\").style.display = \"\" ;'> &gt; </a>";
            out+="<a href='#' onclick='javascript: hideDivs(\""+id+"\"); document.getElementById(\"" + id + ":" + (nPages -1)  + "\").style.display = \"\" ;'> Ultima » </a>";
        } else {
            out+=" &gt; Ultima &raquo; ";
        }

        //out += "</div>";
        out += "</td>";


        //out += "<div style='right: 0%; position:absolute; display:inline;' class='styleTableFooterPaging'>";


        out += "<td width='50%' align='right' class='styleTableFooterPaging'>";


        out += "P&aacute;gina " + (i+1) + " a " + nPages + " (" + data.rows.length + " itens)";

        //out += "</div>";
        out += "</td>";

        //out += "</div>";
        out += "</tr></table>";

        out += "</td>";
        out += "</tr>";


        out +="</table>\n";
        out +="</div>\n\n";

    }

    if((displayWhenEmpty)&&(out == '')) {
        out +="<div style='display : ;'>\n";

        out +="<table cellpadding='0' cellspacing='1' class='styleTableBorder'>\n";



        out +="<tr class='styleTableRowBlank'><td align=\"center\">" + emptyMessage + "</tr></td>\n";
        for(var z=0; z<rpp; z++) {
            out +="<tr class='styleTableRowBlank'><td>&nbsp;</tr></td>\n";
        }

        out += '</table>\n</div>';

    }
    document.getElementById(id).innerHTML = out;
}


function tableMouseOver(element) {
    element.style.background = '#D7E7FB';
}
function tableMouseOut(element) {
    if(element.className == 'styleTableRow1') {
        element.style.background = '#EFEFEF';
    } else {
        element.style.background = 'white';
    }
}












/* seletor */
function selectorAdd(contentId) {    
    var s = document.getElementById(contentId).selector;
    var els = document.getElementById(contentId +"Source").options;
    for(var i=0; i<els.length; i++) {
        if(els[i].selected) {
            if(isNaN(els[i].value)){
                s.add(els[i].value)
            }else{
                s.add(parseInt(els[i].value));
            }
            
        }
    }
    s.renderer();
    if(document.getElementById(contentId +"Source").options.length>0) {
        document.getElementById(contentId +"Source").focus();
    } else {
        document.getElementById(contentId +"Selected").focus();
    }


}

function selectorRemove(contentId) {
    var s = document.getElementById(contentId).selector;
    var els = document.getElementById(contentId +"Selected").options;
    for(var i=0; i<els.length; i++) {
        if(els[i].selected) {
            if(isNaN(els[i].value)){
                s.remove(els[i].value);
            }else{
                s.remove(parseInt(els[i].value));
            }            
        }
    }
    s.renderer();
    if(document.getElementById(contentId +"Selected").options.length>0) {
        document.getElementById(contentId +"Selected").focus();
    } else {
        document.getElementById(contentId +"Source").focus();
    }
}

function selectorAddAll(contentId) {
    document.getElementById(contentId).selector.addAll();
    document.getElementById(contentId).selector.renderer();
    document.getElementById(contentId +"Selected").focus();
}

function selectorRemoveAll(contentId) {
    document.getElementById(contentId).selector.removeAll();
    document.getElementById(contentId).selector.renderer();
    document.getElementById(contentId +"Source").focus();
}

function selectorRemoveAllSource(contentId) {
    document.getElementById(contentId).selector.removeAllSource();
    document.getElementById(contentId).selector.renderer();
    document.getElementById(contentId +"Source").focus();
}


function Item(id, nome, disabled) {
    this.id = id;
    this.nome = nome;
    this.disabled = disabled;

    this.toString = function() {
        return this.nome;
    }

    this.equals = function(obj) {
        return this.id == obj.id;
    }
}

function SortedList() {
    this.list = new Array();

    this.add = function(id ,nome, disabled) {
        this.put(id,nome, disabled);
    }

    this.put = function(id, nome, disabled) {
        var achou = false;
        for(var i=0; i<this.list.length; i++) {
            if(this.list[i].id == id) {
                achou = true;
                break;
            }
        }
        if(achou!=true) {
            this.list.push(new Item(id,nome,disabled));
        }
    }

    this.remove = function(id) {        
        var pos = -1;
        for(var i=0; i<this.list.length; i++) {
            if(this.list[i].id == id) {
                pos = i;
                break;
            }
        }
        if(pos>=0) {
            this.list.splice(pos,1);
        }
    }

    this.getElement = function(id) {
        var pos = -1;
        for(var i=0; i<this.list.length; i++) {
            if(this.list[i].id == id) {
                pos = i;
                break;
            }
        }

        if(pos>=0) {
            return this.list[pos].nome;
        } else {
            return undefined;
        }
    }


    this.setEnabled = function(id, estado) {
        var pos = -1;
        for(var i=0; i<this.list.length; i++) {
            if(this.list[i].id == id) {
                pos = i;
                break;
            }
        }

        if(pos>=0) {
            this.list[pos].disabled = estado;
        }
    }

    this.sort = function() {
        this.list.sort();
    }


    this.clear = function() {
        this.list = new Array();
    }

    this.size = function() {
        return this.list.length;
    }
}

function Selector(contentId, sourceList, selectedList, width, height) {
    this.sourceList = sourceList;
    this.selectedList = selectedList;
    this.contentId = contentId;
    this.width = width;
    this.height = height;
    this.onchange = undefined;

    this.getValue = function() {        
        var value = "";
        for(var i=0; i<this.selectedList.list.length; i++) {
            value += this.selectedList.list[i].id +";";
        }
        return value;
    }


    this.add = function(id) {
        if(this.sourceList.getElement(id)!=undefined) {
            this.selectedList.add(id, this.sourceList.getElement(id));
            this.selectedList.sort();

            this.sourceList.setEnabled(id, true);
        //this.sourceList.sort();
        }
        if(this.onchange != undefined) {
            this.onchange();
        }
    }

    this.remove = function(id) {
        if(this.selectedList.getElement(id)!=undefined) {
            //this.sourceList.add(id, this.selectedList.getElement(id));
            this.sourceList.setEnabled(id, undefined);
            //this.sourceList.sort();

            this.selectedList.remove(id);
            this.selectedList.sort();
        }
        if(this.onchange != undefined) {
            this.onchange();
        }
    }

    this.addAll = function() {
        for(var i=0; i<this.sourceList.list.length; i++) {
            this.selectedList.add(sourceList.list[i].id, sourceList.list[i].nome);
            sourceList.list[i].disabled = true;
        }
        this.selectedList.sort();
        if(this.onchange != undefined) {
            this.onchange();
        }
    //this.sourceList.clear();
    }

    this.removeAllSource = function() {
        this.removeAll();
        for(var i=0; i<this.sourceList.list.length; i++) {
            this.sourceList.setEnabled(this.sourceList.list[i].id, undefined);
        }
        this.sourceList.clear();
        if(this.onchange != undefined) {
            this.onchange();
        }
    }
    
    this.removeAll = function() {
        for(var i=0; i<this.selectedList.list.length; i++) {
            this.sourceList.setEnabled(this.selectedList.list[i].id, undefined);
        }
        //this.sourceList.sort();
        this.selectedList.clear();
        if(this.onchange != undefined) {
            this.onchange();
        }
    }

    this.renderer = function() {
        var code = "";
        var ws = (this.width -50) /2;


        code += "<table class='selector' width='100%'><tr>";

        code += "<td width='" + ws + "px'>";
        code += "<select id='" + this.contentId + "Source' style='width : " + ws + "px; height:" + this.height + "px' multiple>";
        for(var i=0; i<this.sourceList.list.length; i++) {
            
            code +="<option value='" + this.sourceList.list[i].id + "'  " + (this.sourceList.list[i].disabled==true ? " disabled='true' " : "") + " >" + this.sourceList.list[i].nome + "</option>";
        }
        code +="</select>";
        code += "</td>";


        code += "<td>";
        code+= "<button type='button' onclick=\"javascript:selectorAdd('" + this.contentId + "');\">></button>";
        code+= "<button type='button' onclick=\"javascript:selectorRemove('" + this.contentId + "');\"><</button>";
        code+= "<button type='button' onclick=\"javascript:selectorAddAll('" + this.contentId + "');\">>></button>";
        code+= "<button type='button' onclick=\"javascript:selectorRemoveAll('" + this.contentId + "');\"><<</button>";

        code += "</td>";

        code += "<td width='" + ws + "px'>";
        code += "<select id='" + this.contentId + "Selected' style='width : " + ws + "px; height:" + this.height + "px' multiple>";
        for(var i=0; i<this.selectedList.list.length; i++) {
            code +="<option value='" + this.selectedList.list[i].id + "'>" + this.selectedList.list[i].nome + "</option>";
        }
        code +="</select>";
        code += "</td>";


        code += "</tr></table>";

        document.getElementById(this.contentId).innerHTML = code;
        
    }
}

function loadSelector(id) {
    var el = document.getElementById(id);

    var width = getStyle(el,"width");
    width = parseInt(width.substring(0,width.length-2));

    var height = getStyle(el,"height");
    height = parseInt(height.substring(0,height.length-2));

    var selector = new Selector(id, new SortedList(true), new SortedList(false), width, height);
    el.selector = selector;
    el.renderer = function() {
        this.selector.renderer()
    } ;
    el.sourceList = el.selector.sourceList;
    el.selectedList = el.selector.selectedList;
    el.getValue = function() {
        return this.selector.getValue()
    };
    el.renderer();
}


function loadSelectors() {

    var elements = document.getElementsByTagName("selector");

    for(var i=0; i<elements.length; i++) {
        if ( navigator.appName == "Microsoft Internet Explorer" ) {
            var newDiv = document.createElement("div");
            for(var j=0; j<elements[i].attributes.length; j++){
         
                if(elements[i].attributes[j].specified){
                    newDiv.setAttribute(elements[i].attributes[j].nodeName, elements[i].attributes[j].nodeValue);
                }
            }
            elements[i].parentNode.replaceChild(newDiv, elements[i]);
            loadSelector(newDiv.id);
            
        }else{
            loadSelector(elements[i].id);
        }
    }
    
}


