view release on metacpan or search on metacpan
socialcalc/socialcalc-3.js view on Meta::CPAN
SocialCalc.Sheet = function() {
SocialCalc.ResetSheet(this);
// Set other values:
//
// sheet.statuscallback(data, status, arg, this.statuscallbackparams) is called
// during recalc and commands.
//
// During recalc, data is the current recalcdata.
// The values for status and the corresponding arg are:
//
// calcorder, {coord: coord, total: celllist length, count: count} [0 or more times per recalc]
// calccheckdone, calclist length [once per recalc]
// calcstep, {coord: coord, total: calclist length, count: count} [0 or more times per recalc]
// calcloading, {sheetname: name-of-sheet}
// calcserverfunc, {funcname: name-of-function, coord: coord, total: calclist length, count: count}
// calcfinished, time in milliseconds [once per recalc]
//
// During commands, data is SocialCalc.SheetCommandInfo.
socialcalc/socialcalc-3.js view on Meta::CPAN
this.r2 = null;
this.c = null; // looping values
this.r = null;
}
// Recalc the entire sheet
SocialCalc.RecalcSheet = function(sheet) {
var coord, err, recalcdata;
var scri = SocialCalc.RecalcInfo;
delete sheet.attribs.circularreferencecell; // reset recalc-wide things
SocialCalc.Formula.FreshnessInfoReset();
SocialCalc.RecalcClearTimeout();
scri.sheet = sheet; // set values needed by background recalc
scri.currentState = scri.state.start_calc;
socialcalc/socialcalc-3.js view on Meta::CPAN
var count = 0;
var scf = SocialCalc.Formula;
if (!scf) {
return "Need SocialCalc.Formula";
}
var scri = SocialCalc.RecalcInfo;
var sheet = scri.sheet;
if (!sheet) {
return;
}
var recalcdata = sheet.recalcdata;
var do_statuscallback = function(status, arg) { // routine to do callback if required
if (sheet.statuscallback) {
sheet.statuscallback(recalcdata, status, arg, sheet.statuscallbackparams);
}
}
SocialCalc.RecalcClearTimeout();
if (scri.currentState == scri.state.start_calc) {
recalcdata = new SocialCalc.RecalcData();
sheet.recalcdata = recalcdata;
for (coord in sheet.cells) { // get list of cells to check for order
if (!coord) continue;
recalcdata.celllist.push(coord);
}
recalcdata.calclist = {}; // start with empty list
scri.currentState = scri.state.order; // drop through to determining recalc order
}
if (scri.currentState == scri.state.order) {
while (recalcdata.celllistitem < recalcdata.celllist.length) { // check all the cells to see if they should be on the list
coord = recalcdata.celllist[recalcdata.celllistitem++];
err = SocialCalc.RecalcCheckCell(sheet, coord);
if (((new Date()) - starttime) >= scri.maxtimeslice) { // if taking too long, give up CPU for a while
do_statuscallback("calcorder", {coord: coord, total: recalcdata.celllist.length, count: recalcdata.celllistitem});
SocialCalc.RecalcSetTimeout();
return;
}
}
do_statuscallback("calccheckdone", recalcdata.calclistlength);
recalcdata.nextcalc = recalcdata.firstcalc; // start at the beginning of the recalc chain
scri.currentState = scri.state.calc; // loop through cells on next timer call
SocialCalc.RecalcSetTimeout();
return;
}
if (scri.currentState == scri.state.start_wait) { // starting to wait for something
scri.currentState = scri.state.done_wait; // finished on next timer call
if (scri.LoadSheet) {
status = scri.LoadSheet(scf.SheetCache.waitingForLoading);
if (status) { // started a load operation
socialcalc/socialcalc-3.js view on Meta::CPAN
SocialCalc.RecalcSetTimeout();
return;
}
// otherwise should be scri.state.calc
if (scri.currentState != scri.state.calc) {
alert("Recalc state error: "+scri.currentState+". Error in SocialCalc code.");
}
coord = sheet.recalcdata.nextcalc;
while (coord) {
cell = sheet.cells[coord];
eresult = scf.evaluate_parsed_formula(cell.parseinfo, sheet, false);
if (scf.SheetCache.waitingForLoading) { // wait until restarted
recalcdata.nextcalc = coord; // start with this cell again
recalcdata.count += count;
do_statuscallback("calcloading", {sheetname: scf.SheetCache.waitingForLoading});
scri.currentState = scri.state.start_wait; // start load on next timer call
SocialCalc.RecalcSetTimeout();
return;
}
if (scf.RemoteFunctionInfo.waitingForServer) { // wait until restarted
recalcdata.nextcalc = coord; // start with this cell again
recalcdata.count += count;
do_statuscallback("calcserverfunc",
{funcname: scf.RemoteFunctionInfo.waitingForServer, coord: coord, total: recalcdata.calclistlength, count: recalcdata.count});
scri.currentState = scri.state.done_wait; // start load on next timer call
return; // return and wait for next recalc timer event
}
if (cell.datavalue != eresult.value ||
cell.valuetype != eresult.type) { // only update if changed from last time
cell.datavalue = eresult.value;
cell.valuetype = eresult.type;
delete cell.displaystring;
sheet.recalcchangedavalue = true; // remember something changed in case other code wants to know
}
if (eresult.error) {
cell.errors = eresult.error;
}
count++;
coord = sheet.recalcdata.calclist[coord];
if (((new Date()) - starttime) >= scri.maxtimeslice) { // if taking too long, give up CPU for a while
recalcdata.nextcalc = coord; // start with next cell on chain
recalcdata.count += count;
do_statuscallback("calcstep", {coord: coord, total: recalcdata.calclistlength, count: recalcdata.count});
SocialCalc.RecalcSetTimeout();
return;
}
}
recalcdata.inrecalc = false;
delete sheet.recalcdata; // save memory and clear out for name lookup formula evaluation
delete sheet.attribs.needsrecalc; // remember recalc done
scri.sheet = sheet.previousrecalcsheet || null; // chain back if doing recalc of loaded sheets
if (scri.sheet) {
scri.currentState = scri.state.calc; // start where we left off
SocialCalc.RecalcSetTimeout();
return;
}
socialcalc/socialcalc-3.js view on Meta::CPAN
var parseinfo, ttext, ttype, i, rangecoord, circref, value, pos, pos2, cell, coordvals;
var scf = SocialCalc.Formula;
if (!scf) {
return "Need SocialCalc.Formula";
}
var tokentype = scf.TokenType;
var token_op = tokentype.op;
var token_name = tokentype.name;
var token_coord = tokentype.coord;
var recalcdata = sheet.recalcdata;
var checkinfo = recalcdata.checkinfo;
var sheetref = false; // if true, a sheet reference is in effect, so don't check that
var oldcoord = null; // coord of formula that referred to this one when checking down the tree
var coord = startcoord; // the coord of the cell we are checking
// Start with requested cell, and then continue down or up the dependency tree
// oldcoord (and checkinfo[coord].oldcoord) maintains the reference stack during the tree walk
// checkinfo[coord] maintains the stack of checking looping values, e.g., token number being checked
mainloop:
socialcalc/socialcalc-3.js view on Meta::CPAN
// now check that one
coordvals.parsepos = i; // remember our position
coordvals.oldcoord = oldcoord; // remember back up chain
oldcoord = coord; // come back to us
coord = rangecoord;
if (checkinfo[coord] && typeof checkinfo[coord] == "object") { // Circular reference
cell.errors = SocialCalc.Constants.s_caccCircRef+startcoord; // set on original cell making the ref
checkinfo[startcoord] = true; // this one should be calculated once at this point
if (!recalcdata.firstcalc) {
recalcdata.firstcalc = startcoord;
}
else {
recalcdata.calclist[recalcdata.lastcalc] = startcoord;
}
recalcdata.lastcalc = startcoord;
recalcdata.calclistlength++; // count number on list
sheet.attribs.circularreferencecell = coord+"|"+oldcoord; // remember at least one circ ref
return cell.errors;
}
continue mainloop;
}
ttype = parseinfo[i].type; // get token details
ttext = parseinfo[i].text;
if (ttype == token_op) { // references with sheet specifier are not checked
if (ttext == "!") {
socialcalc/socialcalc-3.js view on Meta::CPAN
else if (!sheetref) { // Single cell reference
if (ttext.indexOf("$") != -1) ttext = ttext.replace(/\$/g, ""); // remove any $'s
coordvals.parsepos = i+1; // remember our position - come back on next token
coordvals.oldcoord = oldcoord; // remember back up chain
oldcoord = coord; // come back to us
coord = ttext;
if (checkinfo[coord] && typeof checkinfo[coord] == "object") { // Circular reference
cell.errors = SocialCalc.Constants.s_caccCircRef+startcoord; // set on original cell making the ref
checkinfo[startcoord] = true; // this one should be calculated once at this point
if (!recalcdata.firstcalc) { // add to calclist
recalcdata.firstcalc = startcoord;
}
else {
recalcdata.calclist[recalcdata.lastcalc] = startcoord;
}
recalcdata.lastcalc = startcoord;
recalcdata.calclistlength++; // count number on list
sheet.attribs.circularreferencecell = coord+"|"+oldcoord; // remember at least one circ ref
return cell.errors;
}
continue mainloop;
}
}
}
sheetref = false; // make sure off when bump back up
checkinfo[coord] = true; // this one is finished
if (!recalcdata.firstcalc) { // add to calclist
recalcdata.firstcalc = coord;
}
else {
recalcdata.calclist[recalcdata.lastcalc] = coord;
}
recalcdata.lastcalc = coord;
recalcdata.calclistlength++; // count number on list
coord = oldcoord; // go back to the formula that referred to us and continue
oldcoord = checkinfo[coord] ? checkinfo[coord].oldcoord : null;
}
return "";
}
socialcalc/socialcalcpopup.js view on Meta::CPAN
SocialCalc.Popup.SetValue = function(id, value) {
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
if (!spc[id]) {alert("Unknown control "+id);return;}
var type = spc[id].type;
var pt = spt[type];
var spcdata = spc[id].data;
if (pt && pt.Create) {
pt.SetValue(type, id, value);
if (spcdata.attribs && spcdata.attribs.changedcallback) {
spcdata.attribs.changedcallback(spcdata.attribs, id, value);
}
}
}
//
// SocialCalc.Popup.SetDisabled(id, disabled)
//
// Sets whether the control is disabled (true) or not (false).
socialcalc/socialcalcpopup.js view on Meta::CPAN
// Utility function to create the main popup div of width attribs.width.
// If attribs.title, create one with that text, and optionally attribs.moveable.
//
SocialCalc.Popup.CreatePopupDiv = function(id, attribs) {
var pos, ele;
var sp = SocialCalc.Popup;
var spc = sp.Controls;
var spcdata = spc[id].data;
var main = document.createElement("div");
main.style.position = "absolute";
pos = SocialCalc.GetElementPositionWithScroll(spcdata.mainele);
main.style.top = (pos.top+spcdata.mainele.offsetHeight)+"px";
main.style.left = (pos.left)+"px";
main.style.zIndex = 100;
main.style.backgroundColor = "#FFF";
main.style.border = "1px solid black";
if (attribs.width) {
main.style.width = attribs.width;
}
spcdata.mainele.appendChild(main);
if (attribs.title) {
main.innerHTML = '<table cellspacing="0" cellpadding="0" style="border-bottom:1px solid black;"><tr>'+
'<td style="font-size:10px;cursor:default;width:100%;background-color:#999;color:#FFF;">'+attribs.title+'</td>'+
'<td style="font-size:10px;cursor:default;color:#666;" onclick="SocialCalc.Popup.Cancel();"> X </td></tr></table>';
if (attribs.moveable) {
spcdata.dragregistered = main.firstChild.firstChild.firstChild.firstChild;
SocialCalc.DragRegister(spcdata.dragregistered, true, true, {MouseDown: SocialCalc.DragFunctionStart, MouseMove: SocialCalc.DragFunctionPosition,
MouseUp: SocialCalc.DragFunctionPosition,
Disabled: null, positionobj: main});
}
}
return main;
}
//
// SocialCalc.Popup.EnsurePosition(id, container)
//
// Utility function to make sure popup is positioned completely within container (both element objects)
// and appropriate with respect to the main element controlling the popup.
//
SocialCalc.Popup.EnsurePosition = function(id, container) {
var sp = SocialCalc.Popup;
var spc = sp.Controls;
var spcdata = spc[id].data;
var main = spcdata.mainele.firstChild;
if (!main) {alert("No main popup element firstChild.");return};
var popup = spcdata.popupele;
function GetLayoutValues(ele) {
var r = SocialCalc.GetElementPositionWithScroll(ele);
r.height = ele.offsetHeight;
r.width = ele.offsetWidth;
r.bottom = r.top+r.height;
r.right = r.left+r.width;
return r;
}
socialcalc/socialcalcpopup.js view on Meta::CPAN
SocialCalc.Popup.Types.List.Create = function(type, id, attribs) {
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcid = {type: type, value: "", display: "", data: {}};
if (spc[id]) {alert("Already created "+id); return;}
spc[id] = spcid;
var spcdata = spcid.data;
spcdata.attribs = attribs || {};
var ele = document.getElementById(id);
if (!ele) {alert("Missing element "+id); return;}
spcdata.mainele = ele;
ele.innerHTML = '<input style="cursor:pointer;width:'+(spcdata.attribs.inputWidth||'100px')+';font-size:smaller;" onfocus="this.blur();" onclick="SocialCalc.Popup.CClick(\''+id+'\');" value="">';
spcdata.options = []; // set to nothing - use Initialize to fill
}
SocialCalc.Popup.Types.List.SetValue = function(type, id, value) {
var i;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
spcdata.value = value;
spcdata.custom = false;
for (i=0; i<spcdata.options.length; i++) {
o = spcdata.options[i];
if (o.a) {
if (o.a.skip || o.a.custom || o.a.cancel) {
continue;
}
}
if (o.v == spcdata.value) { // matches value
spcdata.display = o.o;
break;
}
}
if (i==spcdata.options.length) { // none found
spcdata.display = "Custom";
spcdata.custom = true;
}
if (spcdata.mainele && spcdata.mainele.firstChild) {
spcdata.mainele.firstChild.value = spcdata.display;
}
}
SocialCalc.Popup.Types.List.SetDisabled = function(type, id, disabled) {
var i;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
spcdata.disabled = disabled;
if (spcdata.mainele && spcdata.mainele.firstChild) {
spcdata.mainele.firstChild.disabled = disabled;
}
}
SocialCalc.Popup.Types.List.GetValue = function(type, id) {
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
return spcdata.value;
}
// data is: {value: initial value, attribs: {attribs stuff}, options: [{o: option-name, v: value-to-return, a: optional-attribs}, ...]}
SocialCalc.Popup.Types.List.Initialize = function(type, id, data) {
var a;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
for (a in data.attribs) {
spcdata.attribs[a] = data.attribs[a];
}
spcdata.options = data ? data.options : [];
if (data.value) { // if has a value, set to it
sp.SetValue(id, data.value);
}
}
SocialCalc.Popup.Types.List.Reset = function(type) {
socialcalc/socialcalcpopup.js view on Meta::CPAN
}
SocialCalc.Popup.Types.List.Show = function(type, id) {
var i, ele, o, bg;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data
var str = "";
spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs);
if (spcdata.custom) {
str = SocialCalc.Popup.Types.List.MakeCustom(type, id);
ele = document.createElement("div");
ele.innerHTML = '<div style="cursor:default;padding:4px;background-color:#CCC;">'+str+'</div>';
spcdata.customele = ele.firstChild.firstChild.childNodes[1];
spcdata.listdiv = null;
spcdata.contentele = ele;
}
else {
str = SocialCalc.Popup.Types.List.MakeList(type, id);
ele = document.createElement("div");
ele.innerHTML = '<div style="cursor:default;padding:4px;">'+str+'</div>';
spcdata.customele = null;
spcdata.listdiv = ele.firstChild;
spcdata.contentele = ele;
}
if (spcdata.mainele && spcdata.mainele.firstChild) {
spcdata.mainele.firstChild.disabled = true;
}
spcdata.popupele.appendChild(ele);
if (spcdata.attribs.ensureWithin) {
SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin);
}
}
SocialCalc.Popup.Types.List.MakeList = function(type, id) {
var i, ele, o, bg;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data
var str = '<table cellspacing="0" cellpadding="0"><tr>';
var td = '<td style="vertical-align:top;">';
str += td;
spcdata.ncols = 1;
for (i=0; i<spcdata.options.length; i++) {
o = spcdata.options[i];
if (o.a) {
if ( o.a.newcol) {
str += '</td>'+td+" "+'</td>'+td;
spcdata.ncols += 1;
continue;
}
if (o.a.skip) {
str += '<div style="font-size:x-small;white-space:nowrap;">'+o.o+'</div>';
continue;
}
}
if (o.v == spcdata.value && !(o.a && (o.a.custom || o.a.cancel))) { // matches value
bg = "background-color:#DDF;";
}
else {
bg = "";
}
str += '<div style="font-size:x-small;white-space:nowrap;'+bg+'" onclick="SocialCalc.Popup.Types.List.ItemClicked(\''+id+'\',\''+i+'\');" onmousemove="SocialCalc.Popup.Types.List.MouseMove(\''+id+'\',this);">'+o.o+'</div>';
}
str += "</td></tr></table>";
socialcalc/socialcalcpopup.js view on Meta::CPAN
SocialCalc.Popup.Types.List.MakeCustom = function(type, id) {
var SPLoc = SocialCalc.Popup.LocalizeString;
var i, ele, o, bg;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
var style = 'style="font-size:smaller;"';
var str = "";
var val = spcdata.value;
val = SocialCalc.special_chars(val);
str = '<div style="white-space:nowrap;"><br>'+
'<input id="customvalue" value="'+val+'"><br><br>'+
'<input '+style+' type="button" value="'+SPLoc("OK")+'" onclick="SocialCalc.Popup.Types.List.CustomOK(\''+id+'\');return false;">'+
'<input '+style+' type="button" value="'+SPLoc("List")+'" onclick="SocialCalc.Popup.Types.List.CustomToList(\''+id+'\');">'+
'<input '+style+' type="button" value="'+SPLoc("Cancel")+'" onclick="SocialCalc.Popup.Close();">'+
'<br></div>';
return str;
}
SocialCalc.Popup.Types.List.ItemClicked = function(id, num) {
var oele, str, nele;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
var a = spcdata.options[num].a;
if (a && a.custom) {
oele = spcdata.contentele;
str = SocialCalc.Popup.Types.List.MakeCustom("List", id);
nele = document.createElement("div");
nele.innerHTML = '<div style="cursor:default;padding:4px;background-color:#CCC;">'+str+'</div>';
spcdata.customele = nele.firstChild.firstChild.childNodes[1];
spcdata.listdiv = null;
spcdata.contentele = nele;
spcdata.popupele.replaceChild(nele, oele);
if (spcdata.attribs.ensureWithin) {
SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin);
}
return;
}
if (a && a.cancel) {
SocialCalc.Popup.Close();
return;
}
SocialCalc.Popup.SetValue(id, spcdata.options[num].v);
SocialCalc.Popup.Close();
}
SocialCalc.Popup.Types.List.CustomToList = function(id) {
var oele, str, nele;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
oele = spcdata.contentele;
str = SocialCalc.Popup.Types.List.MakeList("List", id);
nele = document.createElement("div");
nele.innerHTML = '<div style="cursor:default;padding:4px;">'+str+'</div>';
spcdata.customele = null;
spcdata.listdiv = nele.firstChild;
spcdata.contentele = nele;
spcdata.popupele.replaceChild(nele, oele);
if (spcdata.attribs.ensureWithin) {
SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin);
}
}
SocialCalc.Popup.Types.List.CustomOK = function(id) {
var i, c;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
SocialCalc.Popup.SetValue(id, spcdata.customele.value);
SocialCalc.Popup.Close();
}
SocialCalc.Popup.Types.List.MouseMove = function(id, ele) {
var col, i, c;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
var list = spcdata.listdiv;
if (!list) return;
var rowele = list.firstChild.firstChild.firstChild; // div.table.tbody.tr
for (col=0; col<spcdata.ncols; col++) {
for (i=0; i<rowele.childNodes[col*2].childNodes.length; i++) {
rowele.childNodes[col*2].childNodes[i].style.backgroundColor = "#FFF";
}
}
ele.style.backgroundColor = "#DDF";
}
SocialCalc.Popup.Types.List.Hide = function(type, id) {
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered);
spcdata.popupele = null;
if (spcdata.mainele && spcdata.mainele.firstChild) {
spcdata.mainele.firstChild.disabled = false;
}
}
SocialCalc.Popup.Types.List.Cancel = function(type, id) {
SocialCalc.Popup.Types.List.Hide(type, id);
}
socialcalc/socialcalcpopup.js view on Meta::CPAN
SocialCalc.Popup.Types.ColorChooser.Create = function(type, id, attribs) {
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcid = {type: type, value: "", display: "", data: {}};
if (spc[id]) {alert("Already created "+id); return;}
spc[id] = spcid;
var spcdata = spcid.data;
spcdata.attribs = attribs || {};
var spca = spcdata.attribs;
spcdata.value = "";
var ele = document.getElementById(id);
if (!ele) {alert("Missing element "+id); return;}
spcdata.mainele = ele;
ele.innerHTML = '<div style="cursor:pointer;border:1px solid black;vertical-align:top;width:'+
(spca.sampleWidth || '15px')+';height:'+(spca.sampleHeight || '15px')+
';" onclick="SocialCalc.Popup.Types.ColorChooser.ControlClicked(\''+id+'\');"> </div>';
}
SocialCalc.Popup.Types.ColorChooser.SetValue = function(type, id, value) {
var i, img, pos;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
var spca = spcdata.attribs;
spcdata.value = value;
spcdata.custom = false;
if (spcdata.mainele && spcdata.mainele.firstChild) {
if (spcdata.value) {
spcdata.mainele.firstChild.style.backgroundColor = spcdata.value;
if (spca.backgroundImage) {
img = "url("+sp.imagePrefix+spca.backgroundImage+")";
}
else {
img = "";
}
pos = "center center";
}
else {
spcdata.mainele.firstChild.style.backgroundColor = "#FFF";
if (spca.backgroundImageDefault) {
img = "url("+sp.imagePrefix+spca.backgroundImageDefault+")";
pos = "center center";
}
else {
img = "url("+sp.imagePrefix+"defaultcolor.gif)";
pos = "left top";
}
}
spcdata.mainele.firstChild.style.backgroundPosition = pos;
spcdata.mainele.firstChild.style.backgroundImage = img;
}
}
SocialCalc.Popup.Types.ColorChooser.SetDisabled = function(type, id, disabled) {
var i;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
var spca = spcdata.attribs;
spcdata.disabled = disabled;
if (spcdata.mainele && spcdata.mainele.firstChild) {
if (disabled) {
spcdata.mainele.firstChild.style.backgroundColor = "#DDD";
if (spca.backgroundImageDisabled) {
img = "url("+sp.imagePrefix+spca.backgroundImageDisabled+")";
pos = "center center";
}
else {
img = "url("+sp.imagePrefix+"defaultcolor.gif)";
pos = "left top";
}
spcdata.mainele.firstChild.style.backgroundPosition = pos;
spcdata.mainele.firstChild.style.backgroundImage = img;
}
else {
sp.SetValue(id, spcdata.value);
}
}
}
SocialCalc.Popup.Types.ColorChooser.GetValue = function(type, id) {
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
return spcdata.value;
}
SocialCalc.Popup.Types.ColorChooser.Initialize = function(type, id, data) {
var a;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
for (a in data.attribs) {
spcdata.attribs[a] = data.attribs[a];
}
if (data.value) { // if has a value, set to it
sp.SetValue(id, data.value);
}
}
SocialCalc.Popup.Types.ColorChooser.Reset = function(type) {
socialcalc/socialcalcpopup.js view on Meta::CPAN
}
SocialCalc.Popup.Types.ColorChooser.Show = function(type, id) {
var i, ele, mainele;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data
var str = "";
spcdata.oldvalue = spcdata.value; // remember starting value
spcdata.popupele = sp.CreatePopupDiv(id, spcdata.attribs);
if (spcdata.custom) {
str = SocialCalc.Popup.Types.ColorChooser.MakeCustom(type, id);
ele = document.createElement("div");
ele.innerHTML = '<div style="cursor:default;padding:4px;background-color:#CCC;">'+str+'</div>';
spcdata.customele = ele.firstChild.firstChild.childNodes[2];
spcdata.contentele = ele;
}
else {
mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid(type, id);
ele = document.createElement("div");
ele.style.padding = "3px";
ele.style.backgroundColor = "#CCC";
ele.appendChild(mainele);
spcdata.customele = null;
spcdata.contentele = ele;
}
spcdata.popupele.appendChild(ele);
if (spcdata.attribs.ensureWithin) {
SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin);
}
}
SocialCalc.Popup.Types.ColorChooser.MakeCustom = function(type, id) {
var i, ele, o, bg;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
var SPLoc = sp.LocalizeString;
var style = 'style="font-size:smaller;"';
var str = "";
str = '<div style="white-space:nowrap;"><br>'+
'#<input id="customvalue" style="width:75px;" value="'+spcdata.value+'"><br><br>'+
'<input '+style+' type="button" value="'+SPLoc("OK")+'" onclick="SocialCalc.Popup.Types.ColorChooser.CustomOK(\''+id+'\');return false;">'+
'<input '+style+' type="button" value="'+SPLoc("Grid")+'" onclick="SocialCalc.Popup.Types.ColorChooser.CustomToGrid(\''+id+'\');">'+
'<br></div>';
return str;
}
SocialCalc.Popup.Types.ColorChooser.ItemClicked = function(id, num) {
var oele, str, nele;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
SocialCalc.Popup.Close();
}
SocialCalc.Popup.Types.ColorChooser.CustomToList = function(id) {
var oele, str, nele;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
}
SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) {
var i, c;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
sp.SetValue(id, spcdata.customele.value);
sp.Close();
}
SocialCalc.Popup.Types.ColorChooser.Hide = function(type, id) {
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
sp.DestroyPopupDiv(spcdata.popupele, spcdata.dragregistered);
spcdata.popupele = null;
}
SocialCalc.Popup.Types.ColorChooser.Cancel = function(type, id) {
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
sp.SetValue(id, spcdata.oldvalue); // reset to old value
SocialCalc.Popup.Types.ColorChooser.Hide(type, id);
}
SocialCalc.Popup.Types.ColorChooser.CreateGrid = function (type, id) {
var ele, pos, row, rowele, col, g;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var SPLoc = sp.LocalizeString;
var spcdata = spc[id].data;
spcdata.grid = {};
var grid = spcdata.grid;
var mainele = document.createElement("div");
ele = document.createElement("table");
ele.cellSpacing = 0;
ele.cellPadding = 0;
ele.style.width = "100px";
grid.table = ele;
ele = document.createElement("tbody");
socialcalc/socialcalcpopup.js view on Meta::CPAN
return grid[row+","+col];
}
SocialCalc.Popup.Types.ColorChooser.DetermineColors = function(id) {
var sp = SocialCalc.Popup;
var spt = sp.Types;
var sptc = spt.ColorChooser;
var spc = sp.Controls;
var spcdata = spc[id].data;
var grid = spcdata.grid;
var col, row;
var rgb = sp.splitRGB(spcdata.value);
var color;
col = 2;
row = 16-Math.floor((rgb.r+16)/16);
grid["selectedrow"+col] = row;
for (row=0; row<16; row++) {
sptc.gridToG(grid,row,col).rgb = sp.makeRGB(17*(15-row),0,0);
}
col = 3;
socialcalc/socialcalcpopup.js view on Meta::CPAN
}
SocialCalc.Popup.Types.ColorChooser.SetColors = function(id) {
var row, col, g, ele, rgb;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var sptc = spt.ColorChooser;
var spc = sp.Controls;
var spcdata = spc[id].data;
var grid = spcdata.grid;
for (row=0; row<16; row++) {
for (col=0; col<5; col++) {
g = sptc.gridToG(grid,row, col);
g.ele.style.backgroundColor = g.rgb;
g.ele.title = sp.RGBToHex(g.rgb);
if (grid["selectedrow"+col]==row) {
g.ele.style.backgroundImage = "url("+sp.imagePrefix+"chooserarrow.gif)";
}
else {
g.ele.style.backgroundImage = "";
}
}
}
sp.SetValue(id, spcdata.value);
grid.msg.style.backgroundColor = spcdata.value;
rgb = sp.splitRGB(spcdata.value || "rgb(255,255,255)");
if (rgb.r+rgb.g+rgb.b < 220) {
grid.msg.style.color = "#FFF";
}
else {
grid.msg.style.color = "#000";
}
if (!spcdata.value) { // default
grid.msg.style.backgroundColor = "#FFF";
grid.msg.style.backgroundImage = "url("+sp.imagePrefix+"defaultcolor.gif)";
grid.msg.title = "Default";
}
else {
grid.msg.style.backgroundImage = "";
grid.msg.title = sp.RGBToHex(spcdata.value);
}
}
SocialCalc.Popup.Types.ColorChooser.GridMouseDown = function(e) {
var event = e || window.event;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var sptc = spt.ColorChooser;
var spc = sp.Controls;
var id = sp.Current.id;
if (!id) return;
var spcdata = spc[id].data;
var grid = spcdata.grid;
switch (event.type) {
case "mousedown":
grid.mousedown = true;
break;
case "mouseup":
grid.mousedown = false;
break;
case "mousemove":
if (!grid.mousedown) {
socialcalc/socialcalcpopup.js view on Meta::CPAN
var clientX = event.clientX + viewport.horizontalScroll;
var clientY = event.clientY + viewport.verticalScroll;
var gpos = SocialCalc.GetElementPosition(grid.table);
var row = Math.floor((clientY-gpos.top-2)/10); // -2 is to split the diff btw IE & FF
row = row < 0 ? 0 : row;
var col = Math.floor((clientX-gpos.left)/20);
row = row < 0 ? 0 : (row > 15 ? 15 : row);
col = col < 0 ? 0 : (col > 4 ? 4 : col);
var color = sptc.gridToG(grid,row,col).ele.style.backgroundColor;
var newrgb = sp.splitRGB(color);
var oldrgb = sp.splitRGB(spcdata.value);
switch (col) {
case 2:
spcdata.value = sp.makeRGB(newrgb.r, oldrgb.g, oldrgb.b);
break;
case 3:
spcdata.value = sp.makeRGB(oldrgb.r, newrgb.g, oldrgb.b);
break;
case 4:
spcdata.value = sp.makeRGB(oldrgb.r, oldrgb.g, newrgb.b);
break;
case 0:
case 1:
spcdata.value = color;
}
sptc.DetermineColors(id);
sptc.SetColors(id);
}
SocialCalc.Popup.Types.ColorChooser.ControlClicked = function(id) {
socialcalc/socialcalcpopup.js view on Meta::CPAN
var event = e || window.event;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var sptc = spt.ColorChooser;
var spc = sp.Controls;
var id = sp.Current.id;
if (!id) return;
var spcdata = spc[id].data;
spcdata.value = "";
SocialCalc.Popup.SetValue(id, spcdata.value);
SocialCalc.Popup.Close();
}
SocialCalc.Popup.Types.ColorChooser.CustomClicked = function(e) {
var event = e || window.event;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var sptc = spt.ColorChooser;
var spc = sp.Controls;
var id = sp.Current.id;
if (!id) return;
var spcdata = spc[id].data;
var oele, str, nele;
oele = spcdata.contentele;
str = SocialCalc.Popup.Types.ColorChooser.MakeCustom("ColorChooser", id);
nele = document.createElement("div");
nele.innerHTML = '<div style="cursor:default;padding:4px;background-color:#CCC;">'+str+'</div>';
spcdata.customele = nele.firstChild.firstChild.childNodes[2];
spcdata.contentele = nele;
spcdata.popupele.replaceChild(nele, oele);
spcdata.customele.value = sp.RGBToHex(spcdata.value);
if (spcdata.attribs.ensureWithin) {
SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin);
}
}
SocialCalc.Popup.Types.ColorChooser.CustomToGrid = function(id) {
var oele, str, nele;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value));
var oele, mainele, nele;
oele = spcdata.contentele;
mainele = SocialCalc.Popup.Types.ColorChooser.CreateGrid("ColorChooser", id);
nele = document.createElement("div");
nele.style.padding = "3px";
nele.style.backgroundColor = "#CCC";
nele.appendChild(mainele);
spcdata.customele = null;
spcdata.contentele = nele;
spcdata.popupele.replaceChild(nele, oele);
if (spcdata.attribs.ensureWithin) {
SocialCalc.Popup.EnsurePosition(id, spcdata.attribs.ensureWithin);
}
}
SocialCalc.Popup.Types.ColorChooser.CustomOK = function(id) {
var i, c;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var spc = sp.Controls;
var spcdata = spc[id].data;
SocialCalc.Popup.SetValue(id, sp.HexToRGB("#"+spcdata.customele.value));
SocialCalc.Popup.Close();
}
SocialCalc.Popup.Types.ColorChooser.CloseOK = function(e) {
var event = e || window.event;
var sp = SocialCalc.Popup;
var spt = sp.Types;
var sptc = spt.ColorChooser;
var spc = sp.Controls;
var id = sp.Current.id;
if (!id) return;
var spcdata = spc[id].data;
SocialCalc.Popup.SetValue(id, spcdata.value);
SocialCalc.Popup.Close();
}
socialcalc/socialcalcserver.pl view on Meta::CPAN
.smaller {font-size:smaller;}
</style>
</head>
<body>
<form action="" method="POST">
<div style="padding:6px;background-color:#80A9F3;">
<div style="font-weight:bold;color:white;">SIMPLE SYSTEM FOR EDITING SOCIALCALC FILES</div>
<div style="color:#FDD;font-weight:bold;">Initial Setup</div>
<div style="padding:6px;background-color:#80A9F3;">
Name of subdirectory of where the code is to hold spreadsheet data files:
<input name="datadir" type="text" value="scdata/"><br>
Name of subdirectory of server home page that has the JavaScript files and the images subdirectory
(only needed if running on Apache, etc., not when running standalone from the
command line in Perl): <input name="jsdir" type="text" value="/sgi/scjs/"><br>
<input type="submit" name="setup" value="Save">
</div>
<br>
</form>
</div>
<br>
</body>
socialcalc/socialcalcserver.pl view on Meta::CPAN
window.setTimeout(function(){SocialCalc.ResumeFromCmdExtension();}, 10);
}
// Remote data lookup demo code
var loadtimerobj;
function loadsheet(sheetname) {
var matches = sheetname.match(/^\\{scdata\\:\\s+(.+?)\\}\$/); // {scdata: URL w/o http://)
if (!matches) {
return false;
}
var loadscript = document.createElement("script");
loadscript.type = "text/javascript";
loadscript.src = "http://"+matches[1]+"?"+((new Date()).getTime()+'0');
document.body.appendChild(loadscript);
socialcalc/socialcalctableeditor.js view on Meta::CPAN
break;
default:
editor.context.sheetobj.ScheduleSheetCommands(cmdstr, saveundo);
break;
}
}
//
// EditorSheetStatusCallback(recalcdata, status, arg, editor)
//
// Called during recalc, executing commands, etc.
//
SocialCalc.EditorSheetStatusCallback = function(recalcdata, status, arg, editor) {
var f, cell, dcmd;
var sheetobj = editor.context.sheetobj;
var signalstatus = function(s) {
for (f in editor.StatusCallback) {
if (editor.StatusCallback[f].func) {
editor.StatusCallback[f].func(editor, s, arg, editor.StatusCallback[f].params);
}
}