By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
458,143 Members | 1,615 Online
Bytes IT Community
Submit an Article
Got Smarts?
Share your bits of IT knowledge by writing an article on Bytes.

Grid table (add, remove, import, edit)

P: 54
Greetings again to everyone,

Im back to show this grid componenet i´ve developed. With this grid you can show the data like a normal table, remove the rows that you need, add rows, import data, call determined functions, and edit the data already present

What will you need to use the grid? A table with standard markup and an ID to call the script that will turn the table into a grid

Parameters:
tabelaID => id of the table that will turn into a grid
maxLinha => number of rows that the grid will display, if number of rows exceed this number the grid will create a scrollbar
edicao => array that control the edition of the grid. this parameter accepts 2 arrays, metodo and unico
edicao.metodo => array that determine how each column will be edited. use null for no edition, "default" to free edition, and an array to a select with that options
edicao.unico ==> array that determine if one data is unique in the grid, example: the last column have a edition method of "yes" and "no", but you wanna only 1 yes in all the grid. possible values are null or index of the respective array that will be unique
valor => accept an array called tag that determine how the value of the grid will be filled. possible values are "default" to put all the data in the cell, specific tag name like "span" to get data only from spans in that column, and null to skip that column
largura => array that detemine the width of each column in percentage (max = 100)
alinhamento => array that determine the alingment of each column (left, right, center, justify)
fn => determine the function that will be called when the add button is pressed

The parameters may look kinda hard to pass, but the example will help a bit here

