App-SocialCalc-Multiplayer
view release on metacpan or search on metacpan
socialcalc/socialcalcserver.pl view on Meta::CPAN
function dosave() {
var sheetstr = spreadsheet.CreateSpreadsheetSave();
document.getElementById("newdata").value = sheetstr;
}
// start everything
SocialCalc.Constants.defaultImagePrefix = "$jsdir$imagedir";
SocialCalc.Popup.imagePrefix = "$jsdir$imagedir";
var spreadsheet = new SocialCalc.SpreadsheetControl();
spreadsheet.InitializeSpreadsheetControl("tableeditor", 0, 0, 0);
SocialCalc.SheetCommandInfo.CmdExtensionCallbacks.docmd = {func:docmdext, data:spreadsheet};
SocialCalc.SheetCommandInfo.CmdExtensionCallbacks.loadclipboard = {func:doloadclipboardext, data:spreadsheet};
var savestr = document.getElementById("sheetdata").value;
var parts = spreadsheet.DecodeSpreadsheetSave(savestr);
if (parts) {
if (parts.sheet) {
spreadsheet.sheet.ResetSheet();
spreadsheet.ParseSheetSave(savestr.substring(parts.sheet.start, parts.sheet.end));
}
if (parts.edit) {
spreadsheet.editor.LoadEditorSettings(savestr.substring(parts.edit.start, parts.edit.end));
}
if (parts.startupmacro) {
spreadsheet.editor.EditorScheduleSheetCommands(savestr.substring(parts.startupmacro.start, parts.startupmacro.end), false, true);
}
}
if (spreadsheet.sheet.attribs.recalc=="off") {
spreadsheet.sheet.attribs.needsrecalc = "yes"; // default turn it on
spreadsheet.ExecuteCommand('redisplay', '');
}
else {
spreadsheet.ExecuteCommand('recalc', '');
}
function docmdext (name, data, sheet, cmd, saveundo) {
var cmdstr = cmd.RestOfString();
data.editor.EditorScheduleSheetCommands(cmdstr, false, false);
SocialCalc.SheetCommandInfo.cmdextensionbusy = "Do Cmd Ext "+cmdstr;
window.setTimeout(function(){SocialCalc.ResumeFromCmdExtension();}, 100);
}
function doloadclipboardext (name, data, sheet, cmd, saveundo) {
var cmdstr = cmd.RestOfString();
SocialCalc.SheetCommandInfo.cmdextensionbusy = "Load Clipboard Ext "+cmdstr;
loaddata(cmdstr);
// window.setTimeout(function(){SocialCalc.ResumeFromCmdExtension();}, 100);
// SocialCalc.ResumeFromCmdExtension();
}
var loaddatatimerobj;
function loaddata(url) {
var loadscript = document.createElement("script");
loadscript.type = "text/javascript";
loadscript.src = url+"?"+((new Date()).getTime()+'0');
document.body.appendChild(loadscript);
loaddatatimerobj = window.setTimeout(loaddatatimeout, 4000);
}
function doloaddataload(val) {
if (loaddatatimerobj) {
window.clearTimeout(loaddatatimerobj);
loaddatatimerobj = null;
}
var sview = SocialCalc.GetSpreadsheetControlObject();
parts = sview.DecodeSpreadsheetSave(val);
if (parts) {
if (parts.sheet) {
SocialCalc.Clipboard.clipboard = SocialCalc.decodeFromSave(val.substring(parts.sheet.start, parts.sheet.end));
}
}
// window.setTimeout(function(){SocialCalc.ResumeFromCmdExtension();}, 100);
SocialCalc.ResumeFromCmdExtension();
}
function loaddatatimeout() {
if (loaddatatimerobj) {
window.clearTimeout(loaddatatimerobj);
loaddatatimerobj = null;
}
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);
loadtimerobj = window.setTimeout(loadframetimeout, 4000);
return true;
}
SocialCalc.RecalcInfo.LoadSheet = loadsheet;
function doloadframeload(val) {
if (loadtimerobj) {
window.clearTimeout(loadtimerobj);
loadtimerobj = null;
}
var sview = SocialCalc.GetSpreadsheetControlObject();
parts = sview.DecodeSpreadsheetSave(val);
if (parts) {
if (parts.sheet) {
SocialCalc.RecalcLoadedSheet(null, val.substring(parts.sheet.start, parts.sheet.end), true); // notify recalc loop
}
}
if (val=="") {
SocialCalc.RecalcLoadedSheet(null, "", true); // notify recalc loop that it's not available, but that we tried
}
}
function loadframetimeout() {
if (loadtimerobj) {
window.clearTimeout(loadtimerobj);
loadtimerobj = null;
}
SocialCalc.RecalcLoadedSheet(null, "", true); // notify recalc loop that it's not available, but that we tried
}
</script>
</body>
</html>
EOF
return $response;
}
#
# start_viewsheet($pagename, $q, $statusmessage)
# - render sheet
#
sub start_viewsheet {
my ($pagename, $q, $statusmessage) = @_;
my ($response, $sheetstr);
open (PAGEFILEIN, "$datadir$pagename");
while (my $line = <PAGEFILEIN>) {
$sheetstr .= $line;
}
$sheetstr = special_chars($sheetstr);
$response = <<"EOF"; # output page with JS code to render
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>$titlestr - $pagename</title>
<script type="text/javascript" src="${jsdir}socialcalcconstants.js"></script>
<script type="text/javascript" src="${jsdir}socialcalc-3.js"></script>
<script type="text/javascript" src="${jsdir}socialcalctableeditor.js"></script>
<script type="text/javascript" src="${jsdir}formatnumber2.js"></script>
<script type="text/javascript" src="${jsdir}formula1.js"></script>
<script type="text/javascript" src="${jsdir}socialcalcpopup.js"></script>
<script type="text/javascript" src="${jsdir}socialcalcspreadsheetcontrol.js"></script>
<style>
body, td, input, texarea
{font-family:verdana,helvetica,sans-serif;font-size:small;}
.smaller {font-size:smaller;}
</style>
</head>
<body>
EOF
if (!$q->param('print')) {
$response .= <<"EOF";
<div style="padding:6px;background-color:#80A9F3;">
<div style="font-weight:bold;color:white;">SIMPLE SYSTEM FOR EDITING SOCIALCALC FILES</div>
( run in 0.735 second using v1.01-cache-2.11-cpan-39bf76dae61 )