App-SocialCalc-Multiplayer

 view release on metacpan or  search on metacpan

socialcalc/socialcalcserver.pl  view on Meta::CPAN

   my @pagefiles = glob("$datadir*"); # Get list of all pages
   for (my $pnum=0; $pnum <= $#pagefiles; $pnum++) {
      $pagefiles[$pnum] =~ m/^(?:.*\/){0,1}(.*)$/;
      $response .= qq!<span style="font-size:smaller;">$1</span> <input class="smaller" type="submit" value="Edit" onclick="doedit('$1');"> !;
      $response .= qq! <input class="smaller" type="submit" value="View" onclick="doview('$1');"><br>!;
      }

   $response .= <<"EOF";
<input id="pagename" name="pagename" type="hidden" value="">
<input id="edit" name="edit" type="hidden" value="">
<input id="view" name="view" type="hidden" value="">
</div>
<br>
</form>
<form action="" method="POST">
<input type="text" name="newpagename" value="">
<input type="submit" name="newpage" value="Create New Page">
<input type="hidden" name="edit" value="yes">
</form>
</div>
<br>
</body>
</html>
EOF

   return $response;
   }



#
# start_editsheet($pagename, $q, $statusmessage)
#    - render initial editing display
#

sub start_editsheet {

   my ($pagename, $q, $statusmessage) = @_;

   my ($response, $sheetstr);

   open (PAGEFILEIN, "$datadir$pagename");

   while (my $line = <PAGEFILEIN>) {
      $sheetstr .= $line;
      }
   $sheetstr = special_chars($sheetstr);

   close PAGEFILEIN;

   $response = <<"EOF"; # output page with edit JS code
<!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>
<form name="f0" 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;">$statusmessage &nbsp;</div>
<div style="margin-bottom:6px;">Editing page: <span style="font-style:italic;font-weight:bold;">$pagename</span></div>
<input class="smaller" type="submit" name="savespreadsheet" value="Save" onclick="dosave();">
<input class="smaller" type="submit" name="cancelspreadsheet" value="Cancel">
<textarea name="savestr" id="sheetdata" style="display:none;">$sheetstr</textarea>
<input type="hidden" name="newstr" id="newdata" value="">
<input type="hidden" name="pagename" value="$pagename">
</div>
</form>
<div id="tableeditor" style="margin:8px 0px 10px 0px;">editor goes here</div>
<script>

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', '');

socialcalc/socialcalcserver.pl  view on Meta::CPAN

   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>
<div style="color:#FDD;font-weight:bold;">$statusmessage &nbsp;</div>
<div style="margin-bottom:6px;">Editing page: <span style="font-style:italic;font-weight:bold;">$pagename</span></div>
<form name="f0" action="" method="POST">
<input class="smaller" type="submit" name="doneview" value="Done">
</form>
<a href="?pagename=$pagename&view=yes&print=yes" target="_blank">Printer-friendly</a>
</div>
EOF
      }

   $response .= <<"EOF";
<textarea name="savestr" id="sheetdata" style="display:none;">$sheetstr</textarea>
<div id="main">Sheet goes here</div>
<script>

// start everything

   var spreadsheet = new SocialCalc.SpreadsheetControl();

   SocialCalc.Constants.defaultImagePrefix = "$jsdir$imagedir";
   SocialCalc.Popup.imagePrefix = "$jsdir$imagedir";

   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));
         }
      }

   var html = spreadsheet.CreateSheetHTML();
   document.getElementById("main").innerHTML = html;

</script>
</body>
</html>
EOF

   return $response;

   }


# # # # # # # # # #



( run in 0.974 second using v1.01-cache-2.11-cpan-99c4e6809bf )