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 )