Version 0.8.1

You can use the arrow keys and mouse to select cells in a manner similar to traditional spreadsheets. This includes using the shift key, as well as dragging.

The scrollbars should work in a normal manner. Because this is a spreadsheet, you can scroll any amount without needing to create new rows or columns. Dragging the thumb to the end of a scrollbar attempts to go to the last row or column where there is/was data. The mousewheel is also supported.

In addition to the scrollbars there are two pane sliders (that start out at the beginning of the scrollbars) that let you "lock" the upper rows or columns to facilitate keeping column and row headers visible when scrolling.

You can type values in cells. Press Enter, use an arrow key, or click on a cell to finish. If you are in a partial formula (e.g., "=1+" or "=SUM(") an arrow key or cell click will insert the name of the newly selected cell into the formula, similar to a traditional spreadsheet. Cell ranges are separated by typing a ":", or you can use the drag or shift-click range selection methods.

The program supports many forms of data, such as numbers, text (preceded by a "'" if necessary to distinguish it from numbers), dates (e.g., "1/2/3"), dollars ("$1,234.50"), time ("3:45"), numbers with fractions ("1 1/2"), and "true", "false", and "#N/A". A value's type determines its displayed format if there is no explicit numeric format set for a cell. The program supports a wide variety of formats (including other currencies) through its custom format functionality available on the Format tab.

Use the Esc key to cancel during edits. The Del key deletes the values of the selected cell(s).

