<?xml version="1.0" encoding="UTF-8" ?>
<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"><![CDATA[
<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>

