App-SocialCalc-Multiplayer
view release on metacpan or search on metacpan
socialcalc/simpleedit15.pl view on Meta::CPAN
$line =~ s/\r//g;
if ($line =~ m/^\[(spreadsheet|datatable|drawing)\:(.*?)\:/) {
my $sheettype = $1;
my $sheetname = $2;
my $sheetstr;
while (my $sline = <PAGEFILEIN>) {
$sline =~ s/\r//g;
last if $sline =~ m/^:(spreadsheet|datatable|drawing)]/;
$sheetstr .= $sline;
}
my $htmlpos = index($sheetstr, "\nHTML:\n");
my $html="";
my $localhtml="";
if ($htmlpos >= 0) {
$html = substr($sheetstr, $htmlpos+7);
$sheetstr = substr($sheetstr, 0, $htmlpos);
my $sheet = CreateSheet();
my $parts = DecodeSpreadsheetSave($sheetstr);
ParseSheetSave($sheet, $parts->{sheet});
my $context = CreateRenderContext($sheet);
$localhtml = RenderSheet($context, {newwinlinks => 0});
}
else {
$html = "Sheet goes here";
$localhtml = "Sheet goes here";
}
$sheetstr = special_chars($sheetstr);
$pagestr .= <<"EOF";
<textarea id="sheetdata-$sheetname" style="display:none;">$sheetstr</textarea>
<table cellspacing="0" cellpadding="0" width="100%">
<tr onmouseout="hide_buttons(!document.getElementById('showb').checked);"
onmouseover="hide_buttons(false);"><td valign="top" id="sheet-$sheetname">$localhtml</td>
<td class="hideable" width="5" style="visibility:hidden;border-top:1px solid #80A9F3;border-bottom:1px solid #80A9F3;padding:6px;"> </td>
<td class="hideable" width="100" valign="middle" style="visibility:hidden;border-left:1px solid #80A9F3;padding:6px;">
<span style="font-size:smaller;">$sheettype:<br>$sheetname<br></span>
<input type="submit" name="edit$sheettype:$sheetname" value="Edit" style="font-size:smaller;">
</td></tr></table>
<script>
if("$sheettype"!="spreadsheet") show_$sheettype("$sheetname");
</script>
EOF
}
else {
$pagestr .= expand_wikitext($line);
}
}
close PAGEFILEIN;
$response = <<"EOF";
<!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>Simple Page Editor With Spreadsheets $versionstr</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}drawlib3.js"></script>
<script>
function show_datatable(sheetname) {
var sheet = new SocialCalc.Sheet();
sheet.ParseSheetSave(document.getElementById("sheetdata-"+sheetname).value);
var context=new SocialCalc.RenderContext(sheet);
context.CalculateCellSkipData();
context.CalculateColWidthData();
context.showGrid=true;
context.showRCHeaders=true;
var teobj=new SocialCalc.TableEditor(context);
teobj.imageprefix="/sgi/scjstest/sc";
teobj.recalcFunction = null;
var sizes = SocialCalc.GetViewportInfo();
var teelement=teobj.CreateTableEditor(800, 300);
var teid=document.getElementById("sheet-"+sheetname);
teid.replaceChild(teelement, teid.firstChild);
teobj.SchedulePositionCalculations();
}
function show_drawing(sheetname) {
var teid=document.getElementById("sheet-"+sheetname);
var sheet = new SocialDraw.Sheet(teid, false, document.getElementById("sheetdata-"+sheetname).value);
sheet.Display();
}
function hide_buttons(hide) {
var val=hide ? 'hidden':'visible';
var tds = document.getElementsByTagName("td");
for (var i=0; i<tds.length; i++) {
if (tds[i].className=="hideable") tds[i].style.visibility=val;
}
}
</script>
<style>
body, td, input, texarea
{font-family:verdana,helvetica,sans-serif;font-size:small;}
</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 PAGES WITH SPREADSHEETS AND MORE</div>
<div style="color:#FDD;font-weight:bold;">$statusmessage </div>
<table cellspacing="0" cellpadding="0" width="100%">
<tr>
<td>
Viewing page: <span style="font-style:italic;font-weight:bold;">$pagename</span>
<input type="submit" name="editpage" value="Edit This Page" style="font-size:smaller;">
</td>
<td align="right">
<input type="submit" name="editrawpage" value="Edit Raw Page" style="font-size:smaller;">
</td></tr></table>
</div>
<div style="border:6px solid #80A9F3;padding:0px 10px 10px 10px;">
<div style="padding-top:5px;">
<table cellpadding="0" cellspacing="0"><tr><td width="100%"></td><td valign="top">
<input id="showb" type="checkbox" value="1" onclick="hide_buttons(!this.checked);">
</td><td style="font-size:smaller;padding-left:4px;">Show item<br>edit buttons</td>
socialcalc/simpleedit15.pl view on Meta::CPAN
<input type="submit" name="savepageedit" value="Save">
<input type="hidden" name="edittype" value="$edittype">
<input type="submit" name="canceledit" value="Cancel">
</td>
<td align="right">
EOF
if ($edittype eq "clean") {
$response .= <<"EOF";
<input type="submit" value="Add Spreadsheet" onclick="return addss('spreadsheet');" style="font-size:smaller;">
<input type="submit" value="Add Data Table" onclick="return addss('datatable');" style="font-size:smaller;">
<input type="submit" value="Add Character Drawing" onclick="return addss('drawing');" style="font-size:smaller;">
EOF
}
$response .= <<"EOF";
</td></tr></table>
</div>
<textarea name="pagetext" rows="20" style="width:100%;">$pagestr</textarea>
<input type="hidden" name="pagename" value="$pagename">
</div>
</form>
</body>
</html>
EOF
return $response;
}
#
# start_editsheet($pagename, $sheetname, $q, $statusmessage)
# - render initial editing display
#
sub start_editsheet {
my ($pagename, $sheetname, $q, $statusmessage) = @_;
my ($response, $sheetstr);
my $page = {};
load_page($q, $pagename, $page);
$sheetstr = $page->{items}{$sheetname}{text};
my $htmlpos = index($sheetstr, "\nHTML:\n");
if ($htmlpos >= 0) {
$sheetstr = substr($sheetstr, 0, $htmlpos);
}
$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>Simple Page Editor With Spreadsheets $versionstr</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;}
</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 PAGES WITH SPREADSHEETS AND MORE</div>
<div style="color:#FDD;font-weight:bold;">$statusmessage </div>
<div style="margin-bottom:6px;">Editing page: <span style="font-style:italic;font-weight:bold;">$pagename</span></div>
<input type="submit" name="savespreadsheet" value="Save" onclick="dosave();">
<input 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">
<input type="hidden" name="sheetname" value="$sheetname">
</div>
</form>
<div id="msg" style="position:absolute;right:15px;">
<input type="button" style="font-size:x-small;" value="Clear" onclick="addmsg('',true);"><br>
<input type="button" style="font-size:x-small;" value="ShowCols" onclick="showvalue();"><br>
<textarea id="msgtext" style="margin-top:10px;width:140px;height:500px;"></textarea>
</div>
<div id="tableeditor" style="margin:8px 170px 10px 0px;">editor goes here</div>
<script>
document.getElementById("msgtext").value = "";
function setmsg(msg) {document.getElementById("msg").innerHTML = msg;}
function addmsg(msg, clear) {
var msgtextid = document.getElementById("msgtext");
if (!msgtextid) {
document.getElementById("msg").innerHTML = '<textarea id="msgtext" cols="60" rows="5"></textarea>';
msgtextid = document.getElementById("msgtext");
}
if (clear) msgtextid.value = "";
if (msgtextid.value.length>0) msgtextid.value += "\\n";
msgtextid.value += msg;
}
var heights=[];
function showvalue() {
addmsg(spreadsheet.editor.colwidth, true);
}
// formatting callbacks
// Simple ExpandWiki code for testing
SocialCalc.Callbacks.expand_wiki = function(displayvalue, sheetobj, linkstyle, valueformat) {
var subtype = valueformat.substring(9); // stuff after text-wiki
var result = "";
var matches, url, scestring;
switch (subtype) {
case "":
result = SocialCalc.default_expand_markup(displayvalue, sheetobj, linkstyle);
break;
case "-pagelink":
matches = displayvalue.match(/\\[(\\S+)\\s+(.+)\\]/);
if (matches) {
url = encodeURI(matches[1]);
scestring = SocialCalc.special_chars(matches[2]);
}
else {
matches = displayvalue.match(/\\[(.*)\\]/);
if (matches) {
url = encodeURI(matches[1]);
scestring = SocialCalc.special_chars(matches[1]);
}
else {
url = encodeURI(displayvalue);
scestring = SocialCalc.special_chars(displayvalue);
}
}
result = '<a href="?pagename='+url+'" target="_blank">'+scestring+'</a>';
return result+ '<img src="'+spreadsheet.imagePrefix+'sc-wikilinkflag.gif" title="Link to other wiki page" alt="Link to other wiki page">';
default:
result = SocialCalc.special_chars(valueformat+": "+displayvalue);
break;
}
return '<img src="'+spreadsheet.imagePrefix+'sc-wikiflag.gif" alt="Wikitext" title="Wikitext">' + result;
}
// Page link code
SocialCalc.Callbacks.MakePageLink = function(pagename, workspace, linktyle, valueformat) {
var result = "";
if (workspace) {
result = "?&workspace=" + encodeURI(workspace) + "&pagename=" + encodeURI(pagename);
}
else {
result = "?&pagename=" + encodeURI(pagename);
}
return result;
}
// Additional formula functions
var funccache = {};
var functimer = null;
var funcquery = "";
SocialCalc.Formula.SocialtextFunction = function(fname, operand, foperand, sheet) {
var value1, t;
var scf = SocialCalc.Formula;
var query = "a="+foperand.length;
var num = 0;
while (foperand.length > 0) {
value1 = scf.OperandValueAndType(sheet, foperand);
t = encodeURI(value1.type);
num++;
query += "&a"+num+"="+t+":"+encodeURI(value1.value);
}
if (funccache[query]) { // got this already
t = funccache[query].indexOf(":");
if (t) {
scf.PushOperand(operand, funccache[query].substring(0,t), funccache[query].substring(t+1));
}
else {
scf.PushOperand(operand, "t", "Server Error? "+funccache[query]);
}
return null;
}
scf.RemoteFunctionInfo.waitingForServer = "SOCIALTEXT"; // say what waiting for
funcquery = query; // remember for setting when get it
ajaxrequest2("", "&rpc=socialtext&"+query);
return "Waiting for server"; // return an error for function
}
// Add to function list
SocialCalc.Formula.FunctionList["SOCIALTEXT"] = [SocialCalc.Formula.SocialtextFunction, -1];
// define functions
function loadsheet(sheetname) {
addmsg("loadsheet:"+sheetname);
return ajaxrequest("", "&loadsheet="+encodeURIComponent(sheetname));
}
SocialCalc.RecalcInfo.LoadSheet = loadsheet;
// function
var http_request;
function ajaxrequest(url, contents) {
http_request = null;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
( run in 2.125 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )