пятница, 30 октября 2009 г.

Pivot Table for Google Spreadsheet

http://www.google.com/ig/directory?type=gadgets&url=hosting.gmodules.com/ig/gadgets/file/108298391133423084019/Worldbi_GDS_Pivot_V2.xml

<Module>

<ModulePrefs title="__MSG_gadgetTitle__" title_url="http://www.lamboratory.com/gadgets.php#gse" description="__MSG_description__" author="Jorge Alvaro Rey" author_email="gsEditorFeedback@lamboratory.com" author_affiliation="Lamboratory.com" author_location="Madrid, Spain" author_photo="http://www.lamboratory.com/images/jorge.PNG" author_aboutme="My brother Guillermo and me are the Lamb Brothers." author_link="http://www.lamboratory.com" author_quote="Please allow me to introduce myself" thumbnail="http://www.lamboratory.com/images/gseThumbnail.PNG" screenshot="http://www.lamboratory.com/images/gseScreenshot.PNG" category="tools">
<Locale messages="http://www.lamboratory.com/gadgets/gse_messages/ALL_ALL.xml"/>
<Locale lang="es" messages="http://www.lamboratory.com/gadgets/gse_messages/es_ALL.xml"/>
<Require feature="dynamic-height"/>
<Require feature="setprefs"/>
<Require feature="tabs"/>
<Require feature="grid"/>
<Require feature="analytics"/>
</ModulePrefs>
<UserPref name="key" display_name="__MSG_key__" datatype="string" required="true"/>
<UserPref name="sheet0" display_name="__MSG_sheetFeed1__" datatype="string" required="true"/>
<UserPref name="sheet1" display_name="__MSG_sheetFeed2__" datatype="string" required="false"/>
<UserPref name="sheet2" display_name="__MSG_sheetFeed3__" datatype="string" required="false"/>
<UserPref name="sheet3" display_name="__MSG_sheetFeed4__" datatype="string" required="false"/>
<UserPref name="col0" default_value="1" datatype="hidden"/>
<UserPref name="row0" default_value="1" datatype="hidden"/>
<UserPref name="col1" default_value="1" datatype="hidden"/>
<UserPref name="row1" default_value="1" datatype="hidden"/>
<UserPref name="col2" default_value="1" datatype="hidden"/>
<UserPref name="row2" default_value="1" datatype="hidden"/>
<UserPref name="col3" default_value="1" datatype="hidden"/>
<UserPref name="row3" default_value="1" datatype="hidden"/>
<UserPref name="nCols" display_name="__MSG_colsDisplayed__" default_value="3" datatype="string" required="true"/>
<UserPref name="nRows" display_name="__MSG_rowsDisplayed__" default_value="5" datatype="string" required="true"/>

<Content type="html">

<style>
    a img {
        border: none;
    }
  .g {
        text-indent:3px;
        padding-right:3px;
        overflow:hidden;
        white-space:nowrap;
        letter-spacing:0;
        word-spacing:0;
        background-color:#FFFFFF;
        z-index:1;
        border-top:0px none;
        border-left:0px none;
        border-bottom:1px solid #CCC;
        border-right:1px solid #CCC;
        font-family:Arial;
        font-size:100.0%;
        font-weight:normal;
        font-style:normal;
        text-decoration:none;
        vertical-align:bottom;
        white-space:normal;
        text-indent:0px;
        padding-left:3px;
    }
    .s0 {
        background-color:#EFEFF7;
        font-size:80.0%;
        text-align:center;
        border-top:1px solid #CCC;
        border-left:1px solid #CCC;
    }
    .selected {
        border: 2px solid #3366CC;
    }
    .infoSelected {
        border: 1px solid #3366CC;
    }
    .tblGenFixed {
        table-layout: fixed;
        border-collapse: collapse;
        border-style: none;
        border-spacing: 0px;
        width: 100%;
        font-size: 10pt;
    }
    #tblMain {
        border: 0;
        cellpadding: 0;
        cellspacing: 0;
        padding-top: 10px;
        width: 100%;
    }
</style>

<div id="data"></div>
<div id="container">
    <div id="info" style="overflow:auto;"></div>
    <div id="edit"><input type="text" id="editField" /><input type="button" value="__MSG_updateCell__" onClick="updateCell(_gel('editField').value)" /></div>
</div>

<script type="text/javascript">

var cols = ['0','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ','BA','BB','BC','BD','BE','BF','BG','BH','BI','BJ','BK','BL','BM','BN','BO','BP','BQ','BR','BS','BT','BU','BV','BW','BX','BY','BZ','CA','CB','CC','CD','CE','CF','CG','CH','CI','CJ','CK','CL','CM','CN','CO','CP','CQ','CR','CS','CT','CU','CV','CW','CX','CY','CZ','DA','DB','DC','DD','DE','DF','DG','DH','DI','DJ','DK','DL','DM','DN','DO','DP','DQ','DR','DS','DT','DU','DV','DW','DX','DY','DZ','EA','EB','EC','ED','EE','EF','EG','EH','EI','EJ','EK','EL','EM','EN','EO','EP','EQ','ER','ES','ET','EU','EV','EW','EX','EY','EZ','FA','FB','FC','FD','FE','FF','FG','FH','FI','FJ','FK','FL','FM','FN','FO','FP','FQ','FR','FS','FT','FU','FV','FW','FX','FY','FZ','GA','GB','GC','GD','GE','GF','GG','GH','GI','GJ','GK','GL','GM','GN','GO','GP','GQ','GR','GS','GT','GU','GV','GW','GX','GY','GZ','HA','HB','HC','HD','HE','HF','HG','HH','HI','HJ','HK','HL','HM','HN','HO','HP','HQ','HR','HS','HT','HU','HV','HW','HX','HY','HZ','IA','IB','IC','ID','IE','IF','IG','IH','II','IJ','IK','IL','IM','IN','IO','IP','IQ','IR','IS','IT','IU','IV','IW','IX','IY','IZ'];


var prefs = new _IG_Prefs(__MODULE_ID__);
var spreadsheetFeeds = new Array();
var iFeeds = 0;
for (var i = 0; i <= 3 ; i++) {
    if (prefs.getString("sheet"+i)!="") {
        spreadsheetFeeds[iFeeds] = prefs.getString("sheet"+i);
        iFeeds++;
    }
}

var key = prefs.getString("key");

var colIni = new Array(4);
var rowIni = new Array(4);
colIni[0] = prefs.getInt("col0");
rowIni[0] = prefs.getInt("row0");
colIni[1] = prefs.getInt("col1");
rowIni[1] = prefs.getInt("row1");
colIni[2] = prefs.getInt("col2");
rowIni[2] = prefs.getInt("row2");
colIni[3] = prefs.getInt("col3");
rowIni[3] = prefs.getInt("row3");
var numCols = prefs.getInt("nCols");
var numRows = prefs.getInt("nRows");

var oldSelCol = 0;
var oldSelRow = 0;

var iSelectedTab = 0;

// Create backend object, initialize with data
var backend = new Object();
var arrayLength = (numRows+1)*(numCols+1);
backend.data = new Array(arrayLength);
for (var i = 0; i < arrayLength ; i++) {
    backend.data[i]="&nbsp;";
}
backend._IGG_getNormalView = function(index) {
    var value = this.data[index];
    return '<span>' + value + '</span>';
}
backend._IGG_isDragSource = function(index) {
    if((index%(numCols+1)!=0)&&(index>numCols)){
        return true;
    }
    else{
        return false;
    }
}
backend._IGG_isDragTarget = function(index, sourceIndex) {
    return false;
}

backend._IGG_handleDrag  = selectCell;

var selColVal = '';
var selRowVal = '';
function selectCell(source) {

    var selCol = source%(numCols+1);
    var selRow = Math.floor(source/(numCols+1));
    selColVal = this.data[selCol];
    selRowVal = this.data[selRow*(numCols+1)];
    _gel("info").innerHTML = "<span style=\"font-size:80.0%;\">"+selColVal+selRowVal+": </span>"+this.data[source];
    _gel("container").className = "infoSelected";
    if(aFormulas[iSelectedTab][selColVal+selRowVal])
    {
        _gel("editField").value = aFormulas[iSelectedTab][selColVal+selRowVal];
    }
    else
    {
        _gel("editField").value = "";
    }

    //highlight cell
    var gridTable = document.getElementById('gridTable');
    var rows = gridTable.getElementsByTagName("tr");
    var cells = rows[selRow].getElementsByTagName("td");
    var selSpan = cells[selCol].getElementsByTagName("span");
    var selDiv = selSpan[0].getElementsByTagName("div");
    selDiv[0].className = "selected";

    //un-highlight cell
    if ((oldSelCol>0)&&(oldSelRow>0)&&!((oldSelCol==selCol)&&(oldSelRow==selRow))){
        cells = rows[oldSelRow].getElementsByTagName("td");
        selSpan = cells[oldSelCol].getElementsByTagName("span");
        selDiv = selSpan[0].getElementsByTagName("div");
        selDiv[0].className = "";
    }
    oldSelCol = selCol;
    oldSelRow = selRow;

    //_gel("editField").focus();

    // Tells gadget to resize itself
    _IG_AdjustIFrameHeight();

    _IG_Analytics("UA-2138291-1", "/gsEditor/selectCell");
}

backend._IGG_handleDragStart = selectCell;

backend._IGG_getSurrogateView = function(source) {
    //_gel("info").innerHTML = this.data[source];
    return "";   
}


function drawContainer(iTable) {

    var html = "<table id='tblMain'>";
    html += "<tr><td></td><td><center><table><tr><td align=\"left\"><a href=\"javascript:displayChange("+iTable+",'col',-"+numCols+")\"><img src=\"http://www.lamboratory.com/gadgets/gse_images/left2.gif\"/></a></td><td align=\"middle\"><a href=\"javascript:displayChange("+iTable+",'col',-1)\"><img src=\"http://www.lamboratory.com/gadgets/gse_images/left1.gif\"/></a></td><td align=\"middle\"><a href=\"javascript:displayChange("+iTable+",'col',1)\"><img src=\"http://www.lamboratory.com/gadgets/gse_images/right1.gif\"/></a></td><td align=\"right\"><a href=\"javascript:displayChange("+iTable+",'col',"+numCols+")\"><img src=\"http://www.lamboratory.com/gadgets/gse_images/right2.gif\"/></a></td></tr></table></center></td></tr>";
    html += "<tr><td><table><tr><td valign=\"top\"><a href=\"javascript:displayChange("+iTable+",'row',-"+numRows+")\"><img src=\"http://www.lamboratory.com/gadgets/gse_images/up2.gif\"/></a></td></tr><tr><td><a href=\"javascript:displayChange("+iTable+",'row',-1)\"><img src=\"http://www.lamboratory.com/gadgets/gse_images/up1.gif\"/></a></td></tr><tr><td><a href=\"javascript:displayChange("+iTable+",'row',1)\"><img src=\"http://www.lamboratory.com/gadgets/gse_images/down1.gif\"/></a></td></tr><tr><td><a href=\"javascript:displayChange("+iTable+",'row',"+numRows+")\"><img src=\"http://www.lamboratory.com/gadgets/gse_images/down2.gif\"/></a></td></tr></table></td><td id=\"spreadsheet"+iTable+"\"></td></tr>";
    html += "</table>";
    _gel('data').innerHTML = html;

    // Tells gadget to resize itself
    _IG_AdjustIFrameHeight();
}

var r = Math.random();
function getContent(iTable, forceRefresh) {

  _gel("info").innerHTML = "";
    _gel("container").className = "";

    if(forceRefresh)
    {
        r = Math.random();
    }

    spreadsheetFeed = "http://www.lamboratory.com/gadgets/proxy.php?key="+key+"&worksheet="+spreadsheetFeeds[iTable]+"&operation=feed&r="+r;

    _IG_FetchXmlContent(spreadsheetFeed, processFeed, {refreshInterval: (60*5)});
}

function processFeed(response) {
    if (response == null || typeof(response) != "object" || response.firstChild == null) {
        //alert("Error: "+response);
        return;
    }
    var entriesList = response.getElementsByTagName("entry");

    var iTable = iSelectedTab;

    aCells = new Array(spreadsheetFeeds.length);
    aFormulas = new Array(spreadsheetFeeds.length);
    for (var i = 0; i < spreadsheetFeeds.length ; i++) {
        aCells[i] = new Array();
        aFormulas[i] = new Array();
    }

    for (var i = 0; i < entriesList.length ; i++) {
        var entryList = entriesList.item(i).childNodes;
        var title = "";
        var content = "";
        for (var j = 0; j < entryList.length ; j++) {
            var node = entryList.item(j);
            if (node.nodeName == "title") {
                var title = node.firstChild.nodeValue;
            }
            if (node.nodeName == "content") {
                var content = node.firstChild.nodeValue ;
            }
            if (node.nodeName == "gs:cell") {
                aFormulas[iTable][title]=node.getAttribute("inputValue");
            }
        }
        if ((title!="")&&(content!="")) {
            aCells[iTable][title]=content;
        }
    }

    displayResults(iTable,colIni[iTable],rowIni[iTable],colIni[iTable]+numCols-1,rowIni[iTable]+numRows-1);

    // Tells gadget to resize itself
    _IG_AdjustIFrameHeight();
    _IG_Analytics("UA-2138291-1", "/gsEditor/getContent");
}

function displayResults(iTable,colIni,rowIni,colFin,rowFin) {

    backend.data[0] = "&nbsp;";
    var contData = 1;
    for (var j = colIni; j <= colFin; j++) {
        backend.data[contData] = cols[j];
        contData++;
    }
    for (var i = rowIni; i <= rowFin ; i++) {
        backend.data[contData] = i;
        contData++;
        for (var j = colIni; j <= colFin; j++) {
            var cell = cols[j]+i;
            if (cell in aCells[iTable]) {
                backend.data[contData] = "<div>"+aCells[iTable][cell]+"</div>";
                contData++;
            }
            else {
                backend.data[contData] = "<div>&nbsp;</div>";
                contData++;
            }
        }
    }
    backend._IGG_refreshAll();

    //highlight cell
    var gridTable = document.getElementById('gridTable');
    var rows = gridTable.getElementsByTagName("tr");
    var cells = rows[oldSelRow].getElementsByTagName("td");
    var selSpan = cells[oldSelCol].getElementsByTagName("span");
    var selDiv = selSpan[0].getElementsByTagName("div");
    //selDiv[0].className = "selected";

    // Tells gadget to resize itself
    _IG_AdjustIFrameHeight();
}

function drawGrid(iTable,numCols,numRows) {
        var grid = new _IG_Grid(backend, "mygrid", numRows+1, numCols+1);
        _gel("spreadsheet"+iTable).appendChild(grid.getTable());
        grid.getTable().border = 0;
        grid.getTable().cellspacing = 0;
        grid.getTable().cellpadding = 0;
        grid.getTable().id = "gridTable";
        grid.getTable().className = "tblGenFixed";
        rows = grid.getTable().getElementsByTagName("tr");
        cells = rows[0].getElementsByTagName("td");
        for (var j = 0; j < cells.length ; j++) {
            cells[j].className = "g s0";
        }
        for (var i = 1; i < rows.length ; i++) {
            cells = rows[i].getElementsByTagName("td");
            cells[0].className = "g s0";
            for (var j = 1; j < cells.length ; j++) {
                cells[j].className = "g";
            }
        }
        grid.initDragging();

    // Tells gadget to resize itself
    _IG_AdjustIFrameHeight();
}


function displayChange(iTable,dir,size) {
    switch(dir){
        case "col":
            if(colIni[iTable]+size>1){ // pensar en el max tb
                colIni[iTable]=colIni[iTable]+size;
            }
            else{
                colIni[iTable]=1;
            }
            prefs.set("col"+iTable, colIni[iTable]);
            break;
        case "row":
            if(rowIni[iTable]+size>1){
                rowIni[iTable]=rowIni[iTable]+size;
            }
            else{
                rowIni[iTable]=1;
            }
            prefs.set("row"+iTable, rowIni[iTable]);
            break;
    }
    getContent(iTable, false);
    displayResults(iTable,colIni[iTable],rowIni[iTable],colIni[iTable]+numCols-1,rowIni[iTable]+numRows-1);

    // Tells gadget to resize itself
    _IG_AdjustIFrameHeight();
    _IG_Analytics("UA-2138291-1", "/gsEditor/displayChange");
}

function generatorCallback(iTable) {
    return function(tabId) {
        tabsCallback(tabId, iTable);
    }
}

function tabsCallback(tabId, iTable) {
    iSelectedTab = iTable;
    drawContainer(iTable);
    drawGrid(iTable,numCols,numRows);
    getContent(iTable, false);
}

// Replaces all instances of the given substring.
String.prototype.replaceAll = function(
    strTarget, // The substring you want to replace
    strSubString // The string you want to replace in.
)
{
    var strText = this;
    var intIndexOfMatch = strText.indexOf( strTarget );
 
    // Keep looping while an instance of the target string
    // still exists in the string.
    while (intIndexOfMatch != -1){
        // Relace out the current instance.
        strText = strText.replace( strTarget, strSubString )
 
        // Get the index of any next matching substring.
        intIndexOfMatch = strText.indexOf( strTarget );
    }
 
    // Return the updated string with ALL the target strings
    // replaced out with the new substring.
    return( strText );
}

function getSelRow()
{
    return selRowVal;
}

function getSelCol()
{
    var iSelCol=0;
    for(iSelCol=0; iSelCol<cols.length; iSelCol++)
    {
        if(cols[iSelCol]==selColVal)
            return iSelCol;
    }
    return -1;
}

function updateCell(value)
{
    var encodedValue = escape(value);
    encodedValue = encodedValue.replaceAll("+", "%2B");
    updateFeed = "http://www.lamboratory.com/gadgets/proxy.php?key="+key+"&worksheet="+spreadsheetFeeds[iSelectedTab]+"&operation=edit&row="+getSelRow()+"&col="+getSelCol()+"&value="+encodedValue+"&r="+Math.random();
    _IG_FetchXmlContent(updateFeed, function(response){
        getContent(iSelectedTab, true);
    });
    _IG_Analytics("UA-2138291-1", "/gsEditor/updateCell");
}

</script>

<script type="text/javascript">

var aCells = new Array(spreadsheetFeeds.length);
var aFormulas = new Array(spreadsheetFeeds.length);
drawContainer(spreadsheetFeeds.length);

var tabs = new _IG_Tabs(__MODULE_ID__);
for (var i = 0; i < spreadsheetFeeds.length ; i++) {
    aCells[i] = new Array();
    aFormulas[i] = new Array();
  tabs.addDynamicTab("Tab "+i, generatorCallback(i));
}

// Tells gadget to resize itself
_IG_AdjustIFrameHeight();
_IG_Analytics("UA-2138291-1", "/gsEditor");

</script>

</Content>
</Module>

Комментариев нет:

Отправить комментарий