The 109 formula functions that the June 2007 Open Document Format "Open Formula" specification calls the "small group" are available. (

The definitions of the functions follow common conventions, with common syntax similar to many other spreadsheets. You can, for example, have a function like IF(B10=B3, "Yes", "No"), where B10 and B3 may contain text values (comparisons are not case-sensitive).

This release has an HTML version of an editing interface. Most buttons on the toolbar display tooltips when you point to them with the mouse pointer.

The program maintains an undo stack accessed through the Undo and Redo buttons on the left of the Edit tab toolbar. Right now the stack saves up to 50 steps for undoing. The Ctrl-Z key may be used as a shortcut instead of the Undo button.

There is a

The

There is a

The

The

The

The

Pressing Ctrl-V when on the Edit tab and not editing a cell assumes that Tab-delimited data is on the regular clipboard, loads it into the SocialCalc clipboard, and then "pastes" it starting at the current cell. This is an easy way to copy data from a web page into a spreadsheet. Similarly, Ctrl-C loads the SocialCalc clipboard and the system clipboard. Ctrl-V differs from the Paste button in that it only pastes values and formulas, and not formats.

Right now this code is mainly being developed to run under control of a native Python application running on the OLPC XO. This version, though, can also be run directly in a browser.

When the program encounters an error, it may display a message at the bottom of the screen. You can click on the message to erase it.

Comments can be sent to "socialcalc" at "softwaregarden.com".

The following functions are currently supported in formulas (case is ignored in function names):

- ABS(value)
- Absolute value function.
- ACOS(value)
- Trigonometric arccosine function.
- AND(value1, value2, ...)
- True if all arguments are true.
- ASIN(value)
- Trigonometric arcsine function.
- ATAN(value)
- Trigonometric arctan function.
- ATAN2(valueX, valueY)
- Trigonometric arc tangent function (result is in radians).
- AVERAGE(value, value, ...)
- Averages the values.
- CHOOSE(index, value1, value2, ...)
- Returns the value specified by the index. The values may be ranges of cells.
- COLUMNS(range)
- Returns the number of columns in the range.
- COS(value)
- Trigonometric cosine function (value is in radians).
- COUNT(value, value, ...)
- Counts the number of numeric values, not blank, text, or error.
- COUNTA(value, value, ...)
- Counts the number of non-blank values.
- COUNTBLANK(value, value, ...)
- Counts the number of blank values. (Note: "" is not blank.)
- COUNTIF(range, criteria)
- Counts the number of number of cells in the range that meet the criteria. The criteria may be a value ("x", 15, 1+3) or a test (>25).
- DATE(year, month, day)
- Returns the appropriate date value given numbers for year, month, and day. For example: DATE(2006,2,1) for February 1, 2006. Note: In this program, day "1" is December 31, 1899 and the year 1900 is not a leap year. Some programs use January 1, 1900, as day "1" and treat 1900 as a leap year. In both cases, though, dates on or after March 1, 1900, are the same.
- DAVERAGE(databaserange, fieldname, criteriarange)
- Averages the values in the specified field in records that meet the criteria.
- DAY(value)
- Returns the day of month for a date value.
- DCOUNT(databaserange, fieldname, criteriarange)
- Counts the number of numeric values, not blank, text, or error, in the specified field in records that meet the criteria.
- DCOUNTA(databaserange, fieldname, criteriarange)
- Counts the number of non-blank values in the specified field in records that meet the criteria.
- DDB(cost, salvage, lifetime, period [, factor])
- Returns the amount of depreciation at the given period of time (the default factor is 2 for double-declining balance).
- DEGREES(value)
- Converts value in radians in to degrees.
- DGET(databaserange, fieldname, criteriarange)
- Returns the value of the specified field in the single record that meets the criteria.
- DMAX(databaserange, fieldname, criteriarange)
- Returns the maximum of the numeric values in the specified field in records that meet the criteria.
- DMIN(databaserange, fieldname, criteriarange)
- Returns the maximum of the numeric values in the specified field in records that meet the criteria.
- DPRODUCT(databaserange, fieldname, criteriarange)
- Returns the result of multiplying the numeric values in the specified field in records that meet the criteria.
- DSTDEV(databaserange, fieldname, criteriarange)
- Returns the sample standard deviation of the numeric values in the specified field in records that meet the criteria.
- DSTDEVP(databaserange, fieldname, criteriarange)
- Returns the standard deviation of the numeric values in the specified field in records that meet the criteria.
- DSUM(databaserange, fieldname, criteriarange)
- Returns the sum of the numeric values in the specified field in records that meet the criteria.
- DVAR(databaserange, fieldname, criteriarange)
- Returns the sample variance of the numeric values in the specified field in records that meet the criteria.
- DVARP(databaserange, fieldname, criteriarange)
- Returns the variance of the numeric values in the specified field in records that meet the criteria.
- EVEN(value)
- Rounds the value up in magnitude to the nearest even integer.
- EXACT(value1, value2)
- Returns "true" if the values are exactly the same, including case, type, etc.
- EXP(value)
- Returns e raised to the value power.
- FACT(value)
- Returns factorial of the value.
- FALSE( )
- Returns the logical value "false".
- FIND(string1, string2 [, start])
- Returns the starting position within string2 of the first occurrence of string1 at or after "start". If start is omitted, 1 is assumed.
- FV(rate, n, payment, [pv, [paytype]])
- Returns the future value of repeated payments of money invested at the given rate for the specified number of periods, with optional present value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period).
- HLOOKUP(value, range, row, [rangelookup])
- Look for the matching value for the given value in the range and return the corresponding value in the cell specified by the row offset. If rangelookup is 1 (the default) and not 0, match if within numeric brackets (match<=value) instead of exact match.
- HOUR(value)
- Returns the hour portion of a time or date/time value.
- IF(logical-expression, true-value, false-value)
- Results in true-value if logical-expression is TRUE or non-zero, otherwise results in false-value.
- INDEX(range, rownum, colnum)
- Returns a cell or range reference for the specified row and column in the range. If range is 1-dimensional, then only one of rownum or colnum are needed. If range is 2-dimensional and rownum or colnum are zero, a reference to the range of just the specified column or row is returned. You can use the returned reference value in a range, e.g., sum(A1:INDEX(A2:A10,4)).
- INT(value)
- Returns the value rounded down to the nearest integer (towards -infinity).
- IRR(range, [guess])
- Returns the interest rate at which the cash flows in the range have a net present value of zero. Uses an iterative process that will return #NUM! error if it does not converge. There may be more than one possible solution. Providing the optional guess value may help in certain situations where it does not converge or finds an inappropriate solution (the default guess is 10%).
- ISBLANK(value)
- Returns "true" if the value is a reference to a blank cell.
- ISERR(value)
- Returns "true" if the value is of type "Error" but not "NA".
- ISERROR(value)
- Returns "true" if the value is of type "Error".
- ISLOGICAL(value)
- Returns "true" if the value is of type "Logical" (true/false).
- ISNA(value)
- Returns "true" if the value is the error type "NA".
- ISNONTEXT(value)
- Returns "true" if the value is not of type "Text".
- ISNUMBER(value)
- Returns "true" if the value is of type "Number" (including logical values).
- ISTEXT(value)
- Returns "true" if the value is of type "Text".
- LEFT(text, count)
- Returns the specified number of characters from the text value. If count is omitted, 1 is assumed.
- LEN(text)
- Returns the number of characters in the text value.
- LN(value)
- Returns the natural logarithm of the value.
- LOG(value, base)
- Returns the logarithm of the value using the specified base.
- LOG10(value)
- Returns the base 10 logarithm of the value.
- LOWER(text)
- Returns the text value with all uppercase characters converted to lowercase.
- MATCH(value, range, [rangelookup])
- Look for the matching value for the given value in the range and return position (the first is 1) in that range. If rangelookup is 1 (the default) and not 0, match if within numeric brackets (match<=value) instead of exact match. If rangelookup is -1, act like 1 but the bracket is match>=value.
- MAX(value, value, ...)
- Returns the maximum of the numeric values.
- MID(text, start, length)
- Returns the specified number of characters from the text value starting from the specified position.
- MIN(value1, value2, ...)
- Returns the minimum of the numeric values.
- MINUTE(value)
- Returns the minute portion of a time or date/time value.
- MOD(value1, value2)
- Returns the remainder of the first value divided by the second.
- MONTH(value)
- Returns the month part of a date value.
- N(value)
- Returns the value if it is a numeric value otherwise an error.
- NA( )
- Returns the #N/A error value which propagates through most operations.
- NOT(value)
- Returns FALSE if value is true, and TRUE if it is false.
- NOW( )
- Returns the current date/time.
- NPER(rate, payment, pv, [fv, [paytype]])
- Returns the number of periods at which payments invested each period at the given rate with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period) has the given present value.
- NPV(rate, value1, value2, ...)
- Returns the net present value of cash flows (which may be individual values and/or ranges) at the given rate. The flows are positive if income, negative if paid out, and are assumed at the end of each period.
- ODD(value)
- Rounds the value up in magnitude to the nearest odd integer.
- OR(value1, value2,...)
- True if any argument is true
- PI( )
- The value 3.1415926...
- PMT(rate, n, pv, [fv, [paytype]])
- Returns the amount of each payment that must be invested at the given rate for the specified number of periods to have the specified present value, with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period).
- POWER(value1, value2)
- Returns the first value raised to the second value power.
- PRODUCT(value1, value2, ...)
- Returns the result of multiplying the numeric values.
- PROPER(value)
- Returns the text value with the first letter of each word converted to uppercase and the others to lowercase.
- PV(rate, n, payment, [fv, [paytype]])
- Returns the present value of the given number of payments each invested at the given rate, with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period).
- RADIANS(value)
- Converts value in degrees into radians.
- RATE(n, payment, pv, [fv, [paytype, [guess]]])
- Returns the rate at which the given number of payments each invested at the given rate has the specified present value, with optional future value (default 0) and payment type (default 0 = at end of period, 1 = beginning of period). Uses an iterative process that will return #NUM! error if it does not converge. There may be more than one possible solution. Providing the optional guess value may help in certain situations where it does not converge or finds an inappropriate solution (the default guess is 10%).
- REPLACE(text1, start, length, text2)
- Returns text1 with the specified number of characters starting from the specified position replaced by text2.
- REPT(text, count)
- Returns the text repeated the specified number of times.
- RIGHT(text, count)
- Returns the specified number of characters from the text value starting from the end. If count is omitted, 1 is assumed.
- ROUND(value, [precision])
- Rounds the value to the specified number of decimal places. If precision is negative, then round to powers of 10. The default precision is 0 (round to integer).
- ROWS(range)
- Returns the number of rows in the range.
- SECOND(value)
- Returns the second portion of a time or date/time value (truncated to an integer).
- SIN(value)
- Trigonometric sine function (value is in radians)
- SLN(cost, salvage, lifetime, period)
- Returns the amount of depreciation at each period of time using the straight-line method.
- SQRT(value)
- Square root of the value
- STDEV(value, value, ...)
- Returns the sample standard deviation of the numeric values.
- STDEVP(value, value, ...)
- Returns the standard deviation of the numeric values.
- SUBSTITUTE(text1, oldtext, newtext [, occurrence])
- Returns text1 with the all occurrences of oldtext replaced by newtext. If "occurrence" is present, then only that occurrence is replaced.
- SUM(value, value, ...)
- Adds the numeric values. The values to the sum function may be ranges in the form similar to A1:B5.
- SUMIF(range1, criteria [, range2])
- Sums the numeric values of cells in the range that meet the criteria. The criteria may be a value ("x", 15, 1+3) or a test (>25). If range2 is present, then range1 is tested and the corresponding range2 value is summed.
- SYD(cost, salvage, lifetime, period)
- Depreciation by Sum of Year's Digits method.
- T(value)
- Returns the text value or else a null string.
- TAN(value)
- Trigonometric tangent function (value is in radians)
- TIME(hour, minute, second)
- Returns the time value given the specified hour, minute, and second.
- TODAY( )
- Returns the current date (an integer). Note: In this program, day "1" is December 31, 1899 and the year 1900 is not a leap year. Some programs use January 1, 1900, as day "1" and treat 1900 as a leap year. In both cases, though, dates on or after March 1, 1900, are the same.
- TRIM(text)
- Returns the text value with leading, trailing, and repeated spaces removed.
- TRUE( )
- Returns the logical value "true".
- TRUNC(value, precision)
- Truncates the value to the specified number of decimal places. If precision is negative, truncate to powers of 10.
- UPPER(text)
- Returns the text value with all lowercase characters converted to uppercase.
- VALUE(value)
- Converts the specified text value into a numeric value. Various forms that look like numbers (including digits followed by %, forms that look like dates, etc.) are handled. This may not handle all of the forms accepted by other spreadsheets and may be locale dependent.
- VAR(value, value, ...)
- Returns the sample variance of the numeric values.
- VARP(value, value, ...)
- Returns the variance of the numeric values.
- VLOOKUP(value, range, col, [rangelookup])
- Look for the matching value for the given value in the range and return the corresponding value in the cell specified by the column offset. If rangelookup is 1 (the default) and not 0, match if within numeric brackets (match<=value) instead of exact match.
- WEEKDAY(date, [type])
- Returns the day of week specified by the date value. If type is 1 (the default), Sunday is day and Saturday is day 7. If type is 2, Monday is day 1 and Sunday is day 7. If type is 3, Monday is day 0 and Sunday is day 6.
- YEAR(date)
- Returns the year part of a date value.

ABOUT TEXT:

For more information, see the Software Garden OLPC Home Page (www.peapodcast.com/sgi/olpc).

(c) Copyright 2009 Socialtext, Inc.

All Rights Reserved.

This product consists of components licensed under different licenses. Some are licensed under the Common Public Attribution License (CPAL) and others under the Artistic License 2.0. Check the contents of each file for a statement of the license for that file. Files without license information (e.g., image files) are licensed under the Artistic License 2.0. The source code comes with a LEGAL.txt file and a LICENSE.txt file. For more information, see the web page listed above.

The software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License.

The OLPC part of this project has been coordinated by Manusheel Gupta of OLPC with guidance from Walter Bender and others of OLPC.

The Python code for the OLPC XO-1 was initially coded by Luke Closs of Socialtext, Inc. and/or by K.S. Preeti (depending upon the version).

The JavaScript SocialCalc code was initially coded by Dan Bricklin of Software Garden, Inc., for Socialtext, Inc.

Based in part on the SocialCalc 1.1.0 code written in Perl.

The SocialCalc 1.1.0 code was:

Portions (c) Copyright 2005, 2006, 2007 Software Garden, Inc.The Perl SocialCalc started as modifications to the wikiCalc(R) program, version 1.0.

All Rights Reserved.

Portions (c) Copyright 2007 Socialtext, Inc.

All Rights Reserved.

wikiCalc 1.0 was written by Software Garden, Inc.

wikiCalc, Garden, and Software Garden are registered trademarks of Software Garden, Inc.

Socialtext, SocialCalc, and the Socialtext logo and Dreamcatcher are trademarks of Socialtext, Inc.

Dan Bricklin's is a registered trademark of Daniel Bricklin.