file: grid.css
Expand|Select|Wrap|Line Numbers
  1. .grid {border-collapse:collapse; table-layout:fixed; width:560px; font:normal 11px arial;}
  2. .grid th {background:url(img/headerBg.jpg); border-right:1px solid #ddd; border-bottom:1px solid #ddd; color:#fff}
  3. .grid td, .grid table td {text-indent:5px; white-space:nowrap; overflow:hidden; padding:0px 5px 0px 0;}
  4.  
  5. .grid table td {height:20px}
  6.  
  7. .grid .holder {overflow:auto; width:559px;}
  8. .grid table {table-layout:fixed; border-collapse:collapse; width:540px; font:normal 11px arial}
  9. .grid .scrollBar {border:0; background:transparent; width:13px;}
  10.  
  11. .grid .par td {background:#fff}
  12. .grid .impar td {background:#eee}
  13. .grid .hover td {background:#D9E8FB}
  14.  
  15. .grid span {display:none}
  16.  
  17. * html .grid .scrollBar {width:16px}
  18.  
  19. .divEdicao {background:#eee; border:1px solid #aaa; position:absolute; width:auto; height:18px;}
  20. .divEdicao img {margin:2px; cursor:pointer}
  21.  
  22. .overlay {position:absolute; background:#eee; filter:alpha(opacity=0); -moz-opacity:0; opacity:0}
  23.  
  24. .botaoAdicionar {position:relative; cursor:pointer; margin-bottom:10px}
  25. .botaoAceitar, .botaoCancelar {position:absolute; cursor:pointer;}
  26.  
  27. .edicaoTable {position:absolute; font:normal 11px arial; background:#fff; border-collapse:collapse; table-layout:fixed}
  28. .edicaoTable td {white-space:nowrap; overflow:hidden; padding:0;}
  29. .edicaoTable td input {margin:0; padding:0; width:100%; height:20px; overflow:hidden; font:normal 11px arial; padding:2px}
  30. .edicaoTable td select {margin:0; padding:0; width:100%; height:18px; overflow:hidden; font:normal 11px arial;}
  31.  
file: sample.html
[HTML]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<head>
<title>Grid</title>
</head>

<link rel="stylesheet" href="grid.css">

<script src="grid.js"></script>

<script>
window.onload = function() {
gridUm = new criarGrid('tabelaUm',10, {metodo:[null,null,null,['Yes','No']],unico:[null,null,null,1]}, {tag:['default',null,null,'default']},[40,25,15,20],['left','right','center','right'], 'abrirPopup("filtro.html")');
}

function abrirPopup(url) {
janela = window.open(url,'Janela','width=670,height=400,lef t=200,top=200,toolbar=no')
}

</script>

<body>

<table id="tabelaUm">
<thead>
<tr>
<th>Header 1</th>
<th>Header 2</th>
<th>Header 3</th>
<th>Header 4</th>
</tr>
</thead>
<tbody>
<tr>
<td>Dummy text</td>
<td>Dummy text</td>
<td>Dummy text</td>
<td>No</td>
</tr>
<tr>
<td>Dummy text</td>
<td>Dummy text</td>
<td>Dummy text</td>
<td>No</td>
</tr>
<tr>
<td>Dummy text</td>
<td>Dummy text</td>
<td>Dummy text</td>
<td>No</td>
</tr>
<tr>
<td>Dummy text</td>
<td>Dummy text</td>
<td>Dummy text</td>
<td>No</td>
</tr>
<tr>
<td>Dummy text</td>
<td>Dummy text</td>
<td>Dummy text</td>
<td>Yes</td>
</tr>
<tr>
<td>Dummy text</td>
<td>Dummy text</td>
<td>Dummy text</td>
<td>No</td>
</tr>
<tr>
<td>Dummy text</td>
<td>Dummy text</td>
<td>Dummy text</td>
<td>No</td>
</tr>
<tr>
<td>Dummy text</td>
<td>Dummy text</td>
<td>Dummy text</td>
<td>No</td>
</tr>
</tbody>
</table>

<br><br><br>

<button onclick="alert(gridUm.valores)">Valor</button>

</body>
</html>
[/HTML]

Expand|Select|Wrap|Line Numbers
  1. ////////////////////////////////////////////
  2. //    Author: Romulo do Nascimento Ferreira //
  3. //  Email: romulo.nf@gmail.com              //
  4. ////////////////////////////////////////////
  5.  
  6. /* parametros
  7.  
  8.     tabelaID: id da tabela que vai ter funcionalidade de grid
  9.     maxLinha: número máximo de linhas a ser mostrado (para criação de barra de rolagem)
  10.     edicao: array que determina o método de edição de cada coluna
  11.         edicao.metodo: 
  12.             default = edicao livre
  13.             null = sem edicao
  14.             array de string = opcoes da combo box
  15.         edicao.unico:
  16.             index = indica exclusividade de uma opcao de index x
  17.     valor: array que determina qual elemento vai compor o array valores[] do grid
  18.         default = conteudo da coluna
  19.         null = nenhum valor atribuido
  20.         tag = atribui ao array o conteudo da tag escolhida dentro da coluna
  21.             ex: span
  22.     largura: array com a porcentagem de largura de cada coluna
  23.     alinhamento: array que determina o alinhamento de cada coluna (left,right,center,justify)
  24.     fn: função chamada pelo botao de adicionar na parte inferior do grid
  25.  
  26. */
  27.  
  28. function criarGrid(tabelaID,maxLinha,edicao,valor,largura,alinhamento,fn) {
  29.  
  30. this.tempInputs = new Array()
  31. this.tabela = document.getElementById(tabelaID)
  32. this.tabela.className = "grid"
  33. this.cabecalho = this.tabela.tHead
  34. this.numCol = this.cabecalho.rows[0].cells.length
  35. this.corpo = this.tabela.tBodies[0]
  36. this.tamMax = this.corpo.rows.length > 0 ? (maxLinha * this.corpo.rows[0].offsetHeight) : maxLinha * 20
  37. this.holder = this.tabela.parentNode
  38. this.alturaCabecalho = this.cabecalho.rows[0].offsetHeight
  39. this.opcoes = false
  40. this.protecao = false
  41. this.larguraCol = typeof largura !="undefined" ? largura : null
  42. this.alignCol = typeof alinhamento !="undefined" ? alinhamento : null
  43.  
  44.     if (edicao && edicao !=false) {
  45.     this.metodoEdicao = typeof edicao.metodo !="undefined" ? edicao.metodo : null
  46.     this.unicoEdicao = typeof edicao.unico !="undefined" ? edicao.unico : null
  47.     }
  48.     if (edicao == false) {
  49.     this.bloquearEdicao = true
  50.     }
  51.  
  52. if (valor) this.tagValor = typeof valor.tag !="undefined" ? valor.tag : null
  53.  
  54. this.organizarEstrutura(fn)
  55. this.executarTarefas()
  56. }
  57.  
  58. criarGrid.prototype.verificarTamanho = function() {
  59. this.alturaLinhas = 0
  60.  
  61.     for (x=0; x<this.novoCorpo.rows.length; x++) { this.alturaLinhas += this.novoCorpo.rows[x].offsetHeight }
  62.  
  63.     this.divHolder.style.height = this.alturaLinhas < this.tamMax ? this.alturaLinhas + "px" : this.tamMax + "px"
  64. }
  65.  
  66. criarGrid.prototype.associarValores = function() {
  67.     if (!this.valores) this.valores = new Array()
  68.  
  69.     if (this.valores.length > this.novoCorpo.rows.length) this.valores = new Array()
  70.  
  71.     for (x=0; x<this.novoCorpo.rows.length; x++) {
  72.         this.valores[x] = new Array()
  73.         for (y=0; y<this.numCol; y++) {
  74.             if (this.tagValor[y] != "default") {
  75.             tag = this.novoCorpo.rows[x].cells[y].getElementsByTagName(this.tagValor[y])
  76.             tag.length > 0 ? conteudo = tag[0].innerHTML : conteudo = null
  77.             }
  78.             else { conteudo = this.novoCorpo.rows[x].cells[y].innerHTML }
  79.  
  80.             if (this.tagValor[y] != "undefined" || this.tagValor[y] != null) { this.valores[x][y] = conteudo }
  81.         }
  82.     }
  83. }
  84.  
  85. criarGrid.prototype.funcoesTr = function() {
  86.     for (x=0; x<this.novoCorpo.rows.length; x++) {
  87.     this.novoCorpo.rows[x].grid = this
  88.  
  89.         // zebraRows
  90.         x%2 == 0 ? this.novoCorpo.rows[x].className = "par" : this.novoCorpo.rows[x].className = "impar"
  91.  
  92.         // mouseover event
  93.          this.novoCorpo.rows[x].onmouseover = function() {
  94.         if (this.grid.timer) clearTimeout(this.grid.timer)
  95.         this.grid.mostrarOpcoes(this)
  96.         this.className += " hover" 
  97.         }
  98.  
  99.         // mouseout event
  100.         this.novoCorpo.rows[x].onmouseout = function() {
  101.         var _this = this.grid
  102.         this.grid.timer = setTimeout(function(){_this.removerOpcoes()},500)
  103.         this.className = this.className.substring(0,this.className.indexOf(" hover")) 
  104.         }
  105.  
  106.     }
  107. }
Expand|Select|Wrap|Line Numbers
  1. criarGrid.prototype.criarOverlay = function() {
  2. if (this.protecao) this.removerOverlay()
  3. this.protecao = true
  4. this.overlay = document.createElement("div")
  5. this.overlay.className = "overlay"
  6. this.overlay.style.height = this.divHolder.offsetHeight + 10 + "px"
  7. this.overlay.style.width = this.novaTabela.offsetWidth + 10 + "px"
  8. this.overlay.style.top = this.divHolder.offsetTop + this.tabela.offsetTop + this.alturaCabecalho + "px"
  9. this.overlay.style.left = this.divHolder.offsetLeft + this.tabela.offsetLeft + "px"
  10. this.holder.appendChild(this.overlay)
  11.  
  12. this.divHolder.style.overflow = "hidden"
  13. this.botaoAdicionar.style.display = "none"
  14. }
  15.  
  16. criarGrid.prototype.removeOverlay = function() {
  17. this.overlay.parentNode.removeChild(this.overlay)
  18. this.protecao = false
  19.  
  20. this.divHolder.style.overflow = "auto"
  21. this.botaoAdicionar.style.display = ""
  22. }
  23.  
  24. criarGrid.prototype.editarLinha = function(tr) {
  25. this.removerOpcoes()
  26. this.criarOverlay()
  27.  
  28.     this.edicaoTable = document.createElement("table")
  29.     this.edicaoTable.className = "edicaoTable"
  30.     this.edicaoTbody = document.createElement("tbody")
  31.     this.cloneTr = tr.cloneNode(true)
  32.     this.edicaoTable.appendChild(this.edicaoTbody)
  33.     this.edicaoTbody.appendChild(this.cloneTr)
  34.  
  35.     this.edicaoTable.style.width = tr.offsetWidth + "px"
  36.     this.edicaoTable.style.top = tr.offsetTop - this.divHolder.scrollTop + this.tabela.offsetTop + this.alturaCabecalho + "px"
  37.     this.edicaoTable.style.left = this.tabela.offsetLeft - this.divEdicaoTr.offsetWidth + "px"
  38.  
  39.     // metodos de edicao
  40.     for (x=0; x<this.cloneTr.cells.length; x++) {
  41.     this.cloneTr.cells[x].style.width = tr.cells[x].offsetWidth + "px"
  42.  
  43.         if (this.metodoEdicao[x] == "default") {
  44.         this.tempInputs[x] = document.createElement("input")
  45.         this.tempInputs[x].value = tr.cells[x].innerHTML
  46.         this.cloneTr.cells[x].replaceChild(this.tempInputs[x],this.cloneTr.cells[x].childNodes[0])
  47.         }
  48.  
  49.         else if (this.metodoEdicao[x] && this.metodoEdicao[x].length > 1) {
  50.         this.tempInputs[x] = document.createElement("select")
  51.             for (y=0; y<this.metodoEdicao[x].length; y++) {
  52.             opcaoTemp = document.createElement("option")
  53.             opcaoTemp.value = this.metodoEdicao[x][y]
  54.             opcaoTemp.innerHTML = this.metodoEdicao[x][y]
  55.             this.tempInputs[x].appendChild(opcaoTemp)
  56.             }
  57.         this.cloneTr.cells[x].replaceChild(this.tempInputs[x],this.cloneTr.cells[x].childNodes[0])
  58.  
  59.             for (y=0; y<this.tempInputs[x].options.length; y++) {
  60.                 if (this.tempInputs[x].options[y].innerHTML.toLowerCase() == tr.cells[x].innerHTML.toLowerCase()) {
  61.                 this.tempInputs[x].options[y].selected = "selected"
  62.                 }
  63.             }
  64.         }
  65.  
  66.         else {
  67.         this.tempInputs[x] = document.createElement("input")
  68.         this.tempInputs[x].value = tr.cells[x].innerHTML
  69.         this.tempInputs[x].disabled = "disabled"
  70.         this.cloneTr.cells[x].replaceChild(this.tempInputs[x],this.cloneTr.cells[x].childNodes[0])
  71.         }
  72.  
  73.     }
  74.  
  75.     this.holder.appendChild(this.edicaoTable)
  76.  
  77.     this.botaoAceitar = new Image()
  78.     this.botaoAceitar.src = "img/aceitar.gif"
  79.     this.botaoAceitar.className = "botaoAceitar"
  80.     this.botaoAceitar.grid = this
  81.     this.botaoAceitar.onclick = function() { this.grid.aceitarEdicao(tr) }
  82.     this.botaoAceitar.style.top = parseInt(this.edicaoTable.style.top) + this.edicaoTable.offsetHeight/6 + "px"
  83.     this.botaoAceitar.style.left = parseInt(this.edicaoTable.style.left) + this.edicaoTable.offsetWidth + 3 + "px"
  84.     this.holder.appendChild(this.botaoAceitar)
  85.  
  86.     this.botaoCancelar = new Image()
  87.     this.botaoCancelar.src = "img/cancelar.gif"
  88.     this.botaoCancelar.className = "botaoCancelar"
  89.     this.botaoCancelar.grid = this
  90.     this.botaoCancelar.onclick = function() { this.grid.cancelarEdicao() }
  91.     this.botaoCancelar.style.top = parseInt(this.botaoAceitar.style.top) + "px"
  92.     this.botaoCancelar.style.left = parseInt(this.edicaoTable.style.left) + this.edicaoTable.offsetWidth + 20 + "px"
  93.     this.holder.appendChild(this.botaoCancelar)    
  94. }
Expand|Select|Wrap|Line Numbers
  1. criarGrid.prototype.aceitarEdicao = function(tr) {
  2.  
  3.     for (x=0; x<this.tempInputs.length; x++) {
  4.         if (this.unicoEdicao[x] && this.tempInputs[x].value != this.metodoEdicao[x][this.unicoEdicao[x]]) {
  5.             for (y=0; y<this.novoCorpo.rows.length; y++) {
  6.             this.novoCorpo.rows[y].cells[x].innerHTML = this.metodoEdicao[x][this.unicoEdicao[x]]
  7.             }
  8.         }
  9.     tr.cells[x].innerHTML = this.tempInputs[x].value 
  10.     }
  11.  
  12. this.cancelarEdicao()
  13. this.executarTarefas()
  14. }
  15.  
  16. criarGrid.prototype.cancelarEdicao = function() {
  17. this.removeOverlay()
  18. this.edicaoTable.parentNode.removeChild(this.edicaoTable)
  19. this.botaoCancelar.parentNode.removeChild(this.botaoCancelar)
  20. this.botaoAceitar.parentNode.removeChild(this.botaoAceitar)
  21. }
  22.  
  23. criarGrid.prototype.excluirLinha = function(tr) {
  24. this.removerOpcoes()
  25. tr.parentNode.removeChild(tr)
  26. this.executarTarefas()
  27. }
  28.  
  29. criarGrid.prototype.removerOpcoes = function() {
  30. if (this.divEdicaoTr) this.divEdicaoTr.parentNode.removeChild(this.divEdicaoTr)
  31. this.opcoes = false
  32. }
  33.  
  34. criarGrid.prototype.mostrarOpcoes = function(tr) {
  35. if (this.opcoes) this.removerOpcoes()
  36.  
  37. this.opcoes = true
  38.  
  39. this.divEdicaoTr = document.createElement("div")
  40. this.divEdicaoTr.className = "divEdicao"
  41. this.divEdicaoTr.grid = this
  42.  
  43.     this.divEdicaoTr.onmouseover = function() { if (this.grid.timer) clearTimeout(this.grid.timer) }
  44.     this.divEdicaoTr.onmouseout = function() {
  45.     var _this = this.grid
  46.     this.grid.timer = setTimeout(function(){_this.removerOpcoes()},500)
  47.     }
  48.  
  49. this.holder.appendChild(this.divEdicaoTr)
  50.  
  51. if (!this.bloquearEdicao) {
  52. this.botaoEditar = new Image()
  53. this.botaoEditar.grid = this
  54. this.botaoEditar.alt = "Clique aqui para editar a linha " + (tr.rowIndex + 1)
  55. this.botaoEditar.title = "Clique aqui para editar a linha " + (tr.rowIndex + 1)
  56. this.botaoEditar.onclick = function() { this.grid.editarLinha(tr) }
  57. this.botaoEditar.src = "img/lapis.gif"
  58. this.divEdicaoTr.appendChild(this.botaoEditar)
  59. }
  60.  
  61. this.botaoExcluir = new Image()
  62. this.botaoExcluir.grid = this
  63. this.botaoExcluir.alt = "Clique aqui para excluir a linha " + (tr.rowIndex + 1)
  64. this.botaoExcluir.title = "Clique aqui para excluir a linha " + (tr.rowIndex + 1)
  65. this.botaoExcluir.onclick = function() { this.grid.excluirLinha(tr) }
  66. this.botaoExcluir.src = "img/lixeira.gif"
  67. this.divEdicaoTr.appendChild(this.botaoExcluir)
  68.  
  69. this.divEdicaoTr.style.top = tr.offsetTop - this.divHolder.scrollTop + this.tabela.offsetTop + this.alturaCabecalho + "px"
  70. this.divEdicaoTr.style.left = tr.offsetWidth + this.tabela.offsetLeft - this.divEdicaoTr.offsetWidth + "px"
  71. }
  72.  
  73. criarGrid.prototype.executarTarefas = function() {
  74. this.corrigirLargura()
  75. this.funcoesTr()
  76. this.associarValores()
  77. this.verificarTamanho()
  78. }
  79.  
  80. criarGrid.prototype.corrigirLargura = function() {
  81.     for (x=0; x<this.numCol; x++) {
  82.     if (this.larguraCol) { this.cabecalho.rows[0].cells[x].style.width = this.larguraCol[x] + "%" }
  83.         for (y=0; y<this.novoCorpo.rows.length; y++) {
  84.         if (this.larguraCol) { this.novoCorpo.rows[y].cells[x].style.width = this.larguraCol[x] + "%" }
  85.         if (this.alignCol) { this.novoCorpo.rows[y].cells[x].style.textAlign = this.alignCol[x] }
  86.         }
  87.     }
  88. }
  89.  
  90. criarGrid.prototype.organizarEstrutura = function(fn) {
  91.     this.scrollBar = document.createElement("th")
  92.     this.trHolder = document.createElement("tr")
  93.     this.tdHolder = document.createElement("td")
  94.     this.divHolder = document.createElement("div")
  95.     this.novaTabela = document.createElement("table")
  96.     this.novoCorpo = document.createElement("tbody")
  97.  
  98.     while (this.corpo.rows.length > 0) { this.novoCorpo.appendChild(this.corpo.rows[0]) }
  99.  
  100.     this.scrollBar.innerHTML = "&nbsp;"
  101.     this.scrollBar.className = "scrollBar"
  102.     this.cabecalho.rows[0].appendChild(this.scrollBar)
  103.  
  104.     this.corpo.appendChild(this.trHolder)
  105.  
  106.     this.tdHolder.colSpan = (this.numCol+1)
  107.     this.trHolder.appendChild(this.tdHolder)
  108.  
  109.     this.divHolder.className = "holder"
  110.     this.divHolder.style.height = this.tamMax + "px"
  111.     this.tdHolder.appendChild(this.divHolder)
  112.  
  113.     this.divHolder.appendChild(this.novaTabela)
  114.  
  115.     this.novaTabela.appendChild(this.novoCorpo)
  116.  
  117.     this.botaoAdicionar = new Image()
  118.     this.botaoAdicionar.onmouseover = function() { this.src = "img/add2-hover.gif" }
  119.     this.botaoAdicionar.onmouseout = function() { this.src = "img/add2.gif" } 
  120.     this.botaoAdicionar.className = "botaoAdicionar"
  121.     this.botaoAdicionar.src = "img/add2.gif"
  122.     this.botaoAdicionar.onclick = function() { eval(fn) }
  123.     this.holder.insertBefore(this.botaoAdicionar,this.tabela.nextSibling)
  124. }
  125.  
  126. criarGrid.prototype.importarDados = function(tr) {
  127.  
  128. inserirTr = true
  129.  
  130.     for (x=0; x<this.novoCorpo.rows.length; x++) {
  131.         conteudoAtual = this.novoCorpo.rows[x].textContent ? this.novoCorpo.rows[x].textContent : this.novoCorpo.rows[x].innerText
  132.         conteudoNovo = tr.textContent ? tr.textContent : tr.innerText
  133.         if (conteudoAtual == conteudoNovo) { inserirTr = false }
  134.     }
  135.  
  136.     if (inserirTr) {
  137.  
  138.     this.novoCorpo.insertRow(this.novoCorpo.rows.length)
  139.  
  140.         for (x=0; x<this.numCol; x++) {
  141.         this.novoCorpo.rows[this.novoCorpo.rows.length-1].insertCell(x)
  142.         this.novoCorpo.rows[this.novoCorpo.rows.length-1].cells[x].innerHTML = tr.getElementsByTagName("td")[x].innerHTML
  143.         }
  144.  
  145.     this.divHolder.scrollTop = this.divHolder.scrollHeight
  146.  
  147.     this.executarTarefas()
  148.     }
  149.  
  150.     else { janela.alert("Informação existente") }
  151. }
  152.  
Thats basically it.
Feel free to use/modify the grid to serve your own purposes.
I just ask for you to keep the copyright there.

The url bellow is a zip containing a sample of the grid getting data from the filter, another component i´ve already posted here. The file also contains some images that i use on the grid, but you can easily change that to make your custom grid.

Grid & filter
Attached Files
File Type: zip grid & filtro.zip (15.5 KB, 509 views)
Dec 3 '07 #1
Share this Article
Share on Google+
6 Comments


P: 54
If any admin gets here can you try to fix this topic? The above topic contains the js but using the [*code*] tag i couldnt manage to make the post visible. When everything is fixed delete this post also. I´d be grateful!
Dec 4 '07 #2

acoder
Expert Mod 15k+
P: 16,027
Hopefully fixed.

Is it possible to make an English version? It'd make the code a lot easier to understand!
Dec 5 '07 #3

P: 1
Hopefully fixed.

Is it possible to make an English version? It'd make the code a lot easier to understand!
Hi

maybe users can try following for English help:

Translation favelet/bookmarklet from:

http://tantek.com/favelets/

Babelfish Portuguese to English

Expand|Select|Wrap|Line Numbers
  1. javascript:void(document.location='http://babelfish.altavista.com/babelfish/urltrurl?url=' +escape(document.location)+'&lp=pt_en&tt=url')
Feb 6 '08 #4

P: 54
I´ve made lots of changes, and i hope to post an english version of it when i have some free time!!
Feb 6 '08 #5

acoder
Expert Mod 15k+
P: 16,027
Hi

maybe users can try following for English help:

Translation favelet/bookmarklet from:

http://tantek.com/favelets/

Babelfish Portuguese to English

Expand|Select|Wrap|Line Numbers
  1. javascript:void(document.location='http://babelfish.altavista.com/babelfish/urltrurl?url=' +escape(document.location)+'&lp=pt_en&tt=url')
Thanks for the tip. Is it Portuguese? :)
Feb 6 '08 #6

acoder
Expert Mod 15k+
P: 16,027
I´ve made lots of changes, and i hope to post an english version of it when i have some free time!!
Look forward to the changes. Thanks for the updates.
Feb 7 '08 